Stefano Stabellini
2009-Oct-20 15:17 UTC
[Xen-devel] [PATCH] implement pci coldplug for stubdoms
Hi all, this patch fixes the circular dependency problem in the toolstack that prevented pci coldplug from working with stubdoms: after creating the stubdom we wait for it to be properly initialized before going further. We release the domain lock while we wait. Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com> --- diff -r 1355ca322c38 tools/python/xen/xend/XendDomainInfo.py --- a/tools/python/xen/xend/XendDomainInfo.py Wed Oct 14 16:43:22 2009 +0100 +++ b/tools/python/xen/xend/XendDomainInfo.py Tue Oct 20 15:48:39 2009 +0100 @@ -687,7 +687,7 @@ # Test whether the devices can be assigned pci_name = pci_dict_to_bdf_str(new_dev) - _all_assigned_pci_devices = get_all_assigned_pci_devices() + _all_assigned_pci_devices = get_all_assigned_pci_devices(self.domid) if pci_name in _all_assigned_pci_devices: raise VmError("failed to assign device %s that has" " already been assigned to other domain." % pci_name) @@ -905,7 +905,7 @@ self.pci_device_check_attachability(dev) # If pci platform does not exist, create and exit. - if existing_dev_info is None: + if pci_state == ''Initialising'' : self.device_create(dev_sxp) return True @@ -2252,11 +2253,12 @@ if devclass in XendDevices.valid_devices() and devclass != ''vscsi'': log.info("createDevice: %s : %s" % (devclass, scrub_password(config))) dev_uuid = config.get(''uuid'') - devid = self._createDevice(devclass, config) - - # store devid in XendConfig for caching reasons - if dev_uuid in self.info[''devices'']: - self.info[''devices''][dev_uuid][1][''devid''] = devid + if devclass != ''pci'' or not self.info.is_hvm() : + devid = self._createDevice(devclass, config) + + # store devid in XendConfig for caching reasons + if dev_uuid in self.info[''devices'']: + self.info[''devices''][dev_uuid][1][''devid''] = devid elif devclass == ''vscsi'': vscsi_config = config.get(''devs'', [])[0] diff -r 1355ca322c38 tools/python/xen/xend/image.py --- a/tools/python/xen/xend/image.py Wed Oct 14 16:43:22 2009 +0100 +++ b/tools/python/xen/xend/image.py Tue Oct 20 15:48:39 2009 +0100 @@ -460,6 +460,27 @@ # we would very much prefer not to have a thread here and instead # have a callback but sadly we don''t have Twisted in xend self.sentinel_thread = thread.start_new_thread(self._sentinel_watch,()) + if self.device_model.find(''stubdom-dm'') > -1 : + from xen.xend import XendDomain + domains = XendDomain.instance() + domains.domains_lock.release() + + count = 0 + while True: + orig_state = xstransact.Read("/local/domain/0/device-model/%i/state" + % self.vm.getDomid()) + # This can occur right after start-up + if orig_state != None: + break + + log.debug(''createDeviceModel %i: orig_state is None, retrying'' % self.vm.getDomid()) + + time.sleep(0.1) + count += 1 + if count < 100: + continue + + domains.domains_lock.acquire() def signalDeviceModel(self, cmd, ret, par = None): if self.device_model is None: diff -r 1355ca322c38 tools/python/xen/xend/server/pciif.py --- a/tools/python/xen/xend/server/pciif.py Wed Oct 14 16:43:22 2009 +0100 +++ b/tools/python/xen/xend/server/pciif.py Tue Oct 20 15:48:39 2009 +0100 @@ -73,11 +73,16 @@ dev_str_list = dev_str_list + [dev_str] return dev_str_list -def get_all_assigned_pci_devices(): +def get_all_assigned_pci_devices(domid = 0): dom_list = xstransact.List(''/local/domain'') pci_str_list = [] + ti = 0 + ts = xstransact.Read(''/local/domain/'' + str(domid) + ''/target'') + if ts is not None : + ti = int(ts) for d in dom_list: - if xstransact.Read(''/local/domain/'' + d + ''/target'') is None : + target = xstransact.Read(''/local/domain/'' + d + ''/target'') + if int(d) is not ti and target is None : pci_str_list = pci_str_list + get_assigned_pci_devices(int(d)) return pci_str_list _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Kay, Allen M
2009-Oct-29 00:38 UTC
RE: [Xen-devel] [PATCH] implement pci coldplug for stubdoms
Stefano, Have you tested multiple PCI passthrough with this patch? When I tried to passthrough multiple PCI devices to a HVM domain, I got "Device 0 is already connected" error. I don''t get this error with cs#20347. Allen -----Original Message----- From: xen-devel-bounces@lists.xensource.com [mailto:xen-devel-bounces@lists.xensource.com] On Behalf Of Stefano Stabellini Sent: Tuesday, October 20, 2009 8:18 AM To: xen-devel@lists.xensource.com Subject: [Xen-devel] [PATCH] implement pci coldplug for stubdoms Hi all, this patch fixes the circular dependency problem in the toolstack that prevented pci coldplug from working with stubdoms: after creating the stubdom we wait for it to be properly initialized before going further. We release the domain lock while we wait. Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com> --- diff -r 1355ca322c38 tools/python/xen/xend/XendDomainInfo.py --- a/tools/python/xen/xend/XendDomainInfo.py Wed Oct 14 16:43:22 2009 +0100 +++ b/tools/python/xen/xend/XendDomainInfo.py Tue Oct 20 15:48:39 2009 +0100 @@ -687,7 +687,7 @@ # Test whether the devices can be assigned pci_name = pci_dict_to_bdf_str(new_dev) - _all_assigned_pci_devices = get_all_assigned_pci_devices() + _all_assigned_pci_devices = get_all_assigned_pci_devices(self.domid) if pci_name in _all_assigned_pci_devices: raise VmError("failed to assign device %s that has" " already been assigned to other domain." % pci_name) @@ -905,7 +905,7 @@ self.pci_device_check_attachability(dev) # If pci platform does not exist, create and exit. - if existing_dev_info is None: + if pci_state == ''Initialising'' : self.device_create(dev_sxp) return True @@ -2252,11 +2253,12 @@ if devclass in XendDevices.valid_devices() and devclass != ''vscsi'': log.info("createDevice: %s : %s" % (devclass, scrub_password(config))) dev_uuid = config.get(''uuid'') - devid = self._createDevice(devclass, config) - - # store devid in XendConfig for caching reasons - if dev_uuid in self.info[''devices'']: - self.info[''devices''][dev_uuid][1][''devid''] = devid + if devclass != ''pci'' or not self.info.is_hvm() : + devid = self._createDevice(devclass, config) + + # store devid in XendConfig for caching reasons + if dev_uuid in self.info[''devices'']: + self.info[''devices''][dev_uuid][1][''devid''] = devid elif devclass == ''vscsi'': vscsi_config = config.get(''devs'', [])[0] diff -r 1355ca322c38 tools/python/xen/xend/image.py --- a/tools/python/xen/xend/image.py Wed Oct 14 16:43:22 2009 +0100 +++ b/tools/python/xen/xend/image.py Tue Oct 20 15:48:39 2009 +0100 @@ -460,6 +460,27 @@ # we would very much prefer not to have a thread here and instead # have a callback but sadly we don''t have Twisted in xend self.sentinel_thread = thread.start_new_thread(self._sentinel_watch,()) + if self.device_model.find(''stubdom-dm'') > -1 : + from xen.xend import XendDomain + domains = XendDomain.instance() + domains.domains_lock.release() + + count = 0 + while True: + orig_state = xstransact.Read("/local/domain/0/device-model/%i/state" + % self.vm.getDomid()) + # This can occur right after start-up + if orig_state != None: + break + + log.debug(''createDeviceModel %i: orig_state is None, retrying'' % self.vm.getDomid()) + + time.sleep(0.1) + count += 1 + if count < 100: + continue + + domains.domains_lock.acquire() def signalDeviceModel(self, cmd, ret, par = None): if self.device_model is None: diff -r 1355ca322c38 tools/python/xen/xend/server/pciif.py --- a/tools/python/xen/xend/server/pciif.py Wed Oct 14 16:43:22 2009 +0100 +++ b/tools/python/xen/xend/server/pciif.py Tue Oct 20 15:48:39 2009 +0100 @@ -73,11 +73,16 @@ dev_str_list = dev_str_list + [dev_str] return dev_str_list -def get_all_assigned_pci_devices(): +def get_all_assigned_pci_devices(domid = 0): dom_list = xstransact.List(''/local/domain'') pci_str_list = [] + ti = 0 + ts = xstransact.Read(''/local/domain/'' + str(domid) + ''/target'') + if ts is not None : + ti = int(ts) for d in dom_list: - if xstransact.Read(''/local/domain/'' + d + ''/target'') is None : + target = xstransact.Read(''/local/domain/'' + d + ''/target'') + if int(d) is not ti and target is None : pci_str_list = pci_str_list + get_assigned_pci_devices(int(d)) return pci_str_list _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel