aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKeir Fraser <keir.fraser@citrix.com>2008-07-28 11:28:45 +0100
committerKeir Fraser <keir.fraser@citrix.com>2008-07-28 11:28:45 +0100
commit3c456fd6282f0fd9fe182b7fdf9eca2a6032c8d2 (patch)
tree4f95c08b865e636a45473fb80300009c61af0c77
parenta7d269709247be0e0e6b29bcacf0e2b7efc5206d (diff)
downloadxen-3c456fd6282f0fd9fe182b7fdf9eca2a6032c8d2.tar.gz
xen-3c456fd6282f0fd9fe182b7fdf9eca2a6032c8d2.tar.bz2
xen-3c456fd6282f0fd9fe182b7fdf9eca2a6032c8d2.zip
xend, pci passthru: Relax the requirement of co-assignment.
Certain PCI or PCIe devices needs to be co-assigned. Currently we require all the related devices be assigned to the same guest. This can be relaxed to: part of them can be assgined to the same guest, and after that, the left ones can't be assigned. Signed-off-by: Dexuan Cui <dexuan.cui@intel.com>
-rw-r--r--tools/python/xen/util/pci.py2
-rw-r--r--tools/python/xen/xend/server/pciif.py20
2 files changed, 17 insertions, 5 deletions
diff --git a/tools/python/xen/util/pci.py b/tools/python/xen/util/pci.py
index 42a0f81d8a..1985a133ae 100644
--- a/tools/python/xen/util/pci.py
+++ b/tools/python/xen/util/pci.py
@@ -105,7 +105,7 @@ def parse_hex(val):
return None
def parse_pci_name(pci_name_string):
- # Format: xxxx:xx:xx:x
+ # Format: xxxx:xx:xx.x
s = pci_name_string
s = s.split(':')
dom = parse_hex(s[0])
diff --git a/tools/python/xen/xend/server/pciif.py b/tools/python/xen/xend/server/pciif.py
index 9946377d9f..da115679a7 100644
--- a/tools/python/xen/xend/server/pciif.py
+++ b/tools/python/xen/xend/server/pciif.py
@@ -378,8 +378,14 @@ class PciController(DevController):
funcs = dev.find_all_the_multi_functions()
for f in funcs:
if not f in pci_str_list:
- err_msg = 'pci: % must be co-assigned to guest with %s'
- raise VmError(err_msg % (f, dev.name))
+ (f_dom, f_bus, f_slot, f_func) = parse_pci_name(f)
+ f_pci_str = '0x%x,0x%x,0x%x,0x%x' % \
+ (f_dom, f_bus, f_slot, f_func)
+ # f has been assigned to other guest?
+ if xc.test_assign_device(0, f_pci_str) != 0:
+ err_msg = 'pci: %s must be co-assigned to the' + \
+ ' same guest with %s'
+ raise VmError(err_msg % (f, dev.name))
elif dev.dev_type == DEV_TYPE_PCI:
if dev.bus == 0:
if not dev.pci_af_flr:
@@ -395,8 +401,14 @@ class PciController(DevController):
for s in devs_str:
if not s in pci_str_list:
- err_msg = 'pci: %s must be co-assigned to guest with %s'
- raise VmError(err_msg % (s, dev.name))
+ (s_dom, s_bus, s_slot, s_func) = parse_pci_name(s)
+ s_pci_str = '0x%x,0x%x,0x%x,0x%x' % \
+ (s_dom, s_bus, s_slot, s_func)
+ # s has been assigned to other guest?
+ if xc.test_assign_device(0, s_pci_str) != 0:
+ err_msg = 'pci: %s must be co-assigned to the'+\
+ ' same guest with %s'
+ raise VmError(err_msg % (s, dev.name))
for (domain, bus, slot, func) in pci_dev_list:
self.setupOneDevice(domain, bus, slot, func)