[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] GPU passthrough issue when VM is configured with 4G memory




> -----Original Message-----
> From: dunlapg@xxxxxxxxx [mailto:dunlapg@xxxxxxxxx] On Behalf Of George
> Dunlap
> Sent: 2013å4æ25æ 18:29
> To: Hanweidong
> Cc: Stefano Stabellini; xudong.hao@xxxxxxxxx; Yanqiangjun; Luonengjun;
> Wangzhenguo; Yangxiaowei; Gonglei (Arei); Anthony Perard; xen-
> devel@xxxxxxxxxxxxx; xiantao.zhang@xxxxxxxxx
> Subject: Re: [Xen-devel] GPU passthrough issue when VM is configured
> with 4G memory
> 
> On Thu, Apr 25, 2013 at 4:46 AM, Hanweidong <hanweidong@xxxxxxxxxx>
> wrote:
> >
> >
> >> -----Original Message-----
> >> From: xen-devel-bounces@xxxxxxxxxxxxx [mailto:xen-devel-
> >> bounces@xxxxxxxxxxxxx] On Behalf Of Hanweidong
> >> Sent: 2013å3æ26æ 17:38
> >> To: Stefano Stabellini
> >> Cc: George Dunlap; xudong.hao@xxxxxxxxx; Yanqiangjun; Luonengjun;
> >> Wangzhenguo; Yangxiaowei; Gonglei (Arei); Anthony Perard; xen-
> >> devel@xxxxxxxxxxxxx; xiantao.zhang@xxxxxxxxx
> >> Subject: Re: [Xen-devel] GPU passthrough issue when VM is configured
> >> with 4G memory
> >>
> >>
> >> > -----Original Message-----
> >> > From: Stefano Stabellini [mailto:stefano.stabellini@xxxxxxxxxxxxx]
> >> > Sent: 2013å3æ18æ 20:02
> >> > To: Hanweidong
> >> > Cc: George Dunlap; Stefano Stabellini; Yanqiangjun; Luonengjun;
> >> > Wangzhenguo; Yangxiaowei; Gonglei (Arei); Anthony Perard; xen-
> >> > devel@xxxxxxxxxxxxx; xudong.hao@xxxxxxxxx; xiantao.zhang@xxxxxxxxx
> >> > Subject: RE: [Xen-devel] GPU passthrough issue when VM is
> configured
> >> > with 4G memory
> >> >
> >> > On Wed, 13 Mar 2013, Hanweidong wrote:
> >> > > MMIO HOLE was adjusted to e0000000 - fc000000. But QEMU uses
> below
> >> > code to init
> >> > > RAM in xen_ram_init:
> >> > >
> >> > >     ...
> >> > >     block_len = ram_size;
> >> > >     if (ram_size >= HVM_BELOW_4G_RAM_END) {
> >> > >         /* Xen does not allocate the memory continuously, and
> keep
> >> a
> >> > hole at
> >> > >          * HVM_BELOW_4G_MMIO_START of HVM_BELOW_4G_MMIO_LENGTH
> >> > >          */
> >> > >         block_len += HVM_BELOW_4G_MMIO_LENGTH;
> >> > >     }
> >> > >     memory_region_init_ram(&ram_memory, "xen.ram", block_len);
> >> > >     vmstate_register_ram_global(&ram_memory);
> >> > >
> >> > >     if (ram_size >= HVM_BELOW_4G_RAM_END) {
> >> > >         above_4g_mem_size = ram_size - HVM_BELOW_4G_RAM_END;
> >> > >         below_4g_mem_size = HVM_BELOW_4G_RAM_END;
> >> > >     } else {
> >> > >         below_4g_mem_size = ram_size;
> >> > >     }
> >> > >     ...
> >> > >
> >> > > HVM_BELOW_4G_RAM_END is f0000000. If we change
> HVM_BELOW_4G_RAM_END
> >> > to e0000000,
> >> > > Which it's consistent with hvmloader when assigning a GPU, and
> then
> >> > guest worked
> >> > > for us. So we wondering that xen_ram_init in QEMU should be
> >> > consistent with
> >> > > hvmloader.
> >> > >
> >> > > In addition, we found QEMU uses hardcode 0xe0000000 in pc_init1()
> >> as
> >> > below.
> >> > > Should keep these places handle the consistent mmio hole or not?
> >> > >
> >> > >     if (ram_size >= 0xe0000000 ) {
> >> > >         above_4g_mem_size = ram_size - 0xe0000000;
> >> > >         below_4g_mem_size = 0xe0000000;
> >> > >     } else {
> >> > >         above_4g_mem_size = 0;
> >> > >         below_4g_mem_size = ram_size;
> >> > >     }
> >> >
> >> > The guys at Intel sent a couple of patches recently to fix this
> issue:
> >> >
> >> > http://marc.info/?l=xen-devel&m=136150317011027
> >> > http://marc.info/?l=qemu-devel&m=136177475215360&w=2
> >> >
> >> > Do they solve your problem?
> >>
> >> These two patches didn't solve our problem.
> >>
> >
> > I debugged this issue with above two patches. I want to share some
> information and discuss solution here. This issue is actually caused by
> that a VM has a large pci hole (mmio size) which results in QEMU sets
> memory regions inconsistently with hvmloader (QEMU uses hardcode
> 0xe0000000 in pc_init1 and xen_ram_init). I created a virtual device
> with 1GB mmio size to debug this issue. Firstly, QEMU set memory
> regions except pci hole region in pc_init1() and xen_ram_init(), then
> hvmloader calculated pci_mem_start as 0x80000000, and wrote it to TOM
> register, which triggered QEMU to update pci hole region with
> 0x80000000 using i440fx_update_pci_mem_hole(). Finally the windows 7 VM
> (configured 8G) crashed with BSOD code 0x00000024. If I hardcode in
> QEMU pc_init1 and xen_ram_init to match hvmloader's. Then the problem
> was gone.
> >
> > Althrough above two patches will pass actual pci hole start address
> to QEMU, but it's too late, QEMU pc_init1() and xen_ram_init() already
> set the other memory regions, and obviously the pci hole might overlap
> with ram regions in this case. So I think hvmloader should setup pci
> devices and calculate pci hole first, then QEMU can map memory regions
> correctly from the beginning.
> 
> So just to check to make sure I understand correctly: the problem is
> that qemu has mapped the guests' pages before the memory hole is made
> larger?
> 

Yes. 

> In that case, wouldn't it make sense to flush qemu's mapcache whenever
> the memory layout changes?  Such a thing should be possible now, e.g.,
> when doing ballooning, right?
> 

Good point. Will have a try.

weidong


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.