diff options
author | Keir Fraser <keir.fraser@citrix.com> | 2007-12-19 14:50:37 +0000 |
---|---|---|
committer | Keir Fraser <keir.fraser@citrix.com> | 2007-12-19 14:50:37 +0000 |
commit | add89911d28507257f2cbc22ab3cde1dd5278a77 (patch) | |
tree | cfd6c61165fa53a72a8f1e50cf191ec447af4a5f | |
parent | 25d73306ec0dc823fffcf4947e56e20159e6ead0 (diff) | |
download | xen-add89911d28507257f2cbc22ab3cde1dd5278a77.tar.gz xen-add89911d28507257f2cbc22ab3cde1dd5278a77.tar.bz2 xen-add89911d28507257f2cbc22ab3cde1dd5278a77.zip |
xend: Fix PCI Device Configuration
Xend doesn't correctly work after restart, when there is a domU which
owns a pci device (driver domain). This patch fixes the problem.
Signed-off-by: Yosuke Iwamatsu <y-iwamatsu@ab.jp.nec.com>
-rw-r--r-- | tools/python/xen/xend/XendConfig.py | 87 | ||||
-rw-r--r-- | tools/python/xen/xend/server/pciif.py | 4 |
2 files changed, 44 insertions, 47 deletions
diff --git a/tools/python/xen/xend/XendConfig.py b/tools/python/xen/xend/XendConfig.py index bdd8e6dff6..76f52b6e41 100644 --- a/tools/python/xen/xend/XendConfig.py +++ b/tools/python/xen/xend/XendConfig.py @@ -533,55 +533,13 @@ class XendConfig(dict): cfg['HVM_boot_policy'] = 'BIOS order' cfg['HVM_boot_params'] = { 'order' : boot_order } - # Parsing the device SXP's. In most cases, the SXP looks - # like this: - # - # [device, [vif, [mac, xx:xx:xx:xx:xx:xx], [ip 1.3.4.5]]] - # - # However, for PCI devices it looks like this: - # - # [device, [pci, [dev, [domain, 0], [bus, 0], [slot, 1]]]] - # - # It seems the reasoning for this difference is because - # pciif.py needs all the PCI device configurations at - # the same time when creating the devices. - # - # To further complicate matters, Xen 2.0 configuration format - # uses the following for pci device configuration: - # - # [device, [pci, [domain, 0], [bus, 0], [dev, 1], [func, 2]]] - # - # Hence we deal with pci device configurations outside of - # the regular device parsing. - + + # Parsing the device SXP's. cfg['devices'] = {} for dev in sxp.children(sxp_cfg, 'device'): config = sxp.child0(dev) dev_type = sxp.name(config) - dev_info = {} - - if dev_type == 'pci': - pci_devs_uuid = sxp.child_value(config, 'uuid', - uuid.createString()) - pci_devs = [] - for pci_dev in sxp.children(config, 'dev'): - pci_dev_info = {} - for opt_val in pci_dev[1:]: - try: - opt, val = opt_val - pci_dev_info[opt] = val - except TypeError: - pass - pci_devs.append(pci_dev_info) - - cfg['devices'][pci_devs_uuid] = (dev_type, - {'devs': pci_devs, - 'uuid': pci_devs_uuid}) - - log.debug("XendConfig: reading device: %s" % pci_devs) - else: - self.device_add(dev_type, cfg_sxp = config, target = cfg) - log.debug("XendConfig: reading device: %s" % scrub_password(dev_info)) + self.device_add(dev_type, cfg_sxp = config, target = cfg) # Extract missing data from configuration entries image_sxp = sxp.child_value(sxp_cfg, 'image', []) @@ -1096,6 +1054,44 @@ class XendConfig(dict): dev_type = sxp.name(config) dev_info = {} + # Parsing the device SXP's. In most cases, the SXP looks + # like this: + # + # [device, [vif, [mac, xx:xx:xx:xx:xx:xx], [ip 1.3.4.5]]] + # + # However, for PCI devices it looks like this: + # + # [device, [pci, [dev, [domain, 0], [bus, 0], [slot, 1]]]] + # + # It seems the reasoning for this difference is because + # pciif.py needs all the PCI device configurations at + # the same time when creating the devices. + # + # To further complicate matters, Xen 2.0 configuration format + # uses the following for pci device configuration: + # + # [device, [pci, [domain, 0], [bus, 0], [dev, 1], [func, 2]]] + + if dev_type == 'pci': + pci_devs_uuid = sxp.child_value(config, 'uuid', + uuid.createString()) + pci_devs = [] + for pci_dev in sxp.children(config, 'dev'): + pci_dev_info = {} + for opt_val in pci_dev[1:]: + try: + opt, val = opt_val + pci_dev_info[opt] = val + except TypeError: + pass + pci_devs.append(pci_dev_info) + target['devices'][pci_devs_uuid] = (dev_type, + {'devs': pci_devs, + 'uuid': pci_devs_uuid}) + + log.debug("XendConfig: reading device: %s" % pci_devs) + return pci_devs_uuid + for opt_val in config[1:]: try: opt, val = opt_val @@ -1177,6 +1173,7 @@ class XendConfig(dict): if dev_uuid not in target['console_refs']: target['console_refs'].append(dev_uuid) + log.debug("XendConfig: reading device: %s" % scrub_password(dev_info)) return dev_uuid if cfg_xenapi: diff --git a/tools/python/xen/xend/server/pciif.py b/tools/python/xen/xend/server/pciif.py index 1ec0f7f92c..91f83f20dd 100644 --- a/tools/python/xen/xend/server/pciif.py +++ b/tools/python/xen/xend/server/pciif.py @@ -102,13 +102,13 @@ class PciController(DevController): result['uuid'] = self.readBackend(devid, 'uuid') return result - def configuration(self, devid): + def configuration(self, devid, transaction = None): """Returns SXPR for devices on domain. @note: we treat this dict especially to convert to SXP because it is not a straight dict of strings.""" - configDict = self.getDeviceConfiguration(devid) + configDict = self.getDeviceConfiguration(devid, transaction) sxpr = [self.deviceClass] # remove devs |