Simon Horman
2009-Jun-16 13:00 UTC
[Xen-devel] [patch 0/8] xend: pass-through: various clean-ups and infrastructure: take ii
This series of patches cleans up various aspects of the PCI pass-through code. This is working towards multi-function pass-through devices in guests. But most of these changes are useful in their own right, so I am posting this batch without the rest of the multi-function changes. This is a repost of 8 patches from an previous series of 16, as these patches needed to be up-ported. The remaining patches from the previous series have already been applied. _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Simon Horman
2009-Jun-16 13:00 UTC
[Xen-devel] [patch 1/8] xend: pass-through: Common parse_pci_name()
Share some parsing code between different parts of xm. This has the side-effect that the device specification for hot-plug may now include the VSLOT and OPTS as per device specifictions in the domain configuration file. SEQ:BUS:DEV.FUNC[,OPT...] e.g. 0000:00:01.00@6 Cc: Dexuan Cui <dexuan.cui@intel.com> Cc: Masaki Kanno <kanno.masaki@jp.fujitsu.com> Cc: Akio Takebe <takebe_akio@jp.fujitsu.com> Signed-off-by: Simon Horman <horms@verge.net.au> --- Wed, 20 May 2009 23:07:42 +1000 * Fix syntax errors in parse_pci_name() and parse_pci_name_bdf6() - unnoticed as they were resolved by the subsequent patch "xm: Allow multi-function device specifications to be parsed * Enhanced error reporting in parse_pci_name() * Have parse_pci_name_bdf6() return an int rather than a string for vslot in keeping with the other integer elements of the bdf6 tuple Fri, 22 May 2009 15:52:50 +1000 * Consolidate get_all_pci_bdf6() and get_all_pci_devices() Thu, 28 May 2009 23:56:14 +1000 * Up-port Tue, 16 Jun 2009 18:37:05 +1000 * In find_parent(), dev[''dom''] should be dev[''domain'']. Pointed out by Takebe-san. Tue, 16 Jun 2009 22:53:18 +1000 * Up-port to xen-unstable.hg 19763 Index: xen-unstable.hg/tools/python/xen/util/pci.py ==================================================================--- xen-unstable.hg.orig/tools/python/xen/util/pci.py 2009-06-16 22:48:34.000000000 +1000 +++ xen-unstable.hg/tools/python/xen/util/pci.py 2009-06-16 22:49:32.000000000 +1000 @@ -15,6 +15,7 @@ import time import threading from xen.util import utils from xen.xend import sxp +from xen.xend.XendConstants import AUTO_PHP_SLOT PROC_PCI_PATH = ''/proc/bus/pci/devices'' PROC_PCI_NUM_RESOURCES = 7 @@ -35,7 +36,6 @@ LSPCI_CMD = ''lspci'' PCI_DEV_REG_EXPRESS_STR = r"[0-9a-fA-F]{4}:[0-9a-fA-F]{2}:[0-9a-fA-F]{2}."+ \ r"[0-9a-fA-F]{1}" -PCI_DEV_FORMAT_STR = ''%04x:%02x:%02x.%01x'' DEV_TYPE_PCIe_ENDPOINT = 0 DEV_TYPE_PCIe_BRIDGE = 1 @@ -148,22 +148,62 @@ def parse_hex(val): except ValueError: return None +def parse_pci_name_extended(pci_dev_str): + pci_match = re.match(r"((?P<domain>[0-9a-fA-F]{1,4})[:,])?" + + r"(?P<bus>[0-9a-fA-F]{1,2})[:,]" + + r"(?P<slot>[0-9a-fA-F]{1,2})[.,]" + + r"(?P<func>(\*|[0-7]))" + + r"(@(?P<vslot>[01]?[0-9a-fA-F]))?" + + r"(,(?P<opts>.*))?$", pci_dev_str) + + if pci_match == None: + raise PciDeviceParseError("Failed to parse pci device: %s" % + pci_dev_str) + + out = {} + pci_dev_info = pci_match.groupdict('''') + if pci_dev_info[''domain''] == '''': + domain = 0 + else: + domain = int(pci_dev_info[''domain''], 16) + out[''domain''] = "0x%04x" % domain + out[''bus''] = "0x%02x" % int(pci_dev_info[''bus''], 16) + out[''slot''] = "0x%02x" % int(pci_dev_info[''slot''], 16) + out[''func''] = "0x%x" % int(pci_dev_info[''func''], 16) + if pci_dev_info[''vslot''] == '''': + vslot = AUTO_PHP_SLOT + else: + vslot = int(pci_dev_info[''vslot''], 16) + out[''vslot''] = "0x%02x" % vslot + if pci_dev_info[''opts''] != '''': + out[''opts''] = split_pci_opts(pci_dev_info[''opts'']) + check_pci_opts(out[''opts'']) + + return out + def parse_pci_name(pci_name_string): - pci_match = re.match(r"((?P<domain>[0-9a-fA-F]{1,4})[:,])?" + \ - r"(?P<bus>[0-9a-fA-F]{1,2})[:,]" + \ - r"(?P<slot>[0-9a-fA-F]{1,2})[.,]" + \ - r"(?P<func>[0-7])$", pci_name_string) - if pci_match is None: - raise PciDeviceParseError((''Failed to parse pci device name: %s'' % - pci_name_string)) - pci_dev_info = pci_match.groupdict(''0'') - - domain = parse_hex(pci_dev_info[''domain'']) - bus = parse_hex(pci_dev_info[''bus'']) - slot = parse_hex(pci_dev_info[''slot'']) - func = parse_hex(pci_dev_info[''func'']) + pci = parse_pci_name_extended(pci_name_string) + + if int(pci[''vslot''], 16) != AUTO_PHP_SLOT: + raise PciDeviceParseError(("Failed to parse pci device: %s: " + + "vslot provided where prohibited: %s") % + (pci_name_string, pci[''vslot''])) + if ''opts'' in pci: + raise PciDeviceParseError(("Failed to parse pci device: %s: " + + "options provided where prohibited: %s") % + (pci_name_string, pci[''opts''])) + + return pci + +def __pci_dict_to_fmt_str(fmt, dev): + return fmt % (int(dev[''domain''], 16), int(dev[''bus''], 16), + int(dev[''slot''], 16), int(dev[''func''], 16)) - return (domain, bus, slot, func) +def pci_dict_to_bdf_str(dev): + return __pci_dict_to_fmt_str(''%04x:%02x:%02x.%01x'', dev) + +def pci_dict_to_xc_str(dev): + return __pci_dict_to_fmt_str(''0x%x, 0x%x, 0x%x, 0x%x'', dev) def extract_the_exact_pci_names(pci_names): result = [] @@ -198,27 +238,7 @@ def get_all_pci_names(): return pci_names def get_all_pci_devices(): - pci_devs = [] - for pci_name in get_all_pci_names(): - pci_match = re.match(r"((?P<domain>[0-9a-fA-F]{1,4})[:,])?" + \ - r"(?P<bus>[0-9a-fA-F]{1,2})[:,]" + \ - r"(?P<slot>[0-9a-fA-F]{1,2})[.,]" + \ - r"(?P<func>[0-7])$", pci_name) - if pci_match is None: - raise PciDeviceParseError((''Failed to parse pci device name: %s'' % - pci_name)) - pci_dev_info = pci_match.groupdict(''0'') - domain = parse_hex(pci_dev_info[''domain'']) - bus = parse_hex(pci_dev_info[''bus'']) - slot = parse_hex(pci_dev_info[''slot'']) - func = parse_hex(pci_dev_info[''func'']) - try: - pci_dev = PciDevice(domain, bus, slot, func) - except: - continue - pci_devs.append(pci_dev) - - return pci_devs + return map(PciDevice, map(parse_pci_name, get_all_pci_names())) def _create_lspci_info(): """Execute ''lspci'' command and parse the result. @@ -241,7 +261,7 @@ def _create_lspci_info(): try: (opt, value) = line.split('':\t'') if opt == ''Slot'' or (opt == ''Device'' and first_device): - device_name = PCI_DEV_FORMAT_STR % parse_pci_name(value) + device_name = pci_dict_to_bdf_str(parse_pci_name(value)) first_device = False else: device_info[opt] = value @@ -292,8 +312,7 @@ def find_all_devices_owned_by_pciback(): pci_list = extract_the_exact_pci_names(pci_names) dev_list = [] for pci in pci_list: - (dom, b, d, f) = parse_pci_name(pci) - dev = PciDevice(dom, b, d, f) + dev = PciDevice(parse_pci_name(pci)) dev_list = dev_list + [dev] return dev_list @@ -400,12 +419,12 @@ class PciDeviceVslotMissing(Exception): return ''pci: no vslot: '' + self.message class PciDevice: - def __init__(self, domain, bus, slot, func): - self.domain = domain - self.bus = bus - self.slot = slot - self.func = func - self.name = PCI_DEV_FORMAT_STR % (domain, bus, slot, func) + def __init__(self, dev): + self.domain = int(dev[''domain''], 16) + self.bus = int(dev[''bus''], 16) + self.slot = int(dev[''slot''], 16) + self.func = int(dev[''func''], 16) + self.name = pci_dict_to_bdf_str(dev) self.cfg_space_path = find_sysfs_mnt()+SYSFS_PCI_DEVS_PATH+''/''+ \ self.name + SYSFS_PCI_DEV_CONFIG_PATH self.irq = 0 @@ -447,14 +466,15 @@ class PciDevice: # We have reached the upmost one. return None else: + dev = {} lst = parent.split('':'') - dom = int(lst[0], 16) - bus = int(lst[1], 16) + dev[''domain''] = int(lst[0], 16) + dev[''bus''] = int(lst[1], 16) lst = lst[2] lst = lst.split(''.'') - dev = int(lst[0], 16) - func = int(lst[1], 16) - return (dom, bus, dev, func) + dev[''slot''] = int(lst[0], 16) + dev[''func''] = int(lst[1], 16) + return dev except OSError, (errno, strerr): raise PciDeviceParseError(''Can not locate the parent of %s'', self.name) @@ -464,15 +484,13 @@ class PciDevice: dev = self.find_parent() if dev is None: return None - (dom, b, d, f) = dev - dev = dev_parent = PciDevice(dom, b, d, f) + dev = dev_parent = PciDevice(dev) while dev_parent.dev_type != DEV_TYPE_PCIe_BRIDGE: parent = dev_parent.find_parent() if parent is None: break - (dom, b, d, f) = parent dev = dev_parent - dev_parent = PciDevice(dom, b, d, f) + dev_parent = PciDevice(parent) return dev def find_all_devices_behind_the_bridge(self, ignore_bridge): @@ -483,8 +501,7 @@ class PciDevice: list = [self.name] for pci_str in dev_list: - (dom, b, d, f) = parse_pci_name(pci_str) - dev = PciDevice(dom, b, d, f) + dev = PciDevice(parse_pci_name(pci_str)) if dev.dev_type == DEV_TYPE_PCI_BRIDGE or \ dev.dev_type == DEV_TYPE_PCIe_BRIDGE: sub_list_including_self = \ @@ -600,7 +617,7 @@ class PciDevice: def find_all_the_multi_functions(self): sysfs_mnt = find_sysfs_mnt() - parent = PCI_DEV_FORMAT_STR % self.find_parent() + parent = pci_dict_to_bdf_str(self.find_parent()) pci_names = os.popen(''ls '' + sysfs_mnt + SYSFS_PCI_DEVS_PATH + ''/'' + \ parent + ''/'').read() funcs = extract_the_exact_pci_names(pci_names) @@ -758,8 +775,7 @@ class PciDevice: if len(devs) == 0: return for pci_dev in devs: - (dom, b, d, f) = parse_pci_name(pci_dev) - dev = PciDevice(dom, b, d, f) + dev = PciDevice(parse_pci_name(pci_dev)) if dev.driver == ''pciback'': continue err_msg = ''pci: %s must be co-assigned to the same guest with %s'' + \ @@ -785,7 +801,7 @@ class PciDevice: funcs = self.find_all_the_multi_functions() self.devs_check_driver(funcs) - parent = ''%04x:%02x:%02x.%01x'' % self.find_parent() + parent = pci_dict_to_bdf_str(self.find_parent()) # Do Secondary Bus Reset. self.do_secondary_bus_reset(parent, funcs) Index: xen-unstable.hg/tools/python/xen/xend/XendDomainInfo.py ==================================================================--- xen-unstable.hg.orig/tools/python/xen/xend/XendDomainInfo.py 2009-06-16 22:48:34.000000000 +1000 +++ xen-unstable.hg/tools/python/xen/xend/XendDomainInfo.py 2009-06-16 22:49:32.000000000 +1000 @@ -39,7 +39,8 @@ from xen.util import asserts, auxbin from xen.util.blkif import blkdev_uname_to_file, blkdev_uname_to_taptype import xen.util.xsm.xsm as security from xen.util import xsconstants -from xen.util.pci import serialise_pci_opts, pci_opts_list_to_sxp +from xen.util.pci import serialise_pci_opts, pci_opts_list_to_sxp, \ + pci_dict_to_bdf_str, pci_dict_to_xc_str from xen.xend import balloon, sxp, uuid, image, arch from xen.xend import XendOptions, XendNode, XendConfig @@ -310,9 +311,8 @@ def do_FLR(domid): dev_str_list = get_assigned_pci_devices(domid) for dev_str in dev_str_list: - (dom, b, d, f) = parse_pci_name(dev_str) try: - dev = PciDevice(dom, b, d, f) + dev = PciDevice(parse_pci_name(dev_str)) except Exception, e: raise VmError("pci: failed to locate device and "+ "parse it''s resources - "+str(e)) @@ -652,23 +652,15 @@ class XendDomainInfo: raise VmError("device is already inserted") # Test whether the devices can be assigned with VT-d - pci_str = "%s, %s, %s, %s" % (new_dev[''domain''], - new_dev[''bus''], - new_dev[''slot''], - new_dev[''func'']) - bdf = xc.test_assign_device(0, pci_str) + bdf = xc.test_assign_device(0, pci_dict_to_xc_str(new_dev)) if bdf != 0: if bdf == -1: raise VmError("failed to assign device: maybe the platform" " doesn''t support VT-d, or VT-d isn''t enabled" " properly?") - bus = (bdf >> 16) & 0xff - devfn = (bdf >> 8) & 0xff - dev = (devfn >> 3) & 0x1f - func = devfn & 0x7 - raise VmError("fail to assign device(%x:%x.%x): maybe it has" + raise VmError("fail to assign device(%s): maybe it has" " already been assigned to other domain, or maybe" - " it doesn''t exist." % (bus, dev, func)) + " it doesn''t exist." % pci_dict_to_bdf_str(new_dev)) # Here, we duplicate some checkings (in some cases, we mustn''t allow # a device to be hot-plugged into an HVM guest) that are also done in @@ -680,12 +672,8 @@ class XendDomainInfo: # Test whether the device is owned by pciback. For instance, we can''t # hotplug a device being used by Dom0 itself to an HVM guest. from xen.xend.server.pciif import PciDevice, parse_pci_name - domain = int(new_dev[''domain''],16) - bus = int(new_dev[''bus''],16) - dev = int(new_dev[''slot''],16) - func = int(new_dev[''func''],16) try: - pci_device = PciDevice(domain, bus, dev, func) + pci_device = PciDevice(new_dev) except Exception, e: raise VmError("pci: failed to locate device and "+ "parse it''s resources - "+str(e)) @@ -710,9 +698,8 @@ class XendDomainInfo: pci_device.devs_check_driver(coassignment_list) assigned_pci_device_str_list = self._get_assigned_pci_devices() for pci_str in coassignment_list: - (domain, bus, dev, func) = parse_pci_name(pci_str) - dev_str = ''0x%x,0x%x,0x%x,0x%x'' % (domain, bus, dev, func) - if xc.test_assign_device(0, dev_str) == 0: + pci_dev = parse_pci_name(pci_str) + if xc.test_assign_device(0, pci_dict_to_xc_str(pci_dev)) == 0: continue if not pci_str in assigned_pci_device_str_list: raise VmError(("pci: failed to pci-attach %s to domain %s" + \ @@ -742,12 +729,9 @@ class XendDomainInfo: if new_dev.has_key(''opts''): opts = '','' + serialise_pci_opts(new_dev[''opts'']) - bdf_str = "%s:%s:%s.%s@%s%s" % (new_dev[''domain''], - new_dev[''bus''], - new_dev[''slot''], - new_dev[''func''], - new_dev[''vslot''], - opts) + bdf_str = "%s@%02x%s" % (pci_dict_to_bdf_str(new_dev), + int(new_dev[''vslot''], 16), opts) + log.debug("XendDomainInfo.hvm_pci_device_insert_dev: %s" % bdf_str) self.image.signalDeviceModel(''pci-ins'', ''pci-inserted'', bdf_str) vslot = xstransact.Read("/local/domain/0/device-model/%i/parameter" @@ -864,9 +848,8 @@ class XendDomainInfo: vslot = x[''vslot''] break if vslot == "": - raise VmError("Device %04x:%02x:%02x.%01x is not connected" - % (int(dev[''domain''],16), int(dev[''bus''],16), - int(dev[''slot''],16), int(dev[''func''],16))) + raise VmError("Device %s is not connected" % + pci_dict_to_bdf_str(dev)) self.hvm_destroyPCIDevice(int(vslot, 16)) # Update vslot dev[''vslot''] = vslot @@ -1152,12 +1135,8 @@ class XendDomainInfo: # list of D''s co-assignment devices, DD is not assigned (to domN). # from xen.xend.server.pciif import PciDevice - domain = int(x[''domain''],16) - bus = int(x[''bus''],16) - dev = int(x[''slot''],16) - func = int(x[''func''],16) try: - pci_device = PciDevice(domain, bus, dev, func) + pci_device = PciDevice(x) except Exception, e: raise VmError("pci: failed to locate device and "+ "parse it''s resources - "+str(e)) @@ -1172,9 +1151,8 @@ class XendDomainInfo: )% (pci_device.name, self.info[''name_label''], pci_str)) - bdf_str = "%s:%s:%s.%s" % (x[''domain''], x[''bus''], x[''slot''], x[''func'']) + bdf_str = pci_dict_to_bdf_str(x) log.info("hvm_destroyPCIDevice:%s:%s!", x, bdf_str) - if self.domid is not None: self.image.signalDeviceModel(''pci-rem'', ''pci-removed'', bdf_str) @@ -1338,21 +1316,12 @@ class XendDomainInfo: if self.domid is not None: return get_assigned_pci_devices(self.domid) - dev_str_list = [] dev_info = self._getDeviceInfo_pci(devid) if dev_info is None: - return dev_str_list + return [] dev_uuid = sxp.child_value(dev_info, ''uuid'') pci_conf = self.info[''devices''][dev_uuid][1] - pci_devs = pci_conf[''devs''] - for pci_dev in pci_devs: - domain = int(pci_dev[''domain''], 16) - bus = int(pci_dev[''bus''], 16) - slot = int(pci_dev[''slot''], 16) - func = int(pci_dev[''func''], 16) - dev_str = "%04x:%02x:%02x.%01x" % (domain, bus, slot, func) - dev_str_list = dev_str_list + [dev_str] - return dev_str_list + return map(pci_dict_to_bdf_str, pci_conf[''devs'']) def setMemoryTarget(self, target): """Set the memory target of this domain. @@ -3909,12 +3878,12 @@ class XendDomainInfo: target_dev = None new_pci_sxp = [''pci''] for dev in sxp.children(old_pci_sxp, ''dev''): - domain = int(sxp.child_value(dev, ''domain''), 16) - bus = int(sxp.child_value(dev, ''bus''), 16) - slot = int(sxp.child_value(dev, ''slot''), 16) - func = int(sxp.child_value(dev, ''func''), 16) - name = "%04x:%02x:%02x.%01x" % (domain, bus, slot, func) - if ppci.get_name() == name: + pci_dev = {} + pci_dev[''domain''] = sxp.child_value(dev, ''domain'') + pci_dev[''bus''] = sxp.child_value(dev, ''bus'') + pci_dev[''slot''] = sxp.child_value(dev, ''slot'') + pci_dev[''func''] = sxp.child_value(dev, ''func'') + if ppci.get_name() == pci_dict_to_bdf_str(pci_dev): target_dev = dev else: new_pci_sxp.append(dev) Index: xen-unstable.hg/tools/python/xen/xend/XendNode.py ==================================================================--- xen-unstable.hg.orig/tools/python/xen/xend/XendNode.py 2009-06-16 22:48:34.000000000 +1000 +++ xen-unstable.hg/tools/python/xen/xend/XendNode.py 2009-06-16 22:49:32.000000000 +1000 @@ -340,8 +340,7 @@ class XendNode: except KeyError: pass - (domain, bus, slot, func) = PciUtil.parse_pci_name(pci_name) - pci_dev = PciUtil.PciDevice(domain, bus, slot, func) + pci_dev = PciUtil.PciDevice(PciUtil.parse_pci_name(pci_name)) ppci_record = { ''domain'': pci_dev.domain, ''bus'': pci_dev.bus, Index: xen-unstable.hg/tools/python/xen/xend/server/pciif.py ==================================================================--- xen-unstable.hg.orig/tools/python/xen/xend/server/pciif.py 2009-06-16 22:48:34.000000000 +1000 +++ xen-unstable.hg/tools/python/xen/xend/server/pciif.py 2009-06-16 22:49:32.000000000 +1000 @@ -130,13 +130,7 @@ class PciController(DevController): log.debug(''Reconfiguring PCI device %s.'' % dev) attaching = False - (domain, bus, slotfunc) = dev.split('':'') - (slot, func) = slotfunc.split(''.'') - domain = parse_hex(domain) - bus = parse_hex(bus) - slot = parse_hex(slot) - func = parse_hex(func) - self.setupOneDevice(domain, bus, slot, func) + self.setupOneDevice(parse_pci_name(dev)) self.writeBackend(devid, ''dev-%i'' % devno, dev) self.writeBackend(devid, ''state-%i'' % devno, @@ -248,15 +242,13 @@ class PciController(DevController): 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) + for i in group_str.split('',''): + if i == '''': + continue + pci_dev = parse_pci_name(i) + pci_dev[''domain''] = ''%04x'' % dev.domain try: - sdev = PciDevice(dev.domain, b, d, f) + sdev = PciDevice(pci_dev) except Exception, e: #no dom0 drivers bound to sdev continue @@ -270,13 +262,13 @@ class PciController(DevController): )%(sdev.name, dev.name)) return - def setupOneDevice(self, domain, bus, slot, func): + def setupOneDevice(self, pci_dev): """ Attach I/O resources for device to frontend domain """ fe_domid = self.getDomid() try: - dev = PciDevice(domain, bus, slot, func) + dev = PciDevice(pci_dev) except Exception, e: raise VmError("pci: failed to locate device and "+ "parse it''s resources - "+str(e)) @@ -305,12 +297,11 @@ class PciController(DevController): if not self.vm.info.is_hvm(): # Setup IOMMU device assignment - pci_str = "0x%x, 0x%x, 0x%x, 0x%x" % (domain, bus, slot, func) - bdf = xc.assign_device(fe_domid, pci_str) + bdf = xc.assign_device(fe_domid, pci_dict_to_xc_str(pci_dev)) + pci_str = pci_dict_to_bdf_str(pci_dev) if bdf > 0: - raise VmError("Failed to assign device to IOMMU (%x:%x.%x)" - % (bus, slot, func)) - log.debug("pci: assign device %x:%x.%x" % (bus, slot, func)) + raise VmError("Failed to assign device to IOMMU (%s)" % pci_str) + log.debug("pci: assign device %s" % pci_str) for (start, size) in dev.ioports: log.debug(''pci: enabling ioport 0x%x/0x%x''%(start,size)) @@ -366,23 +357,15 @@ class PciController(DevController): def setupDevice(self, config): """Setup devices from config """ - pci_str_list = [] - pci_dev_list = [] - for pci_config in config.get(''devs'', []): - domain = parse_hex(pci_config.get(''domain'', 0)) - bus = parse_hex(pci_config.get(''bus'', 0)) - slot = parse_hex(pci_config.get(''slot'', 0)) - func = parse_hex(pci_config.get(''func'', 0)) - pci_str = ''%04x:%02x:%02x.%01x'' % (domain, bus, slot, func) - pci_str_list = pci_str_list + [pci_str] - pci_dev_list = pci_dev_list + [(domain, bus, slot, func)] + pci_dev_list = config.get(''devs'', []) + pci_str_list = map(pci_dict_to_bdf_str, pci_dev_list) if len(pci_str_list) != len(set(pci_str_list)): raise VmError(''pci: duplicate devices specified in guest config?'') - for (domain, bus, slot, func) in pci_dev_list: + for pci_dev in pci_dev_list: try: - dev = PciDevice(domain, bus, slot, func) + dev = PciDevice(pci_dev) except Exception, e: raise VmError("pci: failed to locate device and "+ "parse it''s resources - "+str(e)) @@ -427,9 +410,7 @@ class PciController(DevController): dev.devs_check_driver(devs_str) for s in devs_str: if not s in pci_str_list: - (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_pci_str = pci_dict_to_bdf_str(parse_pci_name(s)) # 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''+\ @@ -453,13 +434,13 @@ class PciController(DevController): return True - def cleanupOneDevice(self, domain, bus, slot, func): + def cleanupOneDevice(self, pci_dev): """ Detach I/O resources for device from frontend domain """ fe_domid = self.getDomid() try: - dev = PciDevice(domain, bus, slot, func) + dev = PciDevice(pci_dev) except Exception, e: raise VmError("pci: failed to locate device and "+ "parse it''s resources - "+str(e)) @@ -476,12 +457,11 @@ class PciController(DevController): # DMA transaction, etc dev.do_FLR() - pci_str = "0x%x, 0x%x, 0x%x, 0x%x" % (domain, bus, slot, func) - bdf = xc.deassign_device(fe_domid, pci_str) + bdf = xc.deassign_device(fe_domid, pci_dict_to_xc_str(pci_dev)) + pci_str = pci_dict_to_bdf_str(pci_dev) if bdf > 0: - raise VmError("Failed to deassign device from IOMMU (%x:%x.%x)" - % (bus, slot, func)) - log.debug("pci: Deassign device %x:%x.%x" % (bus, slot, func)) + raise VmError("Failed to deassign device from IOMMU (%s)" % pci_str) + log.debug("pci: Deassign device %s" % pci_str) for (start, size) in dev.ioports: log.debug(''pci: disabling ioport 0x%x/0x%x''%(start,size)) @@ -530,15 +510,9 @@ class PciController(DevController): state = int(self.readBackend(devid, ''state-%i'' % i)) if state == xenbusState[''Closing'']: # Detach I/O resources. - dev = self.readBackend(devid, ''dev-%i'' % i) - (domain, bus, slotfunc) = dev.split('':'') - (slot, func) = slotfunc.split(''.'') - domain = parse_hex(domain) - bus = parse_hex(bus) - slot = parse_hex(slot) - func = parse_hex(func) + pci_dev = parse_pci_name(self.readBackend(devid, ''dev-%i'' % i)) # In HVM case, I/O resources are disabled in ioemu. - self.cleanupOneDevice(domain, bus, slot, func) + self.cleanupOneDevice(pci_dev) # Remove xenstore nodes. list = [''dev'', ''vdev'', ''state'', ''uuid'', ''vslot''] if self.readBackend(devid, ''opts-%i'' % i) is not None: -- _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Simon Horman
2009-Jun-16 13:00 UTC
[Xen-devel] [patch 2/8] xend: pass-through: Add pci_dict_cmp()
pci_dict_cmp() compares the two pci devices in dict format. Cc: Dexuan Cui <dexuan.cui@intel.com> Cc: Masaki Kanno <kanno.masaki@jp.fujitsu.com> Signed-off-by: Simon Horman <horms@verge.net.au> Index: xen-unstable.hg/tools/python/xen/util/pci.py ==================================================================--- xen-unstable.hg.orig/tools/python/xen/util/pci.py 2009-06-15 11:24:32.000000000 +1000 +++ xen-unstable.hg/tools/python/xen/util/pci.py 2009-06-15 11:24:34.000000000 +1000 @@ -205,6 +205,10 @@ def pci_dict_to_bdf_str(dev): def pci_dict_to_xc_str(dev): return __pci_dict_to_fmt_str(''0x%x, 0x%x, 0x%x, 0x%x'', dev) +def pci_dict_cmp(a, b, keys=[''domain'', ''bus'', ''slot'', ''func'']): + return reduce(lambda x, y: x and y, + map(lambda k: int(a[k], 16) == int(b[k], 16), keys)) + def extract_the_exact_pci_names(pci_names): result = [] Index: xen-unstable.hg/tools/python/xen/xend/XendDomainInfo.py ==================================================================--- xen-unstable.hg.orig/tools/python/xen/xend/XendDomainInfo.py 2009-06-15 11:24:32.000000000 +1000 +++ xen-unstable.hg/tools/python/xen/xend/XendDomainInfo.py 2009-06-15 11:24:34.000000000 +1000 @@ -40,7 +40,7 @@ from xen.util.blkif import blkdev_uname_ import xen.util.xsm.xsm as security from xen.util import xsconstants from xen.util.pci import serialise_pci_opts, pci_opts_list_to_sxp, \ - pci_dict_to_bdf_str, pci_dict_to_xc_str + pci_dict_to_bdf_str, pci_dict_to_xc_str, pci_dict_cmp from xen.xend import balloon, sxp, uuid, image, arch from xen.xend import XendOptions, XendNode, XendConfig @@ -645,10 +645,7 @@ class XendDomainInfo: int(x[''vslot''], 16) != AUTO_PHP_SLOT): raise VmError("vslot %s already have a device." % (new_dev[''vslot''])) - if (int(x[''domain''], 16) == int(new_dev[''domain''], 16) and - int(x[''bus''], 16) == int(new_dev[''bus''], 16) and - int(x[''slot''], 16) == int(new_dev[''slot''], 16) and - int(x[''func''], 16) == int(new_dev[''func''], 16) ): + if (pci_dict_cmp(x, new_dev)): raise VmError("device is already inserted") # Test whether the devices can be assigned with VT-d @@ -839,23 +836,18 @@ class XendDomainInfo: existing_dev_uuid = sxp.child_value(existing_dev_info, ''uuid'') existing_pci_conf = self.info[''devices''][existing_dev_uuid][1] existing_pci_devs = existing_pci_conf[''devs''] - vslot = "" - for x in existing_pci_devs: - if ( int(x[''domain''], 16) == int(dev[''domain''], 16) and - int(x[''bus''], 16) == int(dev[''bus''], 16) and - int(x[''slot''], 16) == int(dev[''slot''], 16) and - int(x[''func''], 16) == int(dev[''func''], 16) ): - vslot = x[''vslot''] - break - if vslot == "": + new_devs = filter(lambda x: pci_dict_cmp(x, dev), + existing_pci_devs) + if len(new_devs) < 0: raise VmError("Device %s is not connected" % pci_dict_to_bdf_str(dev)) - self.hvm_destroyPCIDevice(int(vslot, 16)) + new_dev = new_devs[0] + self.hvm_destroyPCIDevice(int(new_dev[''vslot''], 16)) # Update vslot - dev[''vslot''] = vslot + dev[''vslot''] = new_dev[''vslot''] for n in sxp.children(pci_dev): if(n[0] == ''vslot''): - n[1] = vslot + n[1] = new_dev[''vslot''] # If pci platform does not exist, create and exit. if existing_dev_info is None: -- _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Simon Horman
2009-Jun-16 13:00 UTC
[Xen-devel] [patch 3/8] xend: pass-through: Move pci conversion functions to pci.py
Move dev_dict_to_sxp() into XendSXPDev.py. Move pci_convert_dict_to_sxp() and pci_convert_sxp_to_dict() to pci.py, where other similar functions live. This makes these functions accessible outside of the XendConfig class. Cc: Dexuan Cui <dexuan.cui@intel.com> Cc: Masaki Kanno <kanno.masaki@jp.fujitsu.com> Signed-off-by: Simon Horman <horms@verge.net.au> --- Mon, 15 Jun 2009 11:55:26 +1000 * Initial posting Mon, 15 Jun 2009 20:39:43 +1000 * Miss-post - XendSXPDev.py change was omitted Tue, 16 Jun 2009 09:33:17 +1000 * Move dev_dict_to_sxp into XendSXPDev.py. As pointed out by Masaki Kanno, it is used by non-pci as well as pci devices. Index: xen-unstable.hg/tools/python/xen/util/pci.py ==================================================================--- xen-unstable.hg.orig/tools/python/xen/util/pci.py 2009-06-16 22:53:39.000000000 +1000 +++ xen-unstable.hg/tools/python/xen/util/pci.py 2009-06-16 22:53:41.000000000 +1000 @@ -14,8 +14,10 @@ import struct import time import threading from xen.util import utils +from xen.xend import uuid from xen.xend import sxp from xen.xend.XendConstants import AUTO_PHP_SLOT +from xen.xend.XendSXPDev import dev_dict_to_sxp PROC_PCI_PATH = ''/proc/bus/pci/devices'' PROC_PCI_NUM_RESOURCES = 7 @@ -139,6 +141,79 @@ def pci_opts_list_to_sxp(list): def pci_opts_list_from_sxp(dev): return map(lambda x: sxp.children(x)[0], sxp.children(dev, ''opts'')) +def pci_convert_dict_to_sxp(dev, state, sub_state = None): + pci_sxp = [''pci'', dev_dict_to_sxp(dev), [''state'', state]] + if sub_state != None: + pci_sxp.append([''sub_state'', sub_state]) + return pci_sxp + +def pci_convert_sxp_to_dict(dev_sxp): + """Convert pci device sxp to dict + @param dev_sxp: device configuration + @type dev_sxp: SXP object (parsed config) + @return: dev_config + @rtype: dictionary + """ + # 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], [func, 2]]] + # + # 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]]] + + # For PCI device hotplug support, the SXP of PCI devices is + # extendend like this: + # + # [device, [pci, [dev, [domain, 0], [bus, 0], [slot, 1], [func, 2], + # [vslot, 0]], + # [state, ''Initialising'']]] + # + # ''vslot'' shows the virtual hotplug slot number which the PCI device + # is inserted in. This is only effective for HVM domains. + # + # state ''Initialising'' indicates that the device is being attached, + # while state ''Closing'' indicates that the device is being detached. + # + # The Dict looks like this: + # + # { devs: [{domain: 0, bus: 0, slot: 1, func: 2, vslot: 0}], + # states: [''Initialising''] } + + dev_config = {} + + pci_devs = [] + for pci_dev in sxp.children(dev_sxp, ''dev''): + pci_dev_info = dict(pci_dev[1:]) + if ''opts'' in pci_dev_info: + pci_dev_info[''opts''] = pci_opts_list_from_sxp(pci_dev) + # append uuid to each pci device that does''t already have one. + if not pci_dev_info.has_key(''uuid''): + dpci_uuid = pci_dev_info.get(''uuid'', uuid.createString()) + pci_dev_info[''uuid''] = dpci_uuid + pci_devs.append(pci_dev_info) + dev_config[''devs''] = pci_devs + + pci_states = [] + for pci_state in sxp.children(dev_sxp, ''state''): + try: + pci_states.append(pci_state[1]) + except IndexError: + raise XendError("Error reading state while parsing pci sxp") + dev_config[''states''] = pci_states + + return dev_config + def parse_hex(val): try: if isinstance(val, types.StringTypes): Index: xen-unstable.hg/tools/python/xen/xend/XendConfig.py ==================================================================--- xen-unstable.hg.orig/tools/python/xen/xend/XendConfig.py 2009-06-16 22:46:20.000000000 +1000 +++ xen-unstable.hg/tools/python/xen/xend/XendConfig.py 2009-06-16 22:53:41.000000000 +1000 @@ -36,7 +36,8 @@ from xen.xend.xenstore.xstransact import from xen.xend.server.BlktapController import blktap_disk_types from xen.xend.server.netif import randomMAC from xen.util.blkif import blkdev_name_to_number, blkdev_uname_to_file -from xen.util.pci import pci_opts_list_from_sxp +from xen.util.pci import pci_opts_list_from_sxp, pci_convert_sxp_to_dict +from xen.xend.XendSXPDev import dev_dict_to_sxp from xen.util import xsconstants import xen.util.auxbin @@ -1295,7 +1296,7 @@ class XendConfig(dict): pci_devs_uuid = sxp.child_value(config, ''uuid'', uuid.createString()) - pci_dict = self.pci_convert_sxp_to_dict(config) + pci_dict = pci_convert_sxp_to_dict(config) pci_devs = pci_dict[''devs''] # create XenAPI DPCI objects. @@ -1605,79 +1606,6 @@ class XendConfig(dict): return '''' - def pci_convert_dict_to_sxp(self, dev, state, sub_state = None): - pci_sxp = [''pci'', self.dev_dict_to_sxp(dev), [''state'', state]] - if sub_state != None: - pci_sxp.append([''sub_state'', sub_state]) - return pci_sxp - - def pci_convert_sxp_to_dict(self, dev_sxp): - """Convert pci device sxp to dict - @param dev_sxp: device configuration - @type dev_sxp: SXP object (parsed config) - @return: dev_config - @rtype: dictionary - """ - # 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], [func, 2]]] - # - # 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]]] - - # For PCI device hotplug support, the SXP of PCI devices is - # extendend like this: - # - # [device, [pci, [dev, [domain, 0], [bus, 0], [slot, 1], [func, 2], - # [vslot, 0]], - # [state, ''Initialising'']]] - # - # ''vslot'' shows the virtual hotplug slot number which the PCI device - # is inserted in. This is only effective for HVM domains. - # - # state ''Initialising'' indicates that the device is being attached, - # while state ''Closing'' indicates that the device is being detached. - # - # The Dict looks like this: - # - # { devs: [{domain: 0, bus: 0, slot: 1, func: 2, vslot: 0}], - # states: [''Initialising''] } - - dev_config = {} - - pci_devs = [] - for pci_dev in sxp.children(dev_sxp, ''dev''): - pci_dev_info = dict(pci_dev[1:]) - if ''opts'' in pci_dev_info: - pci_dev_info[''opts''] = pci_opts_list_from_sxp(pci_dev) - # append uuid to each pci device that does''t already have one. - if not pci_dev_info.has_key(''uuid''): - dpci_uuid = pci_dev_info.get(''uuid'', uuid.createString()) - pci_dev_info[''uuid''] = dpci_uuid - pci_devs.append(pci_dev_info) - dev_config[''devs''] = pci_devs - - pci_states = [] - for pci_state in sxp.children(dev_sxp, ''state''): - try: - pci_states.append(pci_state[1]) - except IndexError: - raise XendError("Error reading state while parsing pci sxp") - dev_config[''states''] = pci_states - - return dev_config - def vscsi_convert_sxp_to_dict(self, dev_sxp): """Convert vscsi device sxp to dict @param dev_sxp: device configuration @@ -1848,7 +1776,7 @@ class XendConfig(dict): dev_type, dev_info = self[''devices''][dev_uuid] if dev_type == ''pci'': # Special case for pci - pci_dict = self.pci_convert_sxp_to_dict(config) + pci_dict = pci_convert_sxp_to_dict(config) pci_devs = pci_dict[''devs''] # destroy existing XenAPI DPCI objects @@ -1971,15 +1899,6 @@ class XendConfig(dict): result.extend([u for u in target[''devices''].keys() if u not in result]) return result - # This includes a generic equivalent of pci_opts_list_to_sxp() - def dev_dict_to_sxp(self, dev): - def f((key, val)): - if isinstance(val, types.ListType): - return map(lambda x: [key, x], val) - return [[key, val]] - dev_sxp = [''dev''] + reduce(lambda x, y: x + y, map(f, dev.items())) - return dev_sxp - def all_devices_sxpr(self, target = None): """Returns the SXPR for all devices in the current configuration.""" sxprs = [] @@ -2002,7 +1921,7 @@ class XendConfig(dict): if dev_info.has_key(''backend''): sxpr.append([''backend'', dev_info[''backend'']]) for pci_dev_info in dev_info[''devs'']: - sxpr.append(self.dev_dict_to_sxp(pci_dev_info)) + sxpr.append(dev_dict_to_sxp(pci_dev_info)) sxprs.append((dev_type, sxpr)) else: sxpr = self.device_sxpr(dev_type = dev_type, Index: xen-unstable.hg/tools/python/xen/xend/XendDomainInfo.py ==================================================================--- xen-unstable.hg.orig/tools/python/xen/xend/XendDomainInfo.py 2009-06-16 22:53:39.000000000 +1000 +++ xen-unstable.hg/tools/python/xen/xend/XendDomainInfo.py 2009-06-16 22:53:41.000000000 +1000 @@ -40,7 +40,9 @@ from xen.util.blkif import blkdev_uname_ import xen.util.xsm.xsm as security from xen.util import xsconstants from xen.util.pci import serialise_pci_opts, pci_opts_list_to_sxp, \ - pci_dict_to_bdf_str, pci_dict_to_xc_str, pci_dict_cmp + pci_dict_to_bdf_str, pci_dict_to_xc_str, \ + pci_convert_sxp_to_dict, pci_convert_dict_to_sxp, \ + pci_dict_cmp from xen.xend import balloon, sxp, uuid, image, arch from xen.xend import XendOptions, XendNode, XendConfig @@ -616,8 +618,8 @@ class XendDomainInfo: pci_conf = self.info[''devices''][dev_uuid][1] pci_devs = pci_conf[''devs''] request = map(lambda x: - self.info.pci_convert_dict_to_sxp(x, ''Initialising'', - ''Booting''), pci_devs) + pci_convert_dict_to_sxp(x, ''Initialising'', ''Booting''), + pci_devs) for i in request: self.pci_device_configure(i) @@ -815,7 +817,7 @@ class XendDomainInfo: raise XendError("Cannot detach when pci platform does not exist") pci_dev = sxp.children(dev_sxp, ''dev'')[0] - dev_config = self.info.pci_convert_sxp_to_dict(dev_sxp) + dev_config = pci_convert_sxp_to_dict(dev_sxp) dev = dev_config[''devs''][0] # Do HVM specific processing Index: xen-unstable.hg/tools/python/xen/xend/XendSXPDev.py ==================================================================--- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ xen-unstable.hg/tools/python/xen/xend/XendSXPDev.py 2009-06-16 22:53:41.000000000 +1000 @@ -0,0 +1,14 @@ +#!/usr/bin/env python +# +# Helper functions for dealing with the sxp representation of devices + +import types + +# This includes a generic equivalent of pci_opts_list_to_sxp() +def dev_dict_to_sxp(dev): + def f((key, val)): + if isinstance(val, types.ListType): + return map(lambda x: [key, x], val) + return [[key, val]] + dev_sxp = [''dev''] + reduce(lambda x, y: x + y, map(f, dev.items())) + return dev_sxp -- _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Simon Horman
2009-Jun-16 13:00 UTC
[Xen-devel] [patch 4/8] xend: pass-through: Use generic code in pci_opts_list_to_sxp()
Use dev_dict_to_sxp() inside pci_opts_list_to_sxp() now that it is available. Cc: Dexuan Cui <dexuan.cui@intel.com> Cc: Masaki Kanno <kanno.masaki@jp.fujitsu.com> Signed-off-by: Simon Horman <horms@verge.net.au> --- Mon, 15 Jun 2009 11:55:27 +1000 * Initial posting Mon, 15 Jun 2009 20:38:21 +1000 * dev_dict_to_sxp() is now in XendSXPDev.py Index: xen-unstable.hg/tools/python/xen/util/pci.py ==================================================================--- xen-unstable.hg.orig/tools/python/xen/util/pci.py 2009-06-15 20:13:52.000000000 +1000 +++ xen-unstable.hg/tools/python/xen/util/pci.py 2009-06-15 20:35:32.000000000 +1000 @@ -136,7 +136,7 @@ def split_pci_opts(opts): filter(lambda x: x != '''', opts.split('',''))) def pci_opts_list_to_sxp(list): - return [''dev''] + map(lambda x: [''opts'', x], list) + return dev_dict_to_sxp({''opts'': list}) def pci_opts_list_from_sxp(dev): return map(lambda x: sxp.children(x)[0], sxp.children(dev, ''opts'')) Index: xen-unstable.hg/tools/python/xen/xend/XendSXPDev.py ==================================================================--- xen-unstable.hg.orig/tools/python/xen/xend/XendSXPDev.py 2009-06-15 20:35:56.000000000 +1000 +++ xen-unstable.hg/tools/python/xen/xend/XendSXPDev.py 2009-06-15 20:36:06.000000000 +1000 @@ -4,7 +4,6 @@ import types -# This includes a generic equivalent of pci_opts_list_to_sxp() def dev_dict_to_sxp(dev): def f((key, val)): if isinstance(val, types.ListType): -- _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Simon Horman
2009-Jun-16 13:00 UTC
[Xen-devel] [patch 5/8] xend: pass-through: Add pci_tuple_to_dict()
This will be re-used in subsequent patches. Cc: Dexuan Cui <dexuan.cui@intel.com> Cc: Masaki Kanno <kanno.masaki@jp.fujitsu.com> Signed-off-by: Simon Horman <horms@verge.net.au> Index: xen-unstable.hg/tools/python/xen/xm/create.py ==================================================================--- xen-unstable.hg.orig/tools/python/xen/xm/create.py 2009-06-16 22:46:20.000000000 +1000 +++ xen-unstable.hg/tools/python/xen/xm/create.py 2009-06-16 22:53:47.000000000 +1000 @@ -38,7 +38,7 @@ from xen.util import vscsi_util import xen.util.xsm.xsm as security from xen.xm.main import serverType, SERVER_XEN_API, get_single_vm from xen.util import utils, auxbin -from xen.util.pci import pci_opts_list_to_sxp, \ +from xen.util.pci import dev_dict_to_sxp, \ parse_pci_name_extended, PciDeviceParseError from xen.xm.opts import * @@ -707,12 +707,9 @@ def configure_pci(config_devs, vals): """Create the config for pci devices. """ config_pci = [] - for (domain, bus, slot, func, vslot, opts) in vals.pci: - config_pci_bdf = [''dev'', [''domain'', domain], [''bus'', bus], \ - [''slot'', slot], [''func'', func], - [''vslot'', vslot]] - config_opts = pci_opts_list_to_sxp(opts) - config_pci.append(sxp.merge(config_pci_bdf, config_opts)) + for pci_tuple in vals.pci: + pci_dev = pci_tuple_to_dict(pci_tuple) + config_pci.append(dev_dict_to_sxp(pci_dev)) if len(config_pci)>0: config_pci.insert(0, ''pci'') @@ -1050,6 +1047,16 @@ def pci_dict_to_tuple(dev): return (dev[''domain''], dev[''bus''], dev[''slot''], dev[''func''], dev[''vslot''], dev.get(''opts'', [])) +def pci_tuple_to_dict((domain, bus, slot, func, vslot, opts)): + pci_dev = { ''domain'': domain, + ''bus'': bus, + ''slot'': slot, + ''func'': func, + ''vslot'': vslot} + if len(opts) > 0: + pci_dev[''opts''] = opts + return pci_dev + def preprocess_pci(vals): if not vals.pci: return -- _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Simon Horman
2009-Jun-16 13:00 UTC
[Xen-devel] [patch 6/8] xend: pass-through: Use common parsing code in parse_pci_configuration()
This will be re-used in subsequent patches. Cc: Dexuan Cui <dexuan.cui@intel.com> Cc: Masaki Kanno <kanno.masaki@jp.fujitsu.com> Signed-off-by: Simon Horman <horms@verge.net.au> Index: xen-unstable.hg/tools/python/xen/xm/main.py ==================================================================--- xen-unstable.hg.orig/tools/python/xen/xm/main.py 2009-06-16 22:46:20.000000000 +1000 +++ xen-unstable.hg/tools/python/xen/xm/main.py 2009-06-16 22:53:51.000000000 +1000 @@ -2489,36 +2489,16 @@ def parse_pci_configuration(args, state, dom = args[0] pci_dev_str = args[1] if len(args) == 3: - vslot = args[2] - else: - vslot = AUTO_PHP_SLOT_STR - pci=[''pci''] - pci_match = re.match(r"((?P<domain>[0-9a-fA-F]{1,4})[:,])?" + \ - r"(?P<bus>[0-9a-fA-F]{1,2})[:,]" + \ - r"(?P<slot>[0-9a-fA-F]{1,2})[.,]" + \ - r"(?P<func>[0-7])$", pci_dev_str) - if pci_match == None: - raise OptionError("Invalid argument: %s %s" % (pci_dev_str, vslot)) - pci_dev_info = pci_match.groupdict(''0'') - - try: - pci_bdf =[''dev'', [''domain'', ''0x''+ pci_dev_info[''domain'']], \ - [''bus'', ''0x''+ pci_dev_info[''bus'']], - [''slot'', ''0x''+ pci_dev_info[''slot'']], - [''func'', ''0x''+ pci_dev_info[''func'']], - [''vslot'', ''0x%x'' % int(vslot, 16)]] - except: - raise OptionError("Invalid argument: %s %s" % (pci_dev_str, vslot)) + pci_dev_str += ''@'' + args[2] + if len(opts) > 0: + pci_dev_str += '','' + serialise_pci_opts(opts) try: - check_pci_opts(opts) + pci_dev = parse_pci_name_extended(pci_dev_str) except PciDeviceParseError, ex: raise OptionError(str(ex)) - pci.append(sxp.merge(pci_bdf, pci_opts_list_to_sxp(opts))) - pci.append([''state'', state]) - - return (dom, pci) + return (dom, pci_convert_dict_to_sxp(pci_dev, state)) def xm_pci_attach(args): config_pci_opts = [] -- _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Simon Horman
2009-Jun-16 13:00 UTC
[Xen-devel] [patch 7/8] xend: pass-through: Use common parsing code in getDeviceConfiguration()
This will be re-used in subsequent patches. Cc: Dexuan Cui <dexuan.cui@intel.com> Cc: Masaki Kanno <kanno.masaki@jp.fujitsu.com> Signed-off-by: Simon Horman <horms@verge.net.au> Index: xen-unstable.hg/tools/python/xen/xend/server/pciif.py ==================================================================--- xen-unstable.hg.orig/tools/python/xen/xend/server/pciif.py 2009-06-07 21:58:38.000000000 +1000 +++ xen-unstable.hg/tools/python/xen/xend/server/pciif.py 2009-06-07 22:12:13.000000000 +1000 @@ -170,31 +170,18 @@ class PciController(DevController): pci_devs = [] for i in range(int(num_devs)): - dev_config = self.readBackend(devid, ''dev-%d'' % i) + pci_dev = parse_pci_name(self.readBackend(devid, ''dev-%d'' % i)) - pci_match = re.match(r"((?P<domain>[0-9a-fA-F]{1,4})[:,])?" + - r"(?P<bus>[0-9a-fA-F]{1,2})[:,]" + - r"(?P<slot>[0-9a-fA-F]{1,2})[.,]" + - r"(?P<func>[0-7]{1,2})$", dev_config) - - if pci_match!=None: - pci_dev_info = pci_match.groupdict() - dev_dict = {''domain'': ''0x%(domain)s'' % pci_dev_info, - ''bus'': ''0x%(bus)s'' % pci_dev_info, - ''slot'': ''0x%(slot)s'' % pci_dev_info, - ''func'': ''0x%(func)s'' % pci_dev_info} - - # Per device uuid info - dev_dict[''uuid''] = self.readBackend(devid, ''uuid-%d'' % i) - dev_dict[''vslot''] = ''0x%s'' % \ - self.readBackend(devid, ''vslot-%d'' % i) - - #append opts info - opts = self.readBackend(devid, ''opts-%d'' % i) - if opts is not None: - dev_dict[''opts''] = opts + # Per device uuid info + pci_dev[''uuid''] = self.readBackend(devid, ''uuid-%d'' % i) + pci_dev[''vslot''] = ''0x%s'' % self.readBackend(devid, ''vslot-%d'' % i) + + #append opts info + opts = self.readBackend(devid, ''opts-%d'' % i) + if opts is not None: + pci_dev[''opts''] = opts - pci_devs.append(dev_dict) + pci_devs.append(pci_dev) result[''devs''] = pci_devs result[''uuid''] = self.readBackend(devid, ''uuid'') -- _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Simon Horman
2009-Jun-16 13:00 UTC
[Xen-devel] [patch 8/8] xend: pass-through: Clean up hvm_destroyPCIDevice()
There seems to be little need to use the domain, bus, slot and function to look up the virtual slot to pass as the argument to hvm_destroyPCIDevice(), only to have hvm_destroyPCIDevice() use the virtual slot for the sole purpose of looking up the domain, bus, slot and function. Cc: Dexuan Cui <dexuan.cui@intel.com> Cc: Masaki Kanno <kanno.masaki@jp.fujitsu.com> Signed-off-by: Simon Horman <horms@verge.net.au> Index: xen-unstable.hg/tools/python/xen/xend/XendDomainInfo.py ==================================================================--- xen-unstable.hg.orig/tools/python/xen/xend/XendDomainInfo.py 2009-06-15 11:24:37.000000000 +1000 +++ xen-unstable.hg/tools/python/xen/xend/XendDomainInfo.py 2009-06-15 11:24:43.000000000 +1000 @@ -844,7 +844,7 @@ class XendDomainInfo: raise VmError("Device %s is not connected" % pci_dict_to_bdf_str(dev)) new_dev = new_devs[0] - self.hvm_destroyPCIDevice(int(new_dev[''vslot''], 16)) + self.hvm_destroyPCIDevice(new_dev) # Update vslot dev[''vslot''] = new_dev[''vslot''] for n in sxp.children(pci_dev): @@ -1098,39 +1098,19 @@ class XendDomainInfo: for devclass in XendDevices.valid_devices(): self.getDeviceController(devclass).waitForDevices() - def hvm_destroyPCIDevice(self, vslot): - log.debug("hvm_destroyPCIDevice called %s", vslot) + def hvm_destroyPCIDevice(self, pci_dev): + log.debug("hvm_destroyPCIDevice: %s", pci_dev) if not self.info.is_hvm(): raise VmError("hvm_destroyPCIDevice called on non-HVM guest") - #all the PCI devs share one conf node - devid = ''0'' - vslot = int(vslot) - dev_info = self._getDeviceInfo_pci(''0'')#from self.info[''devices''] - dev_uuid = sxp.child_value(dev_info, ''uuid'') - - #delete the pci bdf config under the pci device - pci_conf = self.info[''devices''][dev_uuid][1] - pci_len = len(pci_conf[''devs'']) - - #find the pass-through device with the virtual slot - devnum = 0 - for x in pci_conf[''devs'']: - if int(x[''vslot''], 16) == vslot: - break - devnum += 1 - - if devnum >= pci_len: - raise VmError("Device @ vslot 0x%x doesn''t exist." % (vslot)) - # Check the co-assignment. # To pci-detach a device D from domN, we should ensure: for each DD in the # list of D''s co-assignment devices, DD is not assigned (to domN). # from xen.xend.server.pciif import PciDevice try: - pci_device = PciDevice(x) + pci_device = PciDevice(pci_dev) except Exception, e: raise VmError("pci: failed to locate device and "+ "parse it''s resources - "+str(e)) @@ -1145,8 +1125,8 @@ class XendDomainInfo: )% (pci_device.name, self.info[''name_label''], pci_str)) - bdf_str = pci_dict_to_bdf_str(x) - log.info("hvm_destroyPCIDevice:%s:%s!", x, bdf_str) + bdf_str = pci_dict_to_bdf_str(pci_dev) + log.info("hvm_destroyPCIDevice:%s:%s!", pci_dev, bdf_str) if self.domid is not None: self.image.signalDeviceModel(''pci-rem'', ''pci-removed'', bdf_str) -- _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Keir Fraser
2009-Jun-16 13:45 UTC
Re: [Xen-devel] [patch 1/8] xend: pass-through: Common parse_pci_name()
Still not applying at my end. It could be the in-line patch is getting munged somewhere down the line. Feel free to send the patches to me privately as a bunch of attachments in a single email. -- Keir On 16/06/2009 14:00, "Simon Horman" <horms@verge.net.au> wrote:> Share some parsing code between different parts of xm. > > This has the side-effect that the device specification for > hot-plug may now include the VSLOT and OPTS as per device > specifictions in the domain configuration file. > > SEQ:BUS:DEV.FUNC[,OPT...] > > e.g. 0000:00:01.00@6 > > Cc: Dexuan Cui <dexuan.cui@intel.com> > Cc: Masaki Kanno <kanno.masaki@jp.fujitsu.com> > Cc: Akio Takebe <takebe_akio@jp.fujitsu.com> > Signed-off-by: Simon Horman <horms@verge.net.au> > > --- > > Wed, 20 May 2009 23:07:42 +1000 > * Fix syntax errors in parse_pci_name() and parse_pci_name_bdf6() > - unnoticed as they were resolved by the subsequent patch > "xm: Allow multi-function device specifications to be parsed > * Enhanced error reporting in parse_pci_name() > * Have parse_pci_name_bdf6() return an int rather than a string for vslot in > keeping with the other integer elements of the bdf6 tuple > > Fri, 22 May 2009 15:52:50 +1000 > * Consolidate get_all_pci_bdf6() and get_all_pci_devices() > > Thu, 28 May 2009 23:56:14 +1000 > * Up-port > > Tue, 16 Jun 2009 18:37:05 +1000 > * In find_parent(), dev[''dom''] should be dev[''domain'']. > Pointed out by Takebe-san. > > Tue, 16 Jun 2009 22:53:18 +1000 > * Up-port to xen-unstable.hg 19763 > > Index: xen-unstable.hg/tools/python/xen/util/pci.py > ==================================================================> --- xen-unstable.hg.orig/tools/python/xen/util/pci.py 2009-06-16 > 22:48:34.000000000 +1000 > +++ xen-unstable.hg/tools/python/xen/util/pci.py 2009-06-16 > 22:49:32.000000000 +1000 > @@ -15,6 +15,7 @@ import time > import threading > from xen.util import utils > from xen.xend import sxp > +from xen.xend.XendConstants import AUTO_PHP_SLOT > > PROC_PCI_PATH = ''/proc/bus/pci/devices'' > PROC_PCI_NUM_RESOURCES = 7 > @@ -35,7 +36,6 @@ LSPCI_CMD = ''lspci'' > > PCI_DEV_REG_EXPRESS_STR = r"[0-9a-fA-F]{4}:[0-9a-fA-F]{2}:[0-9a-fA-F]{2}."+ \ > r"[0-9a-fA-F]{1}" > -PCI_DEV_FORMAT_STR = ''%04x:%02x:%02x.%01x'' > > DEV_TYPE_PCIe_ENDPOINT = 0 > DEV_TYPE_PCIe_BRIDGE = 1 > @@ -148,22 +148,62 @@ def parse_hex(val): > except ValueError: > return None > > +def parse_pci_name_extended(pci_dev_str): > + pci_match = re.match(r"((?P<domain>[0-9a-fA-F]{1,4})[:,])?" + > + r"(?P<bus>[0-9a-fA-F]{1,2})[:,]" + > + r"(?P<slot>[0-9a-fA-F]{1,2})[.,]" + > + r"(?P<func>(\*|[0-7]))" + > + r"(@(?P<vslot>[01]?[0-9a-fA-F]))?" + > + r"(,(?P<opts>.*))?$", pci_dev_str) > + > + if pci_match == None: > + raise PciDeviceParseError("Failed to parse pci device: %s" % > + pci_dev_str) > + > + out = {} > + pci_dev_info = pci_match.groupdict('''') > + if pci_dev_info[''domain''] == '''': > + domain = 0 > + else: > + domain = int(pci_dev_info[''domain''], 16) > + out[''domain''] = "0x%04x" % domain > + out[''bus''] = "0x%02x" % int(pci_dev_info[''bus''], 16) > + out[''slot''] = "0x%02x" % int(pci_dev_info[''slot''], 16) > + out[''func''] = "0x%x" % int(pci_dev_info[''func''], 16) > + if pci_dev_info[''vslot''] == '''': > + vslot = AUTO_PHP_SLOT > + else: > + vslot = int(pci_dev_info[''vslot''], 16) > + out[''vslot''] = "0x%02x" % vslot > + if pci_dev_info[''opts''] != '''': > + out[''opts''] = split_pci_opts(pci_dev_info[''opts'']) > + check_pci_opts(out[''opts'']) > + > + return out > + > def parse_pci_name(pci_name_string): > - pci_match = re.match(r"((?P<domain>[0-9a-fA-F]{1,4})[:,])?" + \ > - r"(?P<bus>[0-9a-fA-F]{1,2})[:,]" + \ > - r"(?P<slot>[0-9a-fA-F]{1,2})[.,]" + \ > - r"(?P<func>[0-7])$", pci_name_string) > - if pci_match is None: > - raise PciDeviceParseError((''Failed to parse pci device name: %s'' % > - pci_name_string)) > - pci_dev_info = pci_match.groupdict(''0'') > - > - domain = parse_hex(pci_dev_info[''domain'']) > - bus = parse_hex(pci_dev_info[''bus'']) > - slot = parse_hex(pci_dev_info[''slot'']) > - func = parse_hex(pci_dev_info[''func'']) > + pci = parse_pci_name_extended(pci_name_string) > + > + if int(pci[''vslot''], 16) != AUTO_PHP_SLOT: > + raise PciDeviceParseError(("Failed to parse pci device: %s: " + > + "vslot provided where prohibited: %s") % > + (pci_name_string, pci[''vslot''])) > + if ''opts'' in pci: > + raise PciDeviceParseError(("Failed to parse pci device: %s: " + > + "options provided where prohibited: %s") % > + (pci_name_string, pci[''opts''])) > + > + return pci > + > +def __pci_dict_to_fmt_str(fmt, dev): > + return fmt % (int(dev[''domain''], 16), int(dev[''bus''], 16), > + int(dev[''slot''], 16), int(dev[''func''], 16)) > > - return (domain, bus, slot, func) > +def pci_dict_to_bdf_str(dev): > + return __pci_dict_to_fmt_str(''%04x:%02x:%02x.%01x'', dev) > + > +def pci_dict_to_xc_str(dev): > + return __pci_dict_to_fmt_str(''0x%x, 0x%x, 0x%x, 0x%x'', dev) > > def extract_the_exact_pci_names(pci_names): > result = [] > @@ -198,27 +238,7 @@ def get_all_pci_names(): > return pci_names > > def get_all_pci_devices(): > - pci_devs = [] > - for pci_name in get_all_pci_names(): > - pci_match = re.match(r"((?P<domain>[0-9a-fA-F]{1,4})[:,])?" + \ > - r"(?P<bus>[0-9a-fA-F]{1,2})[:,]" + \ > - r"(?P<slot>[0-9a-fA-F]{1,2})[.,]" + \ > - r"(?P<func>[0-7])$", pci_name) > - if pci_match is None: > - raise PciDeviceParseError((''Failed to parse pci device name: %s'' > % > - pci_name)) > - pci_dev_info = pci_match.groupdict(''0'') > - domain = parse_hex(pci_dev_info[''domain'']) > - bus = parse_hex(pci_dev_info[''bus'']) > - slot = parse_hex(pci_dev_info[''slot'']) > - func = parse_hex(pci_dev_info[''func'']) > - try: > - pci_dev = PciDevice(domain, bus, slot, func) > - except: > - continue > - pci_devs.append(pci_dev) > - > - return pci_devs > + return map(PciDevice, map(parse_pci_name, get_all_pci_names())) > > def _create_lspci_info(): > """Execute ''lspci'' command and parse the result. > @@ -241,7 +261,7 @@ def _create_lspci_info(): > try: > (opt, value) = line.split('':\t'') > if opt == ''Slot'' or (opt == ''Device'' and first_device): > - device_name = PCI_DEV_FORMAT_STR % parse_pci_name(value) > + device_name = pci_dict_to_bdf_str(parse_pci_name(value)) > first_device = False > else: > device_info[opt] = value > @@ -292,8 +312,7 @@ def find_all_devices_owned_by_pciback(): > pci_list = extract_the_exact_pci_names(pci_names) > dev_list = [] > for pci in pci_list: > - (dom, b, d, f) = parse_pci_name(pci) > - dev = PciDevice(dom, b, d, f) > + dev = PciDevice(parse_pci_name(pci)) > dev_list = dev_list + [dev] > return dev_list > > @@ -400,12 +419,12 @@ class PciDeviceVslotMissing(Exception): > return ''pci: no vslot: '' + self.message > > class PciDevice: > - def __init__(self, domain, bus, slot, func): > - self.domain = domain > - self.bus = bus > - self.slot = slot > - self.func = func > - self.name = PCI_DEV_FORMAT_STR % (domain, bus, slot, func) > + def __init__(self, dev): > + self.domain = int(dev[''domain''], 16) > + self.bus = int(dev[''bus''], 16) > + self.slot = int(dev[''slot''], 16) > + self.func = int(dev[''func''], 16) > + self.name = pci_dict_to_bdf_str(dev) > self.cfg_space_path = find_sysfs_mnt()+SYSFS_PCI_DEVS_PATH+''/''+ \ > self.name + SYSFS_PCI_DEV_CONFIG_PATH > self.irq = 0 > @@ -447,14 +466,15 @@ class PciDevice: > # We have reached the upmost one. > return None > else: > + dev = {} > lst = parent.split('':'') > - dom = int(lst[0], 16) > - bus = int(lst[1], 16) > + dev[''domain''] = int(lst[0], 16) > + dev[''bus''] = int(lst[1], 16) > lst = lst[2] > lst = lst.split(''.'') > - dev = int(lst[0], 16) > - func = int(lst[1], 16) > - return (dom, bus, dev, func) > + dev[''slot''] = int(lst[0], 16) > + dev[''func''] = int(lst[1], 16) > + return dev > except OSError, (errno, strerr): > raise PciDeviceParseError(''Can not locate the parent of %s'', > self.name) > @@ -464,15 +484,13 @@ class PciDevice: > dev = self.find_parent() > if dev is None: > return None > - (dom, b, d, f) = dev > - dev = dev_parent = PciDevice(dom, b, d, f) > + dev = dev_parent = PciDevice(dev) > while dev_parent.dev_type != DEV_TYPE_PCIe_BRIDGE: > parent = dev_parent.find_parent() > if parent is None: > break > - (dom, b, d, f) = parent > dev = dev_parent > - dev_parent = PciDevice(dom, b, d, f) > + dev_parent = PciDevice(parent) > return dev > > def find_all_devices_behind_the_bridge(self, ignore_bridge): > @@ -483,8 +501,7 @@ class PciDevice: > > list = [self.name] > for pci_str in dev_list: > - (dom, b, d, f) = parse_pci_name(pci_str) > - dev = PciDevice(dom, b, d, f) > + dev = PciDevice(parse_pci_name(pci_str)) > if dev.dev_type == DEV_TYPE_PCI_BRIDGE or \ > dev.dev_type == DEV_TYPE_PCIe_BRIDGE: > sub_list_including_self = \ > @@ -600,7 +617,7 @@ class PciDevice: > > def find_all_the_multi_functions(self): > sysfs_mnt = find_sysfs_mnt() > - parent = PCI_DEV_FORMAT_STR % self.find_parent() > + parent = pci_dict_to_bdf_str(self.find_parent()) > pci_names = os.popen(''ls '' + sysfs_mnt + SYSFS_PCI_DEVS_PATH + ''/'' + > \ > parent + ''/'').read() > funcs = extract_the_exact_pci_names(pci_names) > @@ -758,8 +775,7 @@ class PciDevice: > if len(devs) == 0: > return > for pci_dev in devs: > - (dom, b, d, f) = parse_pci_name(pci_dev) > - dev = PciDevice(dom, b, d, f) > + dev = PciDevice(parse_pci_name(pci_dev)) > if dev.driver == ''pciback'': > continue > err_msg = ''pci: %s must be co-assigned to the same guest with %s'' > + \ > @@ -785,7 +801,7 @@ class PciDevice: > funcs = self.find_all_the_multi_functions() > self.devs_check_driver(funcs) > > - parent = ''%04x:%02x:%02x.%01x'' % self.find_parent() > + parent = pci_dict_to_bdf_str(self.find_parent()) > > # Do Secondary Bus Reset. > self.do_secondary_bus_reset(parent, funcs) > Index: xen-unstable.hg/tools/python/xen/xend/XendDomainInfo.py > ==================================================================> --- xen-unstable.hg.orig/tools/python/xen/xend/XendDomainInfo.py > 2009-06-16 22:48:34.000000000 +1000 > +++ xen-unstable.hg/tools/python/xen/xend/XendDomainInfo.py 2009-06-16 > 22:49:32.000000000 +1000 > @@ -39,7 +39,8 @@ from xen.util import asserts, auxbin > from xen.util.blkif import blkdev_uname_to_file, blkdev_uname_to_taptype > import xen.util.xsm.xsm as security > from xen.util import xsconstants > -from xen.util.pci import serialise_pci_opts, pci_opts_list_to_sxp > +from xen.util.pci import serialise_pci_opts, pci_opts_list_to_sxp, \ > + pci_dict_to_bdf_str, pci_dict_to_xc_str > > from xen.xend import balloon, sxp, uuid, image, arch > from xen.xend import XendOptions, XendNode, XendConfig > @@ -310,9 +311,8 @@ def do_FLR(domid): > dev_str_list = get_assigned_pci_devices(domid) > > for dev_str in dev_str_list: > - (dom, b, d, f) = parse_pci_name(dev_str) > try: > - dev = PciDevice(dom, b, d, f) > + dev = PciDevice(parse_pci_name(dev_str)) > except Exception, e: > raise VmError("pci: failed to locate device and "+ > "parse it''s resources - "+str(e)) > @@ -652,23 +652,15 @@ class XendDomainInfo: > raise VmError("device is already inserted") > > # Test whether the devices can be assigned with VT-d > - pci_str = "%s, %s, %s, %s" % (new_dev[''domain''], > - new_dev[''bus''], > - new_dev[''slot''], > - new_dev[''func'']) > - bdf = xc.test_assign_device(0, pci_str) > + bdf = xc.test_assign_device(0, pci_dict_to_xc_str(new_dev)) > if bdf != 0: > if bdf == -1: > raise VmError("failed to assign device: maybe the platform" > " doesn''t support VT-d, or VT-d isn''t enabled" > " properly?") > - bus = (bdf >> 16) & 0xff > - devfn = (bdf >> 8) & 0xff > - dev = (devfn >> 3) & 0x1f > - func = devfn & 0x7 > - raise VmError("fail to assign device(%x:%x.%x): maybe it has" > + raise VmError("fail to assign device(%s): maybe it has" > " already been assigned to other domain, or maybe" > - " it doesn''t exist." % (bus, dev, func)) > + " it doesn''t exist." % > pci_dict_to_bdf_str(new_dev)) > > # Here, we duplicate some checkings (in some cases, we mustn''t allow > # a device to be hot-plugged into an HVM guest) that are also done in > @@ -680,12 +672,8 @@ class XendDomainInfo: > # Test whether the device is owned by pciback. For instance, we can''t > # hotplug a device being used by Dom0 itself to an HVM guest. > from xen.xend.server.pciif import PciDevice, parse_pci_name > - domain = int(new_dev[''domain''],16) > - bus = int(new_dev[''bus''],16) > - dev = int(new_dev[''slot''],16) > - func = int(new_dev[''func''],16) > try: > - pci_device = PciDevice(domain, bus, dev, func) > + pci_device = PciDevice(new_dev) > except Exception, e: > raise VmError("pci: failed to locate device and "+ > "parse it''s resources - "+str(e)) > @@ -710,9 +698,8 @@ class XendDomainInfo: > pci_device.devs_check_driver(coassignment_list) > assigned_pci_device_str_list = self._get_assigned_pci_devices() > for pci_str in coassignment_list: > - (domain, bus, dev, func) = parse_pci_name(pci_str) > - dev_str = ''0x%x,0x%x,0x%x,0x%x'' % (domain, bus, dev, func) > - if xc.test_assign_device(0, dev_str) == 0: > + pci_dev = parse_pci_name(pci_str) > + if xc.test_assign_device(0, pci_dict_to_xc_str(pci_dev)) == 0: > continue > if not pci_str in assigned_pci_device_str_list: > raise VmError(("pci: failed to pci-attach %s to domain %s" + > \ > @@ -742,12 +729,9 @@ class XendDomainInfo: > if new_dev.has_key(''opts''): > opts = '','' + serialise_pci_opts(new_dev[''opts'']) > > - bdf_str = "%s:%s:%s.%s@%s%s" % (new_dev[''domain''], > - new_dev[''bus''], > - new_dev[''slot''], > - new_dev[''func''], > - new_dev[''vslot''], > - opts) > + bdf_str = "%s@%02x%s" % (pci_dict_to_bdf_str(new_dev), > + int(new_dev[''vslot''], 16), opts) > + log.debug("XendDomainInfo.hvm_pci_device_insert_dev: %s" % > bdf_str) > self.image.signalDeviceModel(''pci-ins'', ''pci-inserted'', bdf_str) > > vslot > xstransact.Read("/local/domain/0/device-model/%i/parameter" > @@ -864,9 +848,8 @@ class XendDomainInfo: > vslot = x[''vslot''] > break > if vslot == "": > - raise VmError("Device %04x:%02x:%02x.%01x is not > connected" > - % (int(dev[''domain''],16), > int(dev[''bus''],16), > - int(dev[''slot''],16), > int(dev[''func''],16))) > + raise VmError("Device %s is not connected" % > + pci_dict_to_bdf_str(dev)) > self.hvm_destroyPCIDevice(int(vslot, 16)) > # Update vslot > dev[''vslot''] = vslot > @@ -1152,12 +1135,8 @@ class XendDomainInfo: > # list of D''s co-assignment devices, DD is not assigned (to domN). > # > from xen.xend.server.pciif import PciDevice > - domain = int(x[''domain''],16) > - bus = int(x[''bus''],16) > - dev = int(x[''slot''],16) > - func = int(x[''func''],16) > try: > - pci_device = PciDevice(domain, bus, dev, func) > + pci_device = PciDevice(x) > except Exception, e: > raise VmError("pci: failed to locate device and "+ > "parse it''s resources - "+str(e)) > @@ -1172,9 +1151,8 @@ class XendDomainInfo: > )% (pci_device.name, self.info[''name_label''], pci_str)) > > > - bdf_str = "%s:%s:%s.%s" % (x[''domain''], x[''bus''], x[''slot''], > x[''func'']) > + bdf_str = pci_dict_to_bdf_str(x) > log.info("hvm_destroyPCIDevice:%s:%s!", x, bdf_str) > - > if self.domid is not None: > self.image.signalDeviceModel(''pci-rem'', ''pci-removed'', bdf_str) > > @@ -1338,21 +1316,12 @@ class XendDomainInfo: > if self.domid is not None: > return get_assigned_pci_devices(self.domid) > > - dev_str_list = [] > dev_info = self._getDeviceInfo_pci(devid) > if dev_info is None: > - return dev_str_list > + return [] > dev_uuid = sxp.child_value(dev_info, ''uuid'') > pci_conf = self.info[''devices''][dev_uuid][1] > - pci_devs = pci_conf[''devs''] > - for pci_dev in pci_devs: > - domain = int(pci_dev[''domain''], 16) > - bus = int(pci_dev[''bus''], 16) > - slot = int(pci_dev[''slot''], 16) > - func = int(pci_dev[''func''], 16) > - dev_str = "%04x:%02x:%02x.%01x" % (domain, bus, slot, func) > - dev_str_list = dev_str_list + [dev_str] > - return dev_str_list > + return map(pci_dict_to_bdf_str, pci_conf[''devs'']) > > def setMemoryTarget(self, target): > """Set the memory target of this domain. > @@ -3909,12 +3878,12 @@ class XendDomainInfo: > target_dev = None > new_pci_sxp = [''pci''] > for dev in sxp.children(old_pci_sxp, ''dev''): > - domain = int(sxp.child_value(dev, ''domain''), 16) > - bus = int(sxp.child_value(dev, ''bus''), 16) > - slot = int(sxp.child_value(dev, ''slot''), 16) > - func = int(sxp.child_value(dev, ''func''), 16) > - name = "%04x:%02x:%02x.%01x" % (domain, bus, slot, func) > - if ppci.get_name() == name: > + pci_dev = {} > + pci_dev[''domain''] = sxp.child_value(dev, ''domain'') > + pci_dev[''bus''] = sxp.child_value(dev, ''bus'') > + pci_dev[''slot''] = sxp.child_value(dev, ''slot'') > + pci_dev[''func''] = sxp.child_value(dev, ''func'') > + if ppci.get_name() == pci_dict_to_bdf_str(pci_dev): > target_dev = dev > else: > new_pci_sxp.append(dev) > Index: xen-unstable.hg/tools/python/xen/xend/XendNode.py > ==================================================================> --- xen-unstable.hg.orig/tools/python/xen/xend/XendNode.py 2009-06-16 > 22:48:34.000000000 +1000 > +++ xen-unstable.hg/tools/python/xen/xend/XendNode.py 2009-06-16 > 22:49:32.000000000 +1000 > @@ -340,8 +340,7 @@ class XendNode: > except KeyError: > pass > > - (domain, bus, slot, func) = PciUtil.parse_pci_name(pci_name) > - pci_dev = PciUtil.PciDevice(domain, bus, slot, func) > + pci_dev = PciUtil.PciDevice(PciUtil.parse_pci_name(pci_name)) > ppci_record = { > ''domain'': pci_dev.domain, > ''bus'': pci_dev.bus, > Index: xen-unstable.hg/tools/python/xen/xend/server/pciif.py > ==================================================================> --- xen-unstable.hg.orig/tools/python/xen/xend/server/pciif.py 2009-06-16 > 22:48:34.000000000 +1000 > +++ xen-unstable.hg/tools/python/xen/xend/server/pciif.py 2009-06-16 > 22:49:32.000000000 +1000 > @@ -130,13 +130,7 @@ class PciController(DevController): > log.debug(''Reconfiguring PCI device %s.'' % dev) > attaching = False > > - (domain, bus, slotfunc) = dev.split('':'') > - (slot, func) = slotfunc.split(''.'') > - domain = parse_hex(domain) > - bus = parse_hex(bus) > - slot = parse_hex(slot) > - func = parse_hex(func) > - self.setupOneDevice(domain, bus, slot, func) > + self.setupOneDevice(parse_pci_name(dev)) > > self.writeBackend(devid, ''dev-%i'' % devno, dev) > self.writeBackend(devid, ''state-%i'' % devno, > @@ -248,15 +242,13 @@ class PciController(DevController): > 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) > + for i in group_str.split('',''): > + if i == '''': > + continue > + pci_dev = parse_pci_name(i) > + pci_dev[''domain''] = ''%04x'' % dev.domain > try: > - sdev = PciDevice(dev.domain, b, d, f) > + sdev = PciDevice(pci_dev) > except Exception, e: > #no dom0 drivers bound to sdev > continue > @@ -270,13 +262,13 @@ class PciController(DevController): > )%(sdev.name, dev.name)) > return > > - def setupOneDevice(self, domain, bus, slot, func): > + def setupOneDevice(self, pci_dev): > """ Attach I/O resources for device to frontend domain > """ > fe_domid = self.getDomid() > > try: > - dev = PciDevice(domain, bus, slot, func) > + dev = PciDevice(pci_dev) > except Exception, e: > raise VmError("pci: failed to locate device and "+ > "parse it''s resources - "+str(e)) > @@ -305,12 +297,11 @@ class PciController(DevController): > > if not self.vm.info.is_hvm(): > # Setup IOMMU device assignment > - pci_str = "0x%x, 0x%x, 0x%x, 0x%x" % (domain, bus, slot, func) > - bdf = xc.assign_device(fe_domid, pci_str) > + bdf = xc.assign_device(fe_domid, pci_dict_to_xc_str(pci_dev)) > + pci_str = pci_dict_to_bdf_str(pci_dev) > if bdf > 0: > - raise VmError("Failed to assign device to IOMMU (%x:%x.%x)" > - % (bus, slot, func)) > - log.debug("pci: assign device %x:%x.%x" % (bus, slot, func)) > + raise VmError("Failed to assign device to IOMMU (%s)" % > pci_str) > + log.debug("pci: assign device %s" % pci_str) > > for (start, size) in dev.ioports: > log.debug(''pci: enabling ioport 0x%x/0x%x''%(start,size)) > @@ -366,23 +357,15 @@ class PciController(DevController): > def setupDevice(self, config): > """Setup devices from config > """ > - pci_str_list = [] > - pci_dev_list = [] > - for pci_config in config.get(''devs'', []): > - domain = parse_hex(pci_config.get(''domain'', 0)) > - bus = parse_hex(pci_config.get(''bus'', 0)) > - slot = parse_hex(pci_config.get(''slot'', 0)) > - func = parse_hex(pci_config.get(''func'', 0)) > - pci_str = ''%04x:%02x:%02x.%01x'' % (domain, bus, slot, func) > - pci_str_list = pci_str_list + [pci_str] > - pci_dev_list = pci_dev_list + [(domain, bus, slot, func)] > + pci_dev_list = config.get(''devs'', []) > + pci_str_list = map(pci_dict_to_bdf_str, pci_dev_list) > > if len(pci_str_list) != len(set(pci_str_list)): > raise VmError(''pci: duplicate devices specified in guest > config?'') > > - for (domain, bus, slot, func) in pci_dev_list: > + for pci_dev in pci_dev_list: > try: > - dev = PciDevice(domain, bus, slot, func) > + dev = PciDevice(pci_dev) > except Exception, e: > raise VmError("pci: failed to locate device and "+ > "parse it''s resources - "+str(e)) > @@ -427,9 +410,7 @@ class PciController(DevController): > dev.devs_check_driver(devs_str) > for s in devs_str: > if not s in pci_str_list: > - (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_pci_str > pci_dict_to_bdf_str(parse_pci_name(s)) > # 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''+\ > @@ -453,13 +434,13 @@ class PciController(DevController): > return True > > > - def cleanupOneDevice(self, domain, bus, slot, func): > + def cleanupOneDevice(self, pci_dev): > """ Detach I/O resources for device from frontend domain > """ > fe_domid = self.getDomid() > > try: > - dev = PciDevice(domain, bus, slot, func) > + dev = PciDevice(pci_dev) > except Exception, e: > raise VmError("pci: failed to locate device and "+ > "parse it''s resources - "+str(e)) > @@ -476,12 +457,11 @@ class PciController(DevController): > # DMA transaction, etc > dev.do_FLR() > > - pci_str = "0x%x, 0x%x, 0x%x, 0x%x" % (domain, bus, slot, func) > - bdf = xc.deassign_device(fe_domid, pci_str) > + bdf = xc.deassign_device(fe_domid, pci_dict_to_xc_str(pci_dev)) > + pci_str = pci_dict_to_bdf_str(pci_dev) > if bdf > 0: > - raise VmError("Failed to deassign device from IOMMU (%x:%x.%x)" > - % (bus, slot, func)) > - log.debug("pci: Deassign device %x:%x.%x" % (bus, slot, func)) > + raise VmError("Failed to deassign device from IOMMU (%s)" % > pci_str) > + log.debug("pci: Deassign device %s" % pci_str) > > for (start, size) in dev.ioports: > log.debug(''pci: disabling ioport 0x%x/0x%x''%(start,size)) > @@ -530,15 +510,9 @@ class PciController(DevController): > state = int(self.readBackend(devid, ''state-%i'' % i)) > if state == xenbusState[''Closing'']: > # Detach I/O resources. > - dev = self.readBackend(devid, ''dev-%i'' % i) > - (domain, bus, slotfunc) = dev.split('':'') > - (slot, func) = slotfunc.split(''.'') > - domain = parse_hex(domain) > - bus = parse_hex(bus) > - slot = parse_hex(slot) > - func = parse_hex(func) > + pci_dev = parse_pci_name(self.readBackend(devid, ''dev-%i'' % > i)) > # In HVM case, I/O resources are disabled in ioemu. > - self.cleanupOneDevice(domain, bus, slot, func) > + self.cleanupOneDevice(pci_dev) > # Remove xenstore nodes. > list = [''dev'', ''vdev'', ''state'', ''uuid'', ''vslot''] > if self.readBackend(devid, ''opts-%i'' % i) is not None: > > -- > > _______________________________________________ > 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
Cui, Dexuan
2009-Jun-16 15:58 UTC
RE: [Xen-devel] [patch 1/8] xend: pass-through: Common parse_pci_name()
The staging tree''s c/s 19770 breaks creating guest: [root@localhost xen]# xm cr /opt/my.hvm Unexpected error: exceptions.ImportError Please report to xen-devel@lists.xensource.com Traceback (most recent call last): File "/usr/sbin/xm", line 7, in ? main.main(sys.argv) File "/usr/lib64/python2.4/site-packages/xen/xm/main.py", line 3219, in main _, rc = _run_cmd(cmd, cmd_name, args) File "/usr/lib64/python2.4/site-packages/xen/xm/main.py", line 3243, in _run_cmd return True, cmd(args) File "<string>", line 1, in <lambda> File "/usr/lib64/python2.4/site-packages/xen/xm/main.py", line 1392, in xm_importcommand cmd = __import__(command, globals(), locals(), ''xen.xm'') File "/usr/lib64/python2.4/site-packages/xen/xm/create.py", line 41, in ? from xen.util.pci import pci_opts_list_to_sxp, \ ImportError: cannot import name parse_pci_name_extended Looks it''s just because some patches of Simon haven''t been checked in, like "[patch 1/8] xend: pass-through: Common parse_pci_name()". Thanks, -- Dexuan -----Original Message----- From: Keir Fraser [mailto:keir.fraser@eu.citrix.com] Sent: 2009?6?16? 21:45 To: Simon Horman; xen-devel@lists.xensource.com Cc: Akio Takebe; Masaki Kanno; Cui, Dexuan Subject: Re: [Xen-devel] [patch 1/8] xend: pass-through: Common parse_pci_name() Still not applying at my end. It could be the in-line patch is getting munged somewhere down the line. Feel free to send the patches to me privately as a bunch of attachments in a single email. -- Keir On 16/06/2009 14:00, "Simon Horman" <horms@verge.net.au> wrote:> Share some parsing code between different parts of xm. > > This has the side-effect that the device specification for > hot-plug may now include the VSLOT and OPTS as per device > specifictions in the domain configuration file. > > SEQ:BUS:DEV.FUNC[,OPT...] > > e.g. 0000:00:01.00@6 > > Cc: Dexuan Cui <dexuan.cui@intel.com> > Cc: Masaki Kanno <kanno.masaki@jp.fujitsu.com> > Cc: Akio Takebe <takebe_akio@jp.fujitsu.com> > Signed-off-by: Simon Horman <horms@verge.net.au> > > --- > > Wed, 20 May 2009 23:07:42 +1000 > * Fix syntax errors in parse_pci_name() and parse_pci_name_bdf6() > - unnoticed as they were resolved by the subsequent patch > "xm: Allow multi-function device specifications to be parsed > * Enhanced error reporting in parse_pci_name() > * Have parse_pci_name_bdf6() return an int rather than a string for vslot in > keeping with the other integer elements of the bdf6 tuple > > Fri, 22 May 2009 15:52:50 +1000 > * Consolidate get_all_pci_bdf6() and get_all_pci_devices() > > Thu, 28 May 2009 23:56:14 +1000 > * Up-port > > Tue, 16 Jun 2009 18:37:05 +1000 > * In find_parent(), dev[''dom''] should be dev[''domain'']. > Pointed out by Takebe-san. > > Tue, 16 Jun 2009 22:53:18 +1000 > * Up-port to xen-unstable.hg 19763 > > Index: xen-unstable.hg/tools/python/xen/util/pci.py > ==================================================================> --- xen-unstable.hg.orig/tools/python/xen/util/pci.py 2009-06-16 > 22:48:34.000000000 +1000 > +++ xen-unstable.hg/tools/python/xen/util/pci.py 2009-06-16 > 22:49:32.000000000 +1000 > @@ -15,6 +15,7 @@ import time > import threading > from xen.util import utils > from xen.xend import sxp > +from xen.xend.XendConstants import AUTO_PHP_SLOT > > PROC_PCI_PATH = ''/proc/bus/pci/devices'' > PROC_PCI_NUM_RESOURCES = 7 > @@ -35,7 +36,6 @@ LSPCI_CMD = ''lspci'' > > PCI_DEV_REG_EXPRESS_STR = r"[0-9a-fA-F]{4}:[0-9a-fA-F]{2}:[0-9a-fA-F]{2}."+ \ > r"[0-9a-fA-F]{1}" > -PCI_DEV_FORMAT_STR = ''%04x:%02x:%02x.%01x'' > > DEV_TYPE_PCIe_ENDPOINT = 0 > DEV_TYPE_PCIe_BRIDGE = 1 > @@ -148,22 +148,62 @@ def parse_hex(val): > except ValueError: > return None > > +def parse_pci_name_extended(pci_dev_str): > + pci_match = re.match(r"((?P<domain>[0-9a-fA-F]{1,4})[:,])?" + > + r"(?P<bus>[0-9a-fA-F]{1,2})[:,]" + > + r"(?P<slot>[0-9a-fA-F]{1,2})[.,]" + > + r"(?P<func>(\*|[0-7]))" + > + r"(@(?P<vslot>[01]?[0-9a-fA-F]))?" + > + r"(,(?P<opts>.*))?$", pci_dev_str) > + > + if pci_match == None: > + raise PciDeviceParseError("Failed to parse pci device: %s" % > + pci_dev_str) > + > + out = {} > + pci_dev_info = pci_match.groupdict('''') > + if pci_dev_info[''domain''] == '''': > + domain = 0 > + else: > + domain = int(pci_dev_info[''domain''], 16) > + out[''domain''] = "0x%04x" % domain > + out[''bus''] = "0x%02x" % int(pci_dev_info[''bus''], 16) > + out[''slot''] = "0x%02x" % int(pci_dev_info[''slot''], 16) > + out[''func''] = "0x%x" % int(pci_dev_info[''func''], 16) > + if pci_dev_info[''vslot''] == '''': > + vslot = AUTO_PHP_SLOT > + else: > + vslot = int(pci_dev_info[''vslot''], 16) > + out[''vslot''] = "0x%02x" % vslot > + if pci_dev_info[''opts''] != '''': > + out[''opts''] = split_pci_opts(pci_dev_info[''opts'']) > + check_pci_opts(out[''opts'']) > + > + return out > + > def parse_pci_name(pci_name_string): > - pci_match = re.match(r"((?P<domain>[0-9a-fA-F]{1,4})[:,])?" + \ > - r"(?P<bus>[0-9a-fA-F]{1,2})[:,]" + \ > - r"(?P<slot>[0-9a-fA-F]{1,2})[.,]" + \ > - r"(?P<func>[0-7])$", pci_name_string) > - if pci_match is None: > - raise PciDeviceParseError((''Failed to parse pci device name: %s'' % > - pci_name_string)) > - pci_dev_info = pci_match.groupdict(''0'') > - > - domain = parse_hex(pci_dev_info[''domain'']) > - bus = parse_hex(pci_dev_info[''bus'']) > - slot = parse_hex(pci_dev_info[''slot'']) > - func = parse_hex(pci_dev_info[''func'']) > + pci = parse_pci_name_extended(pci_name_string) > + > + if int(pci[''vslot''], 16) != AUTO_PHP_SLOT: > + raise PciDeviceParseError(("Failed to parse pci device: %s: " + > + "vslot provided where prohibited: %s") % > + (pci_name_string, pci[''vslot''])) > + if ''opts'' in pci: > + raise PciDeviceParseError(("Failed to parse pci device: %s: " + > + "options provided where prohibited: %s") % > + (pci_name_string, pci[''opts''])) > + > + return pci > + > +def __pci_dict_to_fmt_str(fmt, dev): > + return fmt % (int(dev[''domain''], 16), int(dev[''bus''], 16), > + int(dev[''slot''], 16), int(dev[''func''], 16)) > > - return (domain, bus, slot, func) > +def pci_dict_to_bdf_str(dev): > + return __pci_dict_to_fmt_str(''%04x:%02x:%02x.%01x'', dev) > + > +def pci_dict_to_xc_str(dev): > + return __pci_dict_to_fmt_str(''0x%x, 0x%x, 0x%x, 0x%x'', dev) > > def extract_the_exact_pci_names(pci_names): > result = [] > @@ -198,27 +238,7 @@ def get_all_pci_names(): > return pci_names > > def get_all_pci_devices(): > - pci_devs = [] > - for pci_name in get_all_pci_names(): > - pci_match = re.match(r"((?P<domain>[0-9a-fA-F]{1,4})[:,])?" + \ > - r"(?P<bus>[0-9a-fA-F]{1,2})[:,]" + \ > - r"(?P<slot>[0-9a-fA-F]{1,2})[.,]" + \ > - r"(?P<func>[0-7])$", pci_name) > - if pci_match is None: > - raise PciDeviceParseError((''Failed to parse pci device name: %s'' > % > - pci_name)) > - pci_dev_info = pci_match.groupdict(''0'') > - domain = parse_hex(pci_dev_info[''domain'']) > - bus = parse_hex(pci_dev_info[''bus'']) > - slot = parse_hex(pci_dev_info[''slot'']) > - func = parse_hex(pci_dev_info[''func'']) > - try: > - pci_dev = PciDevice(domain, bus, slot, func) > - except: > - continue > - pci_devs.append(pci_dev) > - > - return pci_devs > + return map(PciDevice, map(parse_pci_name, get_all_pci_names())) > > def _create_lspci_info(): > """Execute ''lspci'' command and parse the result. > @@ -241,7 +261,7 @@ def _create_lspci_info(): > try: > (opt, value) = line.split('':\t'') > if opt == ''Slot'' or (opt == ''Device'' and first_device): > - device_name = PCI_DEV_FORMAT_STR % parse_pci_name(value) > + device_name = pci_dict_to_bdf_str(parse_pci_name(value)) > first_device = False > else: > device_info[opt] = value > @@ -292,8 +312,7 @@ def find_all_devices_owned_by_pciback(): > pci_list = extract_the_exact_pci_names(pci_names) > dev_list = [] > for pci in pci_list: > - (dom, b, d, f) = parse_pci_name(pci) > - dev = PciDevice(dom, b, d, f) > + dev = PciDevice(parse_pci_name(pci)) > dev_list = dev_list + [dev] > return dev_list > > @@ -400,12 +419,12 @@ class PciDeviceVslotMissing(Exception): > return ''pci: no vslot: '' + self.message > > class PciDevice: > - def __init__(self, domain, bus, slot, func): > - self.domain = domain > - self.bus = bus > - self.slot = slot > - self.func = func > - self.name = PCI_DEV_FORMAT_STR % (domain, bus, slot, func) > + def __init__(self, dev): > + self.domain = int(dev[''domain''], 16) > + self.bus = int(dev[''bus''], 16) > + self.slot = int(dev[''slot''], 16) > + self.func = int(dev[''func''], 16) > + self.name = pci_dict_to_bdf_str(dev) > self.cfg_space_path = find_sysfs_mnt()+SYSFS_PCI_DEVS_PATH+''/''+ \ > self.name + SYSFS_PCI_DEV_CONFIG_PATH > self.irq = 0 > @@ -447,14 +466,15 @@ class PciDevice: > # We have reached the upmost one. > return None > else: > + dev = {} > lst = parent.split('':'') > - dom = int(lst[0], 16) > - bus = int(lst[1], 16) > + dev[''domain''] = int(lst[0], 16) > + dev[''bus''] = int(lst[1], 16) > lst = lst[2] > lst = lst.split(''.'') > - dev = int(lst[0], 16) > - func = int(lst[1], 16) > - return (dom, bus, dev, func) > + dev[''slot''] = int(lst[0], 16) > + dev[''func''] = int(lst[1], 16) > + return dev > except OSError, (errno, strerr): > raise PciDeviceParseError(''Can not locate the parent of %s'', > self.name) > @@ -464,15 +484,13 @@ class PciDevice: > dev = self.find_parent() > if dev is None: > return None > - (dom, b, d, f) = dev > - dev = dev_parent = PciDevice(dom, b, d, f) > + dev = dev_parent = PciDevice(dev) > while dev_parent.dev_type != DEV_TYPE_PCIe_BRIDGE: > parent = dev_parent.find_parent() > if parent is None: > break > - (dom, b, d, f) = parent > dev = dev_parent > - dev_parent = PciDevice(dom, b, d, f) > + dev_parent = PciDevice(parent) > return dev > > def find_all_devices_behind_the_bridge(self, ignore_bridge): > @@ -483,8 +501,7 @@ class PciDevice: > > list = [self.name] > for pci_str in dev_list: > - (dom, b, d, f) = parse_pci_name(pci_str) > - dev = PciDevice(dom, b, d, f) > + dev = PciDevice(parse_pci_name(pci_str)) > if dev.dev_type == DEV_TYPE_PCI_BRIDGE or \ > dev.dev_type == DEV_TYPE_PCIe_BRIDGE: > sub_list_including_self = \ > @@ -600,7 +617,7 @@ class PciDevice: > > def find_all_the_multi_functions(self): > sysfs_mnt = find_sysfs_mnt() > - parent = PCI_DEV_FORMAT_STR % self.find_parent() > + parent = pci_dict_to_bdf_str(self.find_parent()) > pci_names = os.popen(''ls '' + sysfs_mnt + SYSFS_PCI_DEVS_PATH + ''/'' + > \ > parent + ''/'').read() > funcs = extract_the_exact_pci_names(pci_names) > @@ -758,8 +775,7 @@ class PciDevice: > if len(devs) == 0: > return > for pci_dev in devs: > - (dom, b, d, f) = parse_pci_name(pci_dev) > - dev = PciDevice(dom, b, d, f) > + dev = PciDevice(parse_pci_name(pci_dev)) > if dev.driver == ''pciback'': > continue > err_msg = ''pci: %s must be co-assigned to the same guest with %s'' > + \ > @@ -785,7 +801,7 @@ class PciDevice: > funcs = self.find_all_the_multi_functions() > self.devs_check_driver(funcs) > > - parent = ''%04x:%02x:%02x.%01x'' % self.find_parent() > + parent = pci_dict_to_bdf_str(self.find_parent()) > > # Do Secondary Bus Reset. > self.do_secondary_bus_reset(parent, funcs) > Index: xen-unstable.hg/tools/python/xen/xend/XendDomainInfo.py > ==================================================================> --- xen-unstable.hg.orig/tools/python/xen/xend/XendDomainInfo.py > 2009-06-16 22:48:34.000000000 +1000 > +++ xen-unstable.hg/tools/python/xen/xend/XendDomainInfo.py 2009-06-16 > 22:49:32.000000000 +1000 > @@ -39,7 +39,8 @@ from xen.util import asserts, auxbin > from xen.util.blkif import blkdev_uname_to_file, blkdev_uname_to_taptype > import xen.util.xsm.xsm as security > from xen.util import xsconstants > -from xen.util.pci import serialise_pci_opts, pci_opts_list_to_sxp > +from xen.util.pci import serialise_pci_opts, pci_opts_list_to_sxp, \ > + pci_dict_to_bdf_str, pci_dict_to_xc_str > > from xen.xend import balloon, sxp, uuid, image, arch > from xen.xend import XendOptions, XendNode, XendConfig > @@ -310,9 +311,8 @@ def do_FLR(domid): > dev_str_list = get_assigned_pci_devices(domid) > > for dev_str in dev_str_list: > - (dom, b, d, f) = parse_pci_name(dev_str) > try: > - dev = PciDevice(dom, b, d, f) > + dev = PciDevice(parse_pci_name(dev_str)) > except Exception, e: > raise VmError("pci: failed to locate device and "+ > "parse it''s resources - "+str(e)) > @@ -652,23 +652,15 @@ class XendDomainInfo: > raise VmError("device is already inserted") > > # Test whether the devices can be assigned with VT-d > - pci_str = "%s, %s, %s, %s" % (new_dev[''domain''], > - new_dev[''bus''], > - new_dev[''slot''], > - new_dev[''func'']) > - bdf = xc.test_assign_device(0, pci_str) > + bdf = xc.test_assign_device(0, pci_dict_to_xc_str(new_dev)) > if bdf != 0: > if bdf == -1: > raise VmError("failed to assign device: maybe the platform" > " doesn''t support VT-d, or VT-d isn''t enabled" > " properly?") > - bus = (bdf >> 16) & 0xff > - devfn = (bdf >> 8) & 0xff > - dev = (devfn >> 3) & 0x1f > - func = devfn & 0x7 > - raise VmError("fail to assign device(%x:%x.%x): maybe it has" > + raise VmError("fail to assign device(%s): maybe it has" > " already been assigned to other domain, or maybe" > - " it doesn''t exist." % (bus, dev, func)) > + " it doesn''t exist." % > pci_dict_to_bdf_str(new_dev)) > > # Here, we duplicate some checkings (in some cases, we mustn''t allow > # a device to be hot-plugged into an HVM guest) that are also done in > @@ -680,12 +672,8 @@ class XendDomainInfo: > # Test whether the device is owned by pciback. For instance, we can''t > # hotplug a device being used by Dom0 itself to an HVM guest. > from xen.xend.server.pciif import PciDevice, parse_pci_name > - domain = int(new_dev[''domain''],16) > - bus = int(new_dev[''bus''],16) > - dev = int(new_dev[''slot''],16) > - func = int(new_dev[''func''],16) > try: > - pci_device = PciDevice(domain, bus, dev, func) > + pci_device = PciDevice(new_dev) > except Exception, e: > raise VmError("pci: failed to locate device and "+ > "parse it''s resources - "+str(e)) > @@ -710,9 +698,8 @@ class XendDomainInfo: > pci_device.devs_check_driver(coassignment_list) > assigned_pci_device_str_list = self._get_assigned_pci_devices() > for pci_str in coassignment_list: > - (domain, bus, dev, func) = parse_pci_name(pci_str) > - dev_str = ''0x%x,0x%x,0x%x,0x%x'' % (domain, bus, dev, func) > - if xc.test_assign_device(0, dev_str) == 0: > + pci_dev = parse_pci_name(pci_str) > + if xc.test_assign_device(0, pci_dict_to_xc_str(pci_dev)) == 0: > continue > if not pci_str in assigned_pci_device_str_list: > raise VmError(("pci: failed to pci-attach %s to domain %s" + > \ > @@ -742,12 +729,9 @@ class XendDomainInfo: > if new_dev.has_key(''opts''): > opts = '','' + serialise_pci_opts(new_dev[''opts'']) > > - bdf_str = "%s:%s:%s.%s@%s%s" % (new_dev[''domain''], > - new_dev[''bus''], > - new_dev[''slot''], > - new_dev[''func''], > - new_dev[''vslot''], > - opts) > + bdf_str = "%s@%02x%s" % (pci_dict_to_bdf_str(new_dev), > + int(new_dev[''vslot''], 16), opts) > + log.debug("XendDomainInfo.hvm_pci_device_insert_dev: %s" % > bdf_str) > self.image.signalDeviceModel(''pci-ins'', ''pci-inserted'', bdf_str) > > vslot > xstransact.Read("/local/domain/0/device-model/%i/parameter" > @@ -864,9 +848,8 @@ class XendDomainInfo: > vslot = x[''vslot''] > break > if vslot == "": > - raise VmError("Device %04x:%02x:%02x.%01x is not > connected" > - % (int(dev[''domain''],16), > int(dev[''bus''],16), > - int(dev[''slot''],16), > int(dev[''func''],16))) > + raise VmError("Device %s is not connected" % > + pci_dict_to_bdf_str(dev)) > self.hvm_destroyPCIDevice(int(vslot, 16)) > # Update vslot > dev[''vslot''] = vslot > @@ -1152,12 +1135,8 @@ class XendDomainInfo: > # list of D''s co-assignment devices, DD is not assigned (to domN). > # > from xen.xend.server.pciif import PciDevice > - domain = int(x[''domain''],16) > - bus = int(x[''bus''],16) > - dev = int(x[''slot''],16) > - func = int(x[''func''],16) > try: > - pci_device = PciDevice(domain, bus, dev, func) > + pci_device = PciDevice(x) > except Exception, e: > raise VmError("pci: failed to locate device and "+ > "parse it''s resources - "+str(e)) > @@ -1172,9 +1151,8 @@ class XendDomainInfo: > )% (pci_device.name, self.info[''name_label''], pci_str)) > > > - bdf_str = "%s:%s:%s.%s" % (x[''domain''], x[''bus''], x[''slot''], > x[''func'']) > + bdf_str = pci_dict_to_bdf_str(x) > log.info("hvm_destroyPCIDevice:%s:%s!", x, bdf_str) > - > if self.domid is not None: > self.image.signalDeviceModel(''pci-rem'', ''pci-removed'', bdf_str) > > @@ -1338,21 +1316,12 @@ class XendDomainInfo: > if self.domid is not None: > return get_assigned_pci_devices(self.domid) > > - dev_str_list = [] > dev_info = self._getDeviceInfo_pci(devid) > if dev_info is None: > - return dev_str_list > + return [] > dev_uuid = sxp.child_value(dev_info, ''uuid'') > pci_conf = self.info[''devices''][dev_uuid][1] > - pci_devs = pci_conf[''devs''] > - for pci_dev in pci_devs: > - domain = int(pci_dev[''domain''], 16) > - bus = int(pci_dev[''bus''], 16) > - slot = int(pci_dev[''slot''], 16) > - func = int(pci_dev[''func''], 16) > - dev_str = "%04x:%02x:%02x.%01x" % (domain, bus, slot, func) > - dev_str_list = dev_str_list + [dev_str] > - return dev_str_list > + return map(pci_dict_to_bdf_str, pci_conf[''devs'']) > > def setMemoryTarget(self, target): > """Set the memory target of this domain. > @@ -3909,12 +3878,12 @@ class XendDomainInfo: > target_dev = None > new_pci_sxp = [''pci''] > for dev in sxp.children(old_pci_sxp, ''dev''): > - domain = int(sxp.child_value(dev, ''domain''), 16) > - bus = int(sxp.child_value(dev, ''bus''), 16) > - slot = int(sxp.child_value(dev, ''slot''), 16) > - func = int(sxp.child_value(dev, ''func''), 16) > - name = "%04x:%02x:%02x.%01x" % (domain, bus, slot, func) > - if ppci.get_name() == name: > + pci_dev = {} > + pci_dev[''domain''] = sxp.child_value(dev, ''domain'') > + pci_dev[''bus''] = sxp.child_value(dev, ''bus'') > + pci_dev[''slot''] = sxp.child_value(dev, ''slot'') > + pci_dev[''func''] = sxp.child_value(dev, ''func'') > + if ppci.get_name() == pci_dict_to_bdf_str(pci_dev): > target_dev = dev > else: > new_pci_sxp.append(dev) > Index: xen-unstable.hg/tools/python/xen/xend/XendNode.py > ==================================================================> --- xen-unstable.hg.orig/tools/python/xen/xend/XendNode.py 2009-06-16 > 22:48:34.000000000 +1000 > +++ xen-unstable.hg/tools/python/xen/xend/XendNode.py 2009-06-16 > 22:49:32.000000000 +1000 > @@ -340,8 +340,7 @@ class XendNode: > except KeyError: > pass > > - (domain, bus, slot, func) = PciUtil.parse_pci_name(pci_name) > - pci_dev = PciUtil.PciDevice(domain, bus, slot, func) > + pci_dev = PciUtil.PciDevice(PciUtil.parse_pci_name(pci_name)) > ppci_record = { > ''domain'': pci_dev.domain, > ''bus'': pci_dev.bus, > Index: xen-unstable.hg/tools/python/xen/xend/server/pciif.py > ==================================================================> --- xen-unstable.hg.orig/tools/python/xen/xend/server/pciif.py 2009-06-16 > 22:48:34.000000000 +1000 > +++ xen-unstable.hg/tools/python/xen/xend/server/pciif.py 2009-06-16 > 22:49:32.000000000 +1000 > @@ -130,13 +130,7 @@ class PciController(DevController): > log.debug(''Reconfiguring PCI device %s.'' % dev) > attaching = False > > - (domain, bus, slotfunc) = dev.split('':'') > - (slot, func) = slotfunc.split(''.'') > - domain = parse_hex(domain) > - bus = parse_hex(bus) > - slot = parse_hex(slot) > - func = parse_hex(func) > - self.setupOneDevice(domain, bus, slot, func) > + self.setupOneDevice(parse_pci_name(dev)) > > self.writeBackend(devid, ''dev-%i'' % devno, dev) > self.writeBackend(devid, ''state-%i'' % devno, > @@ -248,15 +242,13 @@ class PciController(DevController): > 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) > + for i in group_str.split('',''): > + if i == '''': > + continue > + pci_dev = parse_pci_name(i) > + pci_dev[''domain''] = ''%04x'' % dev.domain > try: > - sdev = PciDevice(dev.domain, b, d, f) > + sdev = PciDevice(pci_dev) > except Exception, e: > #no dom0 drivers bound to sdev > continue > @@ -270,13 +262,13 @@ class PciController(DevController): > )%(sdev.name, dev.name)) > return > > - def setupOneDevice(self, domain, bus, slot, func): > + def setupOneDevice(self, pci_dev): > """ Attach I/O resources for device to frontend domain > """ > fe_domid = self.getDomid() > > try: > - dev = PciDevice(domain, bus, slot, func) > + dev = PciDevice(pci_dev) > except Exception, e: > raise VmError("pci: failed to locate device and "+ > "parse it''s resources - "+str(e)) > @@ -305,12 +297,11 @@ class PciController(DevController): > > if not self.vm.info.is_hvm(): > # Setup IOMMU device assignment > - pci_str = "0x%x, 0x%x, 0x%x, 0x%x" % (domain, bus, slot, func) > - bdf = xc.assign_device(fe_domid, pci_str) > + bdf = xc.assign_device(fe_domid, pci_dict_to_xc_str(pci_dev)) > + pci_str = pci_dict_to_bdf_str(pci_dev) > if bdf > 0: > - raise VmError("Failed to assign device to IOMMU (%x:%x.%x)" > - % (bus, slot, func)) > - log.debug("pci: assign device %x:%x.%x" % (bus, slot, func)) > + raise VmError("Failed to assign device to IOMMU (%s)" % > pci_str) > + log.debug("pci: assign device %s" % pci_str) > > for (start, size) in dev.ioports: > log.debug(''pci: enabling ioport 0x%x/0x%x''%(start,size)) > @@ -366,23 +357,15 @@ class PciController(DevController): > def setupDevice(self, config): > """Setup devices from config > """ > - pci_str_list = [] > - pci_dev_list = [] > - for pci_config in config.get(''devs'', []): > - domain = parse_hex(pci_config.get(''domain'', 0)) > - bus = parse_hex(pci_config.get(''bus'', 0)) > - slot = parse_hex(pci_config.get(''slot'', 0)) > - func = parse_hex(pci_config.get(''func'', 0)) > - pci_str = ''%04x:%02x:%02x.%01x'' % (domain, bus, slot, func) > - pci_str_list = pci_str_list + [pci_str] > - pci_dev_list = pci_dev_list + [(domain, bus, slot, func)] > + pci_dev_list = config.get(''devs'', []) > + pci_str_list = map(pci_dict_to_bdf_str, pci_dev_list) > > if len(pci_str_list) != len(set(pci_str_list)): > raise VmError(''pci: duplicate devices specified in guest > config?'') > > - for (domain, bus, slot, func) in pci_dev_list: > + for pci_dev in pci_dev_list: > try: > - dev = PciDevice(domain, bus, slot, func) > + dev = PciDevice(pci_dev) > except Exception, e: > raise VmError("pci: failed to locate device and "+ > "parse it''s resources - "+str(e)) > @@ -427,9 +410,7 @@ class PciController(DevController): > dev.devs_check_driver(devs_str) > for s in devs_str: > if not s in pci_str_list: > - (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_pci_str > pci_dict_to_bdf_str(parse_pci_name(s)) > # 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''+\ > @@ -453,13 +434,13 @@ class PciController(DevController): > return True > > > - def cleanupOneDevice(self, domain, bus, slot, func): > + def cleanupOneDevice(self, pci_dev): > """ Detach I/O resources for device from frontend domain > """ > fe_domid = self.getDomid() > > try: > - dev = PciDevice(domain, bus, slot, func) > + dev = PciDevice(pci_dev) > except Exception, e: > raise VmError("pci: failed to locate device and "+ > "parse it''s resources - "+str(e)) > @@ -476,12 +457,11 @@ class PciController(DevController): > # DMA transaction, etc > dev.do_FLR() > > - pci_str = "0x%x, 0x%x, 0x%x, 0x%x" % (domain, bus, slot, func) > - bdf = xc.deassign_device(fe_domid, pci_str) > + bdf = xc.deassign_device(fe_domid, pci_dict_to_xc_str(pci_dev)) > + pci_str = pci_dict_to_bdf_str(pci_dev) > if bdf > 0: > - raise VmError("Failed to deassign device from IOMMU (%x:%x.%x)" > - % (bus, slot, func)) > - log.debug("pci: Deassign device %x:%x.%x" % (bus, slot, func)) > + raise VmError("Failed to deassign device from IOMMU (%s)" % > pci_str) > + log.debug("pci: Deassign device %s" % pci_str) > > for (start, size) in dev.ioports: > log.debug(''pci: disabling ioport 0x%x/0x%x''%(start,size)) > @@ -530,15 +510,9 @@ class PciController(DevController): > state = int(self.readBackend(devid, ''state-%i'' % i)) > if state == xenbusState[''Closing'']: > # Detach I/O resources. > - dev = self.readBackend(devid, ''dev-%i'' % i) > - (domain, bus, slotfunc) = dev.split('':'') > - (slot, func) = slotfunc.split(''.'') > - domain = parse_hex(domain) > - bus = parse_hex(bus) > - slot = parse_hex(slot) > - func = parse_hex(func) > + pci_dev = parse_pci_name(self.readBackend(devid, ''dev-%i'' % > i)) > # In HVM case, I/O resources are disabled in ioemu. > - self.cleanupOneDevice(domain, bus, slot, func) > + self.cleanupOneDevice(pci_dev) > # Remove xenstore nodes. > list = [''dev'', ''vdev'', ''state'', ''uuid'', ''vslot''] > if self.readBackend(devid, ''opts-%i'' % i) is not None: > > -- > > _______________________________________________ > 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
Simon Horman
2009-Jun-17 00:09 UTC
Re: [Xen-devel] [patch 1/8] xend: pass-through: Common parse_pci_name()
On Tue, Jun 16, 2009 at 02:45:06PM +0100, Keir Fraser wrote:> Still not applying at my end. It could be the in-line patch is getting > munged somewhere down the line. Feel free to send the patches to me > privately as a bunch of attachments in a single email.Will do. For future reference, would you pull from an hg tree? _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Simon Horman
2009-Jun-17 00:10 UTC
Re: [Xen-devel] [patch 1/8] xend: pass-through: Common parse_pci_name()
On Tue, Jun 16, 2009 at 02:45:06PM +0100, Keir Fraser wrote:> Still not applying at my end. It could be the in-line patch is getting > munged somewhere down the line. Feel free to send the patches to me > privately as a bunch of attachments in a single email.Hi Keir, here are the patches as attachments. _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Simon Horman
2009-Jun-17 01:17 UTC
Re: [Xen-devel] [patch 1/8] xend: pass-through: Common parse_pci_name()
On Tue, Jun 16, 2009 at 11:58:59PM +0800, Cui, Dexuan wrote:> The staging tree''s c/s 19770 breaks creating guest: > > [root@localhost xen]# xm cr /opt/my.hvm > Unexpected error: exceptions.ImportError > > Please report to xen-devel@lists.xensource.com > Traceback (most recent call last): > File "/usr/sbin/xm", line 7, in ? > main.main(sys.argv) > File "/usr/lib64/python2.4/site-packages/xen/xm/main.py", line 3219, in main > _, rc = _run_cmd(cmd, cmd_name, args) > File "/usr/lib64/python2.4/site-packages/xen/xm/main.py", line 3243, in _run_cmd > return True, cmd(args) > File "<string>", line 1, in <lambda> > File "/usr/lib64/python2.4/site-packages/xen/xm/main.py", line 1392, in xm_importcommand > cmd = __import__(command, globals(), locals(), ''xen.xm'') > File "/usr/lib64/python2.4/site-packages/xen/xm/create.py", line 41, in ? > from xen.util.pci import pci_opts_list_to_sxp, \ > ImportError: cannot import name parse_pci_name_extended > > > Looks it''s just because some patches of Simon haven''t been checked in, like "[patch 1/8] xend: pass-through: Common parse_pci_name()".c/s 19761 depends on the patch you mention. Hopefully Keir and I can work out why that patch doesn''t apply soon and it''ll get merged. In the mean time, can you revert 19761 in your tree? _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Simon Horman
2009-Jun-17 01:27 UTC
Re: [Xen-devel] [patch 1/8] xend: pass-through: Common parse_pci_name()
On Wed, Jun 17, 2009 at 10:10:30AM +1000, Simon Horman wrote:> On Tue, Jun 16, 2009 at 02:45:06PM +0100, Keir Fraser wrote: > > Still not applying at my end. It could be the in-line patch is getting > > munged somewhere down the line. Feel free to send the patches to me > > privately as a bunch of attachments in a single email. > > Hi Keir, > > here are the patches as attachments.Hi Keir, I just did a fresh clone of http://xenbits.xensource.com/xen-unstable.hg (c/s 19745) and I am now seeing some problems applying the first patch. I''ll fix these up and get back to you. _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Cui, Dexuan
2009-Jun-17 01:48 UTC
RE: [Xen-devel] [patch 1/8] xend: pass-through: Common parse_pci_name()
Hi Simon, You should do a fresh clone of the *staging* tree: http://xenbits.xensource.com/staging/xen-unstable.hg (the latest c/s is 19740: 112680f620bf) and make sure all the not-checked-in-yet parts of your patches are also checkd in. Thanks, -- Dexuan -----Original Message----- From: Simon Horman [mailto:horms@verge.net.au] Sent: 2009?6?17? 9:28 To: Keir Fraser Cc: xen-devel@lists.xensource.com; Akio Takebe; Masaki Kanno; Cui, Dexuan Subject: Re: [Xen-devel] [patch 1/8] xend: pass-through: Common parse_pci_name() On Wed, Jun 17, 2009 at 10:10:30AM +1000, Simon Horman wrote:> On Tue, Jun 16, 2009 at 02:45:06PM +0100, Keir Fraser wrote: > > Still not applying at my end. It could be the in-line patch is getting > > munged somewhere down the line. Feel free to send the patches to me > > privately as a bunch of attachments in a single email. > > Hi Keir, > > here are the patches as attachments.Hi Keir, I just did a fresh clone of http://xenbits.xensource.com/xen-unstable.hg (c/s 19745) and I am now seeing some problems applying the first patch. I''ll fix these up and get back to you. _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Simon Horman
2009-Jun-17 01:57 UTC
Re: [Xen-devel] [patch 1/8] xend: pass-through: Common parse_pci_name()
On Wed, Jun 17, 2009 at 09:48:18AM +0800, Cui, Dexuan wrote:> Hi Simon, > You should do a fresh clone of the *staging* tree: http://xenbits.xensource.com/staging/xen-unstable.hg (the latest c/s is 19740: 112680f620bf) and make sure all the not-checked-in-yet parts of your patches are also checkd in.Thanks, I will do that. _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel