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

Re: [Xen-devel] [PATCH] xen passthrough: fix recent regressions



On Tue, Nov 03, 2009 at 11:30:38AM +0000, Stefano Stabellini wrote:
> Hi all,
> this patch fixes the recent regressions pointed out by Dexuan, keeping
> pci passthrough working with stubdom too.
> In particular calling device_create when pci_state == 'Initialising' is
> a mistake because the state is always Initialising when attaching a
> devicem while device_create has too be called only when the pci backend
> is missing.
> 
> Signed-off-by: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx>
> 
> ---
> 
> 
> diff -r 47136dbb972d tools/python/xen/xend/XendDomainInfo.py
> --- a/tools/python/xen/xend/XendDomainInfo.py Wed Oct 28 10:59:55 2009 +0000
> +++ b/tools/python/xen/xend/XendDomainInfo.py Tue Nov 03 11:06:16 2009 +0000
> @@ -597,6 +597,7 @@
>              return
>  
>          devid = '0'
> +        first = True
>          dev_info = self._getDeviceInfo_pci(devid)
>          if dev_info is None:
>              return
> @@ -619,7 +620,8 @@
>              head_dev = dev.pop()
>              dev_sxp = pci_convert_dict_to_sxp(head_dev, 'Initialising',
>                                                'Booting')
> -            self.pci_device_configure(dev_sxp)
> +            self.pci_device_configure(dev_sxp, first_dev = first)
> +            first = False
>  
>              # That is all for single-function virtual devices
>              if len(dev) == 0:
> @@ -829,7 +831,7 @@
>          return self.getDeviceController(dev_type).sxpr(devid)
>  
>  
> -    def pci_device_configure(self, dev_sxp, devid = 0):
> +    def pci_device_configure(self, dev_sxp, devid = 0, first_dev = False):
>          """Configure an existing pci device.
>          
>          @param dev_sxp: device configuration
> @@ -859,13 +861,13 @@
>          dev = dev_config['devs'][0]
>  
>          stubdomid = self.getStubdomDomid()
> -        if stubdomid is not None :
> -            from xen.xend import XendDomain
> -            
> XendDomain.instance().domain_lookup(stubdomid).pci_device_configure(dev_sxp[:])
> -
>          # Do HVM specific processing
>          if self.info.is_hvm():
> +            from xen.xend import XendDomain

Could this import go at the top of the .py file?

>              if pci_state == 'Initialising':
> +                if stubdomid is not None :

Could the above two lines be the following?
It seems a bit clearer to me.

                if pci_state == 'Initialising' and stubdomid is not None:

> +                    
> XendDomain.instance().domain_lookup(stubdomid).pci_device_configure(dev_sxp[:])
> +
>                  # HVM PCI device attachment
>                  if pci_sub_state == 'Booting':
>                      vdevfn = self.hvm_pci_device_insert(dev_config)
> @@ -896,6 +898,8 @@
>                  # same vslot.
>                  if (PCI_FUNC(int(new_dev['vdevfn'], 16)) == 0):
>                      self.hvm_destroyPCIDevice(new_dev)
> +                if stubdomid is not None :
> +                    
> XendDomain.instance().domain_lookup(stubdomid).pci_device_configure(dev_sxp[:])
>                  # Update vdevfn
>                  dev['vdevfn'] = new_dev['vdevfn']
>                  for n in sxp.children(pci_dev):
> @@ -908,15 +912,22 @@
>                  self.pci_device_check_attachability(dev)
>  
>          # If pci platform does not exist, create and exit.
> -        if pci_state == 'Initialising' :
> +        if existing_dev_info is None :
>              self.device_create(dev_sxp)
> +            return True
> +
> +        if first_dev is True :
> +            existing_dev_uuid = sxp.child_value(existing_dev_info, 'uuid')
> +            existing_pci_conf = self.info['devices'][existing_dev_uuid][1]
> +            devid = self._createDevice('pci', existing_pci_conf)
> +            self.info['devices'][existing_dev_uuid][1]['devid'] = devid
>              return True

Is the logic immediately above present elsewhere?
If so could it be broken out into a function into a function and shared?

>          if self.domid is not None:
>              # use DevController.reconfigureDevice to change device config
>              dev_control = self.getDeviceController(dev_class)
>              dev_uuid = dev_control.reconfigureDevice(devid, dev_config)
> -            if not self.info.is_hvm():
> +            if not self.info.is_hvm() and not self.info.is_stubdom():
>                  # in PV case, wait until backend state becomes connected.
>                  dev_control.waitForDevice_reconfigure(devid)
>              num_devs = dev_control.cleanupDevice(devid)

_______________________________________________
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®.