WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

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

To: Jean Guyader <jean.guyader@xxxxxxxxxxxxx>, yuri.schaeffer@xxxxxx, allen.m.kay@xxxxxxxxx
Subject: Re: [Xen-devel] How to switch VGA passthrough live
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
Dkim-signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:received:in-reply-to :references:date:message-id:subject:from:to:cc:content-type :content-transfer-encoding; bh=TPQNYjHPhBGkhmazOldDJJiPglqC2pVxPwLRspu04k8=; b=saRFylEMjrjHoeXKfi5re1LWeNGJikFi4CJ2mHjerZXN0asPD/UJxBr/rs8nhbhZ5D K4xdc+fF6JlTAZLH0Up92eOZNL1jUZ8EGO+tw1xbejgZ+0SF0QHwQSbOAsfZrRq7WZpH NuODJWyYsUekqW33ppy+AV+AH4MWtLDxfuT2A=
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=
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
In-reply-to: <20100607091313.GA31058@xxxxxxxxxxxxxxxxx>
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
References: <AANLkTimlKc3IvjGo4p0C1vqqNFWcmD2k5mzLo7GDPMVf@xxxxxxxxxxxxxx> <20100605084314.GB16920@xxxxxxxxxxxxxxxxx> <AANLkTikw8sf6h3P21xD7Lj2Fc6AdzcOiPFZVm9gXdfhT@xxxxxxxxxxxxxx> <20100607091313.GA31058@xxxxxxxxxxxxxxxxx>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
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