All of lore.kernel.org
 help / color / mirror / Atom feed
From: Keir Fraser <keir.fraser@eu.citrix.com>
To: Simon Horman <horms@verge.net.au>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Cc: Masaki Kanno <kanno.masaki@jp.fujitsu.com>,
	Dexuan Cui <dexuan.cui@intel.com>
Subject: Re: [patch 08/16] xend: pass-through: Common parse_pci_name()
Date: Tue, 16 Jun 2009 11:43:32 +0100	[thread overview]
Message-ID: <C65D35E4.7F11%keir.fraser@eu.citrix.com> (raw)
In-Reply-To: <20090615015912.331941996@vergenet.net>

This patch didn't apply. I applied patches 1-7 and also patch 9 of your
series, but beyond that it was a bit of a trainwreck. Please refresh patch 8
and patches 10+ and resend.

 Thanks,
 Keir

On 15/06/2009 02:55, "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>
> 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
> 
> Index: xen-unstable.hg/tools/python/xen/util/pci.py
> ===================================================================
> --- xen-unstable.hg.orig/tools/python/xen/util/pci.py   2009-06-15
> 11:22:35.000000000 +1000
> +++ xen-unstable.hg/tools/python/xen/util/pci.py        2009-06-15
> 11:23:43.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.
> @@ -237,7 +257,7 @@ def _create_lspci_info():
>              try:
>                  (opt, value) = line.split(':\t')
>                  if opt == 'Slot':
> -                    device_name = PCI_DEV_FORMAT_STR % parse_pci_name(value)
> +                    device_name = pci_dict_to_bdf_str(parse_pci_name(value))
>                  else:
>                      device_info[opt] = value
>              except:
> @@ -287,8 +307,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
> 
> @@ -395,12 +414,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
> @@ -442,14 +461,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['dom'] = 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)
> @@ -459,15 +479,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):
> @@ -478,8 +496,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 = \
> @@ -595,7 +612,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)
> @@ -753,8 +770,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'
> + \
> @@ -780,7 +796,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-15 11:22:35.000000000 +1000
> +++ xen-unstable.hg/tools/python/xen/xend/XendDomainInfo.py     2009-06-15
> 11:23:43.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-15
> 11:20:35.000000000 +1000
> +++ xen-unstable.hg/tools/python/xen/xend/XendNode.py   2009-06-15
> 11:23:43.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-15
> 11:22:35.000000000 +1000
> +++ xen-unstable.hg/tools/python/xen/xend/server/pciif.py       2009-06-15
> 11:23:43.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

  reply	other threads:[~2009-06-16 10:43 UTC|newest]

Thread overview: 28+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-06-15  1:55 [patch 00/16] xend: pass-through: various clean-ups and infrastructure Simon Horman
2009-06-15  1:55 ` [patch 01/16] xend: pass-through: Only call setupOneDevice() once per device Simon Horman
2009-06-15  1:55 ` [patch 02/16] xend: pass-through: fix typo: spx -> sxp Simon Horman
2009-06-15  1:55 ` [patch 03/16] xend: pass-through: tidy up PciController() Simon Horman
2009-06-15  1:55 ` [patch 04/16] xend: pass-through: cleanupDevice: move and remove recently added vslot entry Simon Horman
2009-06-15  1:55 ` [patch 05/16] xend: pass-through: sxp.merge() cant deal with values being a list Simon Horman
2009-06-15  1:55 ` [patch 06/16] xend: pass-through: Remove PciDeviceNotFoundError, it is never used Simon Horman
2009-06-15  1:55 ` [patch 07/16] xend: pass-through: Use PCIDevice as the parameter for the constructor for PCIQuirk Simon Horman
2009-06-15  1:55 ` [patch 08/16] xend: pass-through: Common parse_pci_name() Simon Horman
2009-06-16 10:43   ` Keir Fraser [this message]
2009-06-16 11:20     ` Simon Horman
2009-06-16 12:22       ` Keir Fraser
2009-06-16 12:38         ` Simon Horman
2009-06-15  1:55 ` [patch 09/16] xend: pass-through: Use common parsing code in preprocess_pci() Simon Horman
2009-06-15  1:55 ` [patch 10/16] xend: pass-through: Add pci_dict_cmp() Simon Horman
2009-06-15  1:55 ` [patch 11/16] xend: pass-through: Move pci conversion functions to pci.py Simon Horman
2009-06-15  5:58   ` [patch 11/16] xend: pass-through: Move pci conversionfunctions " Masaki Kanno
2009-06-15  6:15     ` Simon Horman
2009-06-15  7:02       ` [patch 11/16] xend: pass-through: Move pciconversionfunctions " Masaki Kanno
2009-06-15  9:04         ` Simon Horman
2009-06-15 11:58           ` [patch v2] xend: pass-through: Move pci conversion functions " Simon Horman
2009-06-15 23:36             ` [patch 11/16 v3] " Simon Horman
2009-06-15  1:55 ` [patch 12/16] xend: pass-through: Use generic code in pci_opts_list_to_sxp() Simon Horman
2009-06-15 11:59   ` [patch v2] " Simon Horman
2009-06-15  1:55 ` [patch 13/16] xend: pass-through: Add pci_tuple_to_dict() Simon Horman
2009-06-15  1:55 ` [patch 14/16] xend: pass-through: Use common parsing code in parse_pci_configuration() Simon Horman
2009-06-15  1:55 ` [patch 15/16] xend: pass-through: Use common parsing code in getDeviceConfiguration() Simon Horman
2009-06-15  1:55 ` [patch 16/16] xend: pass-through: Clean up hvm_destroyPCIDevice() Simon Horman

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=C65D35E4.7F11%keir.fraser@eu.citrix.com \
    --to=keir.fraser@eu.citrix.com \
    --cc=dexuan.cui@intel.com \
    --cc=horms@verge.net.au \
    --cc=kanno.masaki@jp.fujitsu.com \
    --cc=xen-devel@lists.xensource.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.