aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKeir Fraser <keir.fraser@citrix.com>2007-12-19 14:50:37 +0000
committerKeir Fraser <keir.fraser@citrix.com>2007-12-19 14:50:37 +0000
commitadd89911d28507257f2cbc22ab3cde1dd5278a77 (patch)
treecfd6c61165fa53a72a8f1e50cf191ec447af4a5f
parent25d73306ec0dc823fffcf4947e56e20159e6ead0 (diff)
downloadxen-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.py87
-rw-r--r--tools/python/xen/xend/server/pciif.py4
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