IOMMU: Handle sibling device assignment correctly (re-send)
PATCH 2/2 IOMMU: Handle sibling device assignment correctly (re-send)
Signed-off-by Wei Wang <[email protected]>
Signature · 12 lines
AMD Saxony, Dresden, Germany Operating System Research Center Legal Information: AMD Saxony Limited Liability Company & Co. KG Sitz (Geschäftsanschrift): Wilschdorfer Landstr. 101, 01109 Dresden, Deutschland Registergericht Dresden: HRA 4896 vertretungsberechtigter Komplementär: AMD Saxony LLC (Sitz Wilmington, Delaware, USA) Geschäftsführer der AMD Saxony LLC: Dr. Hans-R. Deppe, Thomas McCoy
tools/libxc/xc_domain.c +31 -0
@@ -767,6 +767,37 @@ int xc_assign_device(return do_domctl (xc_handle, &domctl); } +int xc_get_device_group ( +int xc_handle, +uint32_t domid, +uint32_t machine_bdf, +uint32_t max_sdevs, +uint32_t *num_sdevs, +uint32_t *sdev_array) +{ +int rc; +DECLARE_DOMCTL ; + + domctl.cmd = XEN_DOMCTL_get_device_group; + domctl.domain = (domid_t )domid; + + domctl.u.get_device_group.machine_bdf = machine_bdf; + domctl.u.get_device_group.max_sdevs = max_sdevs; + +set_xen_guest_handle (domctl.u.get_device_group.sdev_array, sdev_array); + +if (lock_pages (sdev_array, max_sdevs *sizeof (*sdev_array)) !=0 ) + { +PERROR ("Could not lock memory for xc_get_device_group\n" ); +return -ENOMEM ; + } + rc =do_domctl (xc_handle, &domctl); +unlock_pages (sdev_array, max_sdevs *sizeof (*sdev_array)); + + *num_sdevs = domctl.u.get_device_group.num_sdevs; +return rc; +} + int xc_test_assign_device( int xc_handle, uint32_t domid,
tools/libxc/xenctrl.h +7 -0
@@ -955,6 +955,13 @@ int xc_assign_device(int xc_handle,uint32_t domid, uint32_t machine_bdf); +int xc_get_device_group (int xc_handle, +uint32_t domid, +uint32_t machine_bdf, +uint32_t max_sdevs, +uint32_t *num_sdevs, +uint32_t *sdev_array); +int xc_test_assign_device (int xc_handle,uint32_t domid,uint32_t machine_bdf);
tools/python/xen/lowlevel/xc/xc.c +73 -0
85 lines not on this page · raw message
tools/python/xen/xend/server/pciif.py +35 -0
@@ -226,6 +226,39 @@ class PciController(DevController): return sxpr + def CheckSiblingDevices(self, domid, dev): + """ Check if all sibling devices of dev are owned by pciback + """ + if not self.vm.info.is_hvm(): + return + + group_str = xc.get_device_group(domid, dev.domain, dev.bus, dev.slot, dev.func) + if group_str == "": + return + + #group string format xx:xx.x,xx:xx.x, + devstr_len = group_str.find(',') + for i in range(0, len(group_str), devstr_len + 1): + (bus, slotfunc) = group_str[i:i + devstr_len].split(':') + (slot, func) = slotfunc.split('.') + b = parse_hex(bus) + d = parse_hex(slot) + f = parse_hex(func) + try: + sdev = PciDevice(dev.domain, b, d, f) + except Exception, e: + #no dom0 drivers bound to sdev + continue + + if sdev.driver!='pciback': + raise VmError(("pci: PCI Backend does not own\n "+ \ + "sibling device %s of device %s\n"+ \ + "See the pciback.hide kernel "+ \ + "command-line parameter or\n"+ \ + "bind your slot/device to the PCI backend using sysfs" \ + )%(sdev.name, dev.name)) + return + def setupOneDevice(self, domain, bus, slot, func): """ Attach I/O resources for device to frontend domain """
@@ -244,6 +277,8 @@ class PciController(DevController): "command-line parameter or\n"+ \ "bind your slot/device to the PCI backend using sysfs" \ )%(dev.name)) + + self.CheckSiblingDevices(fe_domid, dev) PCIQuirk(dev.vendor, dev.device, dev.subvendor, dev.subdevice, domain, bus, slot, func)
_______________________________________________
Xen-devel mailing list
[email protected]
http://lists.xensource.com/xen-devel