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

Re: [Xen-devel] How to switch VGA passthrough live


  • To: Jean Guyader <jean.guyader@xxxxxxxxxxxxx>, yuri.schaeffer@xxxxxx, allen.m.kay@xxxxxxxxx
  • From: 于佳耕 <yujiageng734@xxxxxxxxx>
  • Date: Tue, 8 Jun 2010 11:18:56 +0800
  • Cc: xen-devel@xxxxxxxxxxxxxxxxxxx
  • Delivery-date: Mon, 07 Jun 2010 20:19:42 -0700
  • Domainkey-signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type:content-transfer-encoding; b=an8JuMnQ/3tRSFX69J9qk1HzC4LN8HHIcrUzSgk0JhIGpZ9doynK6UH3Nvt2uhIk5O EtfLF4Gp+0pO563zntpO6iBG6+Bp6pvBlUDfDqdAdoXbgrikrSvNCsYcWsHljY1zb7hL r2sW0fboy7N/9/C49dTrKXpeOBcaqNX/ktNFI=
  • List-id: Xen developer discussion <xen-devel.lists.xensource.com>

Thanks for your reminding.

This method will pass sci interrupt and straightly invoke
power_off_php_devfn function. It solves two problems:

1.       Detach VGA passthrough device from HVM-1
2.       Assign VGA passthrough device to a new HVM-2 during its
creating process

The limit of this method is that we cannot assign VGA dev back to HVM-1.

I did some research and tried to find the reason.

When unregistering a real device at power_off_php_devfn function, all
the mmio/pio maps and irqs related to the dev are destroyed. The
output of Xen is as below:

Xm pci-detach 00:00:02.0
(XEN) domctl.c:1001:d0 memory_map:remove: gfn=f1000 mfn=fe800 nr_mfns=400
(XEN) domctl.c:1001:d0 memory_map:remove: gfn=e0000 mfn=d0000 nr_mfns=10000
(XEN) domctl.c:1071:d0 ioport_map:remove f_gport=c2d0 f_mport=ec90 np=8
(XEN) domctl.c:1071:d0 ioport_map:remove f_gport=3b0 f_mport=3b0 np=c
(XEN) domctl.c:1071:d0 ioport_map:remove f_gport=3c0 f_mport=3c0 np=20
(XEN) domctl.c:1001:d0 memory_map:remove: gfn=a0 mfn=a0 nr_mfns=20

On the contrary, if we register a new VGA device using
power_on_php_devfn function, the output of Xen is:

Xm pci-attach 00:00:02.0
(XEN) domctl.c:1047:d0 ioport_map:add f_gport=3b0 f_mport=3b0 np=c
(XEN) domctl.c:1047:d0 ioport_map:add f_gport=3c0 f_mport=3c0 np=20
(XEN) domctl.c:991:d0 memory_map:add: gfn=a0 mfn=a0 nr_mfns=20

In conclusion, part of VGA initial work has done during video BIOS
staring. Only invoking power_on_php_devfn function cannot rebuild full
context of VGA dev.

I also trace power_off_php_devfn function, and find that the screen
will be shutdown as long as invoking pci_hide_device. Could anybody
know why? Maybe we can implement pci_unhide_device function to switch
passthrough dev between HVM domains.

Thanks & Regards
Yujiageng



2010/6/7 Jean Guyader <jean.guyader@xxxxxxxxxxxxx>
>
> Here is a patch for xen-4 (ioemu).
>
> Jean
>
> P.S.: Please don't forget to CC the mailing list when you reply.
> Your messages could be useful for other people. Thanks.
>
> ---
>
> diff --git a/xen-vl-extra.c b/xen-vl-extra.c
> index 206ac65..bafc5a4 100644
> --- a/xen-vl-extra.c
> +++ b/xen-vl-extra.c
> @@ -111,13 +111,18 @@ void do_pci_del(char *devname)
>
>     devfn = bdf_to_devfn(devname);
>
> -    if (devfn < 0)
> +    if (devfn < 0 && devfn == 0x10)
>         fprintf(logfile, "Device \"%s\" is not used by a hotplug device.\n",
>                 devname_cpy);
>     else
>         acpi_php_del(devfn);
>
>     free(devname_cpy);
> +    if (devfn == 0x10)
> +    {
> +        power_off_php_devfn(devfn);
> +        xenstore_record_dm_state("pci-removed");
> +    }
>  }
>
>  void do_pci_add(char *devname)
>
> On Mon, Jun 07, 2010 at 02:54:00AM +0100, 于佳耕 wrote:
> >
> > It seems a complex work. Could you give the old patch, and I try to port it 
> > on Xen4.0.
> >
> > 2010/6/5 Jean Guyader 
> > <jean.guyader@xxxxxxxxxxxxx<mailto:jean.guyader@xxxxxxxxxxxxx>>
> >
> > Hi,
> >
> > I tried that in the past and is was working fine but you have to put the
> > guest into S3 (acpi suspend to RAM) first, then we don't have to wait for
> > any ACPI hotplug ack (you could remove some code in qemu for that).
> >
> > Jean
> >
> > On Fri, Jun 04, 2010 at 10:29:43AM +0100, 于佳耕 wrote:
> > > Hi,
> > >
> > > I want to switch video card live between two HVMs. My simplest idea is 
> > > that when the HVM has the permission to access passthrough video card, 
> > > and another HVM will be paused. If switch from A to B, execute commands :
> > >
> > > xm pause A ;
> > > xm pci-detach A  00:00:02.0 ;
> > > xm pci-attach B 00:00:02.0 ;
> > > xm unpause B.
> > >
> > > I have a try, but failed. The pseudo-code is as below. Can you give me 
> > > some ideas? Any suggestions will be thankful.
> > >
> > > Execute "xm pci-detach Domain 00:00:02.0":
> > >
> > > 1.       Raise sci interrupt to unplug the device. If OSPM doesn't handle 
> > > the unplug process, and then invoke acpi_php_writeb to power off the 
> > > device.
> > >
> > > 2.       Modify power_off_php_devfn function:
> > > int power_off_php_devfn(int php_devfn)
> > > {
> > >                     If(php_devfn == 0x10)  // Intel integrated graphics
> > >                     {
> > >                              p = & dpci_infos.php_devs[php_devfn];
> > >
> > >        // save the two-tuples : (php_dev, domid)
> > >        save_php_device_by_domid(p,domid);
> > >
> > >        // hide the device from bus and dpci_infos
> > >                              pci_hide_device(& p->pt_dev->dev);
> > >                              memset(p,0x00,sizeof(struct php_dev));
> > >
> > >                              return 0;
> > >                     }
> > >
> > >     return unregister_real_device(php_devfn);
> > >
> > > }
> > >
> > > Execute "xm pci-attach Domain 00:00:02.0":
> > >
> > > 1.       Modify power_on_php_devfn function:
> > >
> > > int power_off_php_devfn(int devfn)
> > >
> > > {
> > >
> > >            ....
> > >
> > >            while(devfn == 0x10) // Intel integrated graphics
> > >
> > >            {
> > >
> > >                     if( ! get_php_device_by_domid(p,domid) ) // get saved 
> > > php_dev struct
> > >
> > >                              break;                                     
> > > // cannot get , create new one
> > >
> > >
> > >
> > >                     //restore the php device to bus and dpci_infos
> > >
> > >                     restore_php_device(p,devfn);         // restore 
> > > dpci_infos.php_devs[devfn]
> > >
> > >                     dpci_infos->e_bus->devices[devfn] = p-> pt_dev->dev;
> > >
> > >
> > >
> > >                     return 0;
> > >
> > >            }
> > >
> > >
> > >
> > >            if (!dpci_infos.pci_access)
> > >
> > >            {...}
> > >
> > >            pt_dev = register_real_device(..);
> > >
> > >   return 0;
> > >
> > > }
> > >
> > > This plan hides the VGA device from HVM and never destroys it. Both mmio 
> > > and pio maps are reserved. When finishing "xm unpause B", it seems 
> > > working well observed by Dom0 serial port login. But the screen is black 
> > > and cannot receive any signal. I am confusing. Video BIOS should be 
> > > reloaded? Or need raise some interrupt to flush screen?
> > >
> > >
> > > Thanks & Regards,
> > > Yujiageng
> >
> > > _______________________________________________
> > > Xen-devel mailing list
> > > Xen-devel@xxxxxxxxxxxxxxxxxxx<mailto:Xen-devel@xxxxxxxxxxxxxxxxxxx>
> > > http://lists.xensource.com/xen-devel
> >
> >

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

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