Simon Horman
2009-Jun-17  02:56 UTC
[Xen-devel] [patch 00/17] xend: pass-through: various clean-ups and infrastructure: take iii
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 patch series applies against: http://xenbits.xensource.com/xen-unstable.hg 19745:55ca7ef865b4 Please apply the patches in order, many of the patches in this series depend on previous patches in the series to function correctly. I am happy to establish a mercurial tree to be pulled if that would make things easier. _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Simon Horman
2009-Jun-17  02:56 UTC
[Xen-devel] [patch 01/17] xend: Support older pciutils without -vmm option
From: Zhigang Wang <zhigang.x.wang@oracle.com>
xend: Support older pciutils without -vmm option
This patch adds support for older pciutils without -vmm option, and
improves error handling in get_info_from_lspci().
pciutils before commit: 3fd6b4d2e2fda814047664ffc67448ac782a8089 in
git://git.kernel.org/pub/scm/utils/pciutils/pciutils.git
has no -vmm option (it equals -vm). the result of lspci -vmm looks like:
Device: 02:00.0
Class:  Ethernet controller
Vendor: Broadcom Corporation
Device: NetXtreme BCM5751 Gigabit Ethernet PCI Express
SVendor:        Dell
SDevice:        Optiplex GX620
Rev:    01
Two Device as key.
pciutils with -vmm option:
Slot:   07:07.0
Class:  IDE interface
Vendor: Silicon Image, Inc.
Device: PCI0680 Ultra ATA-133 Host Controller
SVendor:        Silicon Image, Inc.
SDevice:        SiI 0680 ATA/133 Controller
Rev:    02
ProgIf: 85
The first Device becomes Slot.
For the second part of this patch: without this patch, only an KeyError raise,
it will not parse the extra keys, while the other keys still contains useful
info.
Eg.
Slot:   07:02.0
Class:  VGA compatible controller
Vendor: ATI Technologies Inc
Device: Radeon RV100 QY [Radeon 7000/VE]
SVendor:        Dell
SDevice:        Device 0183
without a "Rev", it will not parse any of these fields.
Acked-by: Simon Horman <horms@verge.net.au>
Signed-off-by: Zhigang Wang <zhigang.x.wang@oracle.com>
--- a/tools/python/xen/util/pci.py	2009-06-09 00:02:19.000000000 +0800
+++ a/tools/python/xen/util/pci.py	2009-06-15 16:12:26.000000000 +0800
@@ -221,11 +221,16 @@ def _create_lspci_info():
     for paragraph in os.popen(LSPCI_CMD + ''
-vmm'').read().split(''\n\n''):
         device_name = None
         device_info = {}
+        # FIXME: workaround for pciutils without the -mm option.
+        # see: git://git.kernel.org/pub/scm/utils/pciutils/pciutils.git
+        # commit: 3fd6b4d2e2fda814047664ffc67448ac782a8089
+        first_device = True
         for line in paragraph.split(''\n''):
             try:
                 (opt, value) = line.split('':\t'')
-                if opt == ''Slot'':
+                if opt == ''Slot'' or (opt ==
''Device'' and first_device):
                     device_name = PCI_DEV_FORMAT_STR % parse_pci_name(value)
+                    first_device = False
                 else:
                     device_info[opt] = value
             except:
@@ -979,18 +984,18 @@ class PciDevice:
             if lspci_info is None:
                 _create_lspci_info()
 
-            try:
-                device_info = lspci_info[self.name]
-                self.revision = int(device_info[''Rev''], 16)
-                self.vendorname = device_info[''Vendor'']
-                self.devicename = device_info[''Device'']
-                self.classname = device_info[''Class'']
-                self.subvendorname = device_info[''SVendor'']
-                self.subdevicename = device_info[''SDevice'']
-            except KeyError:
-                pass
-
-            return True
+            device_info = lspci_info.get(self.name)
+            if device_info:
+                try:
+                    self.revision =
int(device_info.get(''Rev'', ''0''), 16)
+                except ValueError:
+                    pass
+                self.vendorname = device_info.get(''Vendor'',
'''')
+                self.devicename = device_info.get(''Device'',
'''')
+                self.classname = device_info.get(''Class'',
'''')
+                self.subvendorname =
device_info.get(''SVendor'', '''')
+                self.subdevicename =
device_info.get(''SDevice'', '''')
+                return True
         finally:
             lspci_info_lock.release()
 
-- 
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel
Simon Horman
2009-Jun-17  02:56 UTC
[Xen-devel] [patch 02/17] xend: pass-through: Only call setupOneDevice() once per device
As observed by Dexuan Cui, when PCI devices are passed through at
domain-creation-time setupOneDevice() will be called twice.
Once via setupDevice() and once via econfigureDevice() which
is called in pci_device_configure().
This patch removes the first of these.
Cc: Masaki Kanno <kanno.masaki@jp.fujitsu.com>
Acked-by: Dexuan Cui <dexuan.cui@intel.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-15
11:24:00.000000000 +1000
+++ xen-unstable.hg/tools/python/xen/xend/server/pciif.py	2009-06-15
11:24:02.000000000 +1000
@@ -436,8 +436,6 @@ class PciController(DevController):
                                     '' same guest with %s''
                                 raise VmError(err_msg % (s, dev.name))
 
-        for (domain, bus, slot, func) in pci_dev_list:
-            self.setupOneDevice(domain, bus, slot, func)
         wPath = ''/local/domain/0/backend/pci/%u/0/aerState'' %
(self.getDomid())
         self.aerStateWatch = xswatch(wPath, self._handleAerStateWatch)
         log.debug(''pci: register aer watch %s'', wPath)
-- 
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel
Simon Horman
2009-Jun-17  02:56 UTC
[Xen-devel] [patch 03/17] xend: pass-through: fix typo: spx -> sxp
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-11 19:05:28.000000000
+1000
+++ xen-unstable.hg/tools/python/xen/util/pci.py	2009-06-11 19:05:40.000000000
+1000
@@ -124,7 +124,7 @@ def serialise_pci_opts(opts):
 def split_pci_opts(opts):
     return map(lambda x: x.split(''=''),
opts.split('',''))
 
-def pci_opts_list_to_spx(list):
+def pci_opts_list_to_sxp(list):
     [''dev''] + map(lambda x: [''opts'', x],
list)
 
 def parse_hex(val):
Index: xen-unstable.hg/tools/python/xen/xend/XendDomainInfo.py
==================================================================---
xen-unstable.hg.orig/tools/python/xen/xend/XendDomainInfo.py	2009-06-11
19:05:28.000000000 +1000
+++ xen-unstable.hg/tools/python/xen/xend/XendDomainInfo.py	2009-06-11
19:05:54.000000000 +1000
@@ -39,7 +39,7 @@ 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_spx
+from xen.util.pci import serialise_pci_opts, pci_opts_list_to_sxp
 
 from xen.xend import balloon, sxp, uuid, image, arch
 from xen.xend import XendOptions, XendNode, XendConfig
@@ -3771,7 +3771,7 @@ class XendDomainInfo:
         opts_dict = xenapi_pci.get(''options'')
         for k in opts_dict.keys():
             dpci_opts.append([k, opts_dict[k]])
-        opts_sxp = pci_opts_list_to_spx(dpci_opts)
+        opts_sxp = pci_opts_list_to_sxp(dpci_opts)
 
         # Convert xenapi to sxp
         ppci = XendAPIStore.get(xenapi_pci.get(''PPCI''),
''PPCI'')
-- 
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel
Simon Horman
2009-Jun-17  02:56 UTC
[Xen-devel] [patch 04/17] xend: pass-through: tidy up PciController()
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-15
11:24:02.000000000 +1000
+++ xen-unstable.hg/tools/python/xen/xend/server/pciif.py	2009-06-15
11:24:12.000000000 +1000
@@ -540,33 +540,24 @@ class PciController(DevController):
                 # In HVM case, I/O resources are disabled in ioemu.
                 self.cleanupOneDevice(domain, bus, slot, func)
                 # Remove xenstore nodes.
-                self.removeBackend(devid, ''dev-%i'' % i)
-                self.removeBackend(devid, ''vdev-%i'' % i)
-                self.removeBackend(devid, ''state-%i'' % i)
-                self.removeBackend(devid, ''uuid-%i'' % i)
-                tmpopts = self.readBackend(devid, ''opts-%i'' %
i)
-                if tmpopts is not None:
-                    self.removeBackend(devid, ''opts-%i'' % i)
+                list = [''dev'', ''vdev'',
''state'', ''uuid'']
+                if self.readBackend(devid, ''opts-%i'' % i) is
not None:
+                    list.append(''opts'')
+                for key in list:
+                    self.removeBackend(devid, ''%s-%i'' % (key,
i))
             else:
-                if new_num_devs != i:
-                    tmpdev = self.readBackend(devid, ''dev-%i''
% i)
-                    self.writeBackend(devid, ''dev-%i'' %
new_num_devs, tmpdev)
-                    self.removeBackend(devid, ''dev-%i'' % i)
-                    tmpvdev = self.readBackend(devid,
''vdev-%i'' % i)
-                    if tmpvdev is not None:
-                        self.writeBackend(devid, ''vdev-%i'' %
new_num_devs,
-                                          tmpvdev)
-                    self.removeBackend(devid, ''vdev-%i'' % i)
-                    tmpstate = self.readBackend(devid,
''state-%i'' % i)
-                    self.writeBackend(devid, ''state-%i'' %
new_num_devs, tmpstate)
-                    self.removeBackend(devid, ''state-%i'' % i)
-                    tmpuuid = self.readBackend(devid,
''uuid-%i'' % i)
-                    self.writeBackend(devid, ''uuid-%i'' %
new_num_devs, tmpuuid)
-                    self.removeBackend(devid, ''uuid-%i'' % i)
-                    tmpopts = self.readBackend(devid,
''opts-%i'' % i)
-                    if tmpopts is not None:
-                        self.removeBackend(devid, ''opts-%i'' %
i)
                 new_num_devs = new_num_devs + 1
+                if new_num_devs == i + 1:
+                    continue
+
+                list = [''dev'', ''vdev'',
''state'', ''uuid'', ''opts'']
+                for key in list:
+                    tmp = self.readBackend(devid, ''%s-%i'' %
(key, i))
+                    if tmp is None:
+                        continue
+                    self.removeBackend(devid, ''%s-%i'' % (key,
i))
+                    self.writeBackend(devid,
+                                      ''%s-%i'' % (key,
new_num_devs - 1), tmp)
 
         self.writeBackend(devid, ''num_devs'',
str(new_num_devs))
 
-- 
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel
Simon Horman
2009-Jun-17  02:56 UTC
[Xen-devel] [patch 05/17] xend: pass-through: cleanupDevice: move and remove recently added vslot entry
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-15
11:24:17.000000000 +1000
+++ xen-unstable.hg/tools/python/xen/xend/server/pciif.py	2009-06-15
11:24:20.000000000 +1000
@@ -540,7 +540,7 @@ class PciController(DevController):
                 # In HVM case, I/O resources are disabled in ioemu.
                 self.cleanupOneDevice(domain, bus, slot, func)
                 # Remove xenstore nodes.
-                list = [''dev'', ''vdev'',
''state'', ''uuid'']
+                list = [''dev'', ''vdev'',
''state'', ''uuid'', ''vslot'']
                 if self.readBackend(devid, ''opts-%i'' % i) is
not None:
                     list.append(''opts'')
                 for key in list:
@@ -550,7 +550,7 @@ class PciController(DevController):
                 if new_num_devs == i + 1:
                     continue
 
-                list = [''dev'', ''vdev'',
''state'', ''uuid'', ''opts'']
+                list = [''dev'', ''vdev'',
''state'', ''uuid'', ''opts'',
''vslot'']
                 for key in list:
                     tmp = self.readBackend(devid, ''%s-%i'' %
(key, i))
                     if tmp is None:
-- 
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel
Simon Horman
2009-Jun-17  02:56 UTC
[Xen-devel] [patch 06/17] xend: pass-through: sxp.merge() cant deal with values being a list
sxp.merge() can''t deal with values being a list so instead
of storing pci options as:
[ ''opts'', [ ''key1''
''value1''], [ ''key2'',
''value2''], ...]
store them as:
[ ''opts'', [ ''key1''
''value1''], [''opts'', [
''key2'', ''value2'']], ...
Cc: Dexuan Cui <dexuan.cui@intel.com>
Cc: Masaki Kanno <kanno.masaki@jp.fujitsu.com>
Signed-off-by: Simon Horman <horms@verge.net.au>
--- 
 tools/python/xen/util/pci.py          |   18 +++++++++++++--
 tools/python/xen/xend/XendConfig.py   |   38 +++++++++++++++------------------
 tools/python/xen/xend/server/pciif.py |    3 +-
 tools/python/xen/xm/create.py         |   23 ++++++++-----------
 tools/python/xen/xm/main.py           |   11 ++++++---
 tools/python/xen/xm/xenapi_create.py  |   12 +++++-----
 6 files changed, 58 insertions(+), 47 deletions(-)
Index: xen-unstable.hg/tools/python/xen/util/pci.py
==================================================================---
xen-unstable.hg.orig/tools/python/xen/util/pci.py	2009-06-13 10:32:59.000000000
+1000
+++ xen-unstable.hg/tools/python/xen/util/pci.py	2009-06-13 10:33:14.000000000
+1000
@@ -118,14 +118,26 @@ def PCI_BDF(domain, bus, slot, func):
     return (((domain & 0xffff) << 16) | ((bus & 0xff) << 8)
|
             PCI_DEVFN(slot, func))
 
+def check_pci_opts(opts):
+    def f((k, v)):
+        if k not in [''msitranslate'',
''power_mgmt''] or \
+           not v.lower() in [''0'', ''1'',
''yes'', ''no'']:
+            raise PciDeviceParseError(''Invalid pci option %s=%s:
'' % (k, v))
+
+    map(f, opts)
+
 def serialise_pci_opts(opts):
-    return reduce(lambda x, y: x+'',''+y, map(lambda (x, y):
x+''=''+y, opts))
+    return '',''.join(map(lambda x:
''=''.join(x), opts))
 
 def split_pci_opts(opts):
-    return map(lambda x: x.split(''=''),
opts.split('',''))
+    return map(lambda x: x.split(''=''),
+               filter(lambda x: x != '''',
opts.split('','')))
 
 def pci_opts_list_to_sxp(list):
-    [''dev''] + map(lambda x: [''opts'', x],
list)
+    return [''dev''] + map(lambda x: [''opts'',
x], list)
+
+def pci_opts_list_from_sxp(dev):
+    return map(lambda x: sxp.children(x)[0], sxp.children(dev,
''opts''))
 
 def parse_hex(val):
     try:
Index: xen-unstable.hg/tools/python/xen/xend/XendConfig.py
==================================================================---
xen-unstable.hg.orig/tools/python/xen/xend/XendConfig.py	2009-06-13
10:32:59.000000000 +1000
+++ xen-unstable.hg/tools/python/xen/xend/XendConfig.py	2009-06-13
10:33:04.000000000 +1000
@@ -36,6 +36,7 @@ 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 import xsconstants
 import xen.util.auxbin
 
@@ -1596,11 +1597,10 @@ class XendConfig(dict):
         return ''''
 
     def pci_convert_dict_to_sxp(self, dev, state, sub_state = None):
-        sxp =  [''pci'', [''dev''] + map(lambda
(x, y): [x, y], dev.items()),
-                [''state'', state]]
+        pci_sxp = [''pci'', self.dev_dict_to_sxp(dev),
[''state'', state]]
         if sub_state != None:
-            sxp.append([''sub_state'', sub_state])
-        return sxp
+            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
@@ -1649,13 +1649,9 @@ class XendConfig(dict):
 
         pci_devs = []
         for pci_dev in sxp.children(dev_sxp, ''dev''):
-            pci_dev_info = {}
-            for opt_val in pci_dev[1:]:
-                try:
-                    opt, val = opt_val
-                    pci_dev_info[opt] = val
-                except (TypeError, ValueError):
-                    pass
+            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())
@@ -1966,6 +1962,15 @@ 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 = []
@@ -1988,10 +1993,7 @@ class XendConfig(dict):
                     if dev_info.has_key(''backend''):
                         sxpr.append([''backend'',
dev_info[''backend'']])
                 for pci_dev_info in dev_info[''devs'']:
-                    pci_dev_sxpr = [''dev'']
-                    for opt, val in pci_dev_info.items():
-                        pci_dev_sxpr.append([opt, val])
-                    sxpr.append(pci_dev_sxpr)
+                    sxpr.append(self.dev_dict_to_sxp(pci_dev_info))
                 sxprs.append((dev_type, sxpr))
             else:
                 sxpr = self.device_sxpr(dev_type = dev_type,
@@ -2118,11 +2120,7 @@ class XendConfig(dict):
                 slot = sxp.child_value(dev, ''slot'')
                 func = sxp.child_value(dev, ''func'')
                 vslot = sxp.child_value(dev, ''vslot'')
-                opts = ''''
-                for opt in sxp.child_value(dev, ''opts'', []):
-                    if opts:
-                        opts += '',''
-                    opts += ''%s=%s'' % (opt[0], str(opt[1]))
+                opts = pci_opts_list_from_sxp(dev)
                 pci.append([domain, bus, slot, func, vslot, opts])
         self[''platform''][''pci''] = pci
 
Index: xen-unstable.hg/tools/python/xen/xend/server/pciif.py
==================================================================---
xen-unstable.hg.orig/tools/python/xen/xend/server/pciif.py	2009-06-13
10:32:59.000000000 +1000
+++ xen-unstable.hg/tools/python/xen/xend/server/pciif.py	2009-06-13
10:33:04.000000000 +1000
@@ -222,7 +222,8 @@ class PciController(DevController):
             dev_sxpr = [''dev'']
             for dev_key, dev_val in dev.items():
                 if dev_key == ''opts'':
-                    dev_sxpr.append([''opts'',
split_pci_opts(dev_val)])
+                    opts_sxpr = pci_opts_list_to_sxp(split_pci_opts(dev_val))
+                    dev_sxpr = sxp.merge(dev_sxpr, opts_sxpr)
                 else:
                     dev_sxpr.append([dev_key, dev_val])
             sxpr.append(dev_sxpr)
Index: xen-unstable.hg/tools/python/xen/xm/create.py
==================================================================---
xen-unstable.hg.orig/tools/python/xen/xm/create.py	2009-06-13 10:32:59.000000000
+1000
+++ xen-unstable.hg/tools/python/xen/xm/create.py	2009-06-13 10:33:04.000000000
+1000
@@ -38,6 +38,8 @@ 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 split_pci_opts, check_pci_opts, \
+                         pci_opts_list_to_sxp
 
 from xen.xm.opts import *
 
@@ -705,23 +707,18 @@ def configure_pci(config_devs, vals):
     """
     config_pci = []
     for (domain, bus, slot, func, vslot, opts) in vals.pci:
-        config_pci_opts = []
-        d = comma_sep_kv_to_dict(opts)
-
-        def f(k):
-            if k not in [''msitranslate'',
''power_mgmt'']:
-                err(''Invalid pci option: '' + k)
-
-            config_pci_opts.append([k, d[k]])
-
         config_pci_bdf = [''dev'', [''domain'',
domain], [''bus'', bus], \
                           [''slot'', slot],
[''func'', func],
                           [''vslot'', vslot]]
-        map(f, d.keys())
-        if len(config_pci_opts)>0:
-            config_pci_bdf.append([''opts'', config_pci_opts])
 
-        config_pci.append(config_pci_bdf)
+        opts_list = split_pci_opts(opts)
+        try:
+            check_pci_opts(opts_list)
+        except PciDeviceParseError, ex:
+            err(str(ex))
+
+        config_opts = pci_opts_list_to_sxp(split_pci_opts(opts))
+        config_pci.append(sxp.merge(config_pci_bdf, config_opts))
 
     if len(config_pci)>0:
         config_pci.insert(0, ''pci'')
Index: xen-unstable.hg/tools/python/xen/xm/main.py
==================================================================---
xen-unstable.hg.orig/tools/python/xen/xm/main.py	2009-06-13 10:32:59.000000000
+1000
+++ xen-unstable.hg/tools/python/xen/xm/main.py	2009-06-13 10:33:04.000000000
+1000
@@ -2504,12 +2504,15 @@ def parse_pci_configuration(args, state,
                 [''slot'', ''0x''+
pci_dev_info[''slot'']],
                 [''func'', ''0x''+
pci_dev_info[''func'']],
                 [''vslot'', ''0x%x'' %
int(vslot, 16)]]
-        if len(opts) > 0:
-            pci_bdf.append([''opts'', opts])
-        pci.append(pci_bdf)
-
     except:
         raise OptionError("Invalid argument: %s %s" % (pci_dev_str,
vslot))
+
+    try:
+        check_pci_opts(opts)
+    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)
Index: xen-unstable.hg/tools/python/xen/xm/xenapi_create.py
==================================================================---
xen-unstable.hg.orig/tools/python/xen/xm/xenapi_create.py	2009-06-13
10:32:59.000000000 +1000
+++ xen-unstable.hg/tools/python/xen/xm/xenapi_create.py	2009-06-13
10:33:04.000000000 +1000
@@ -26,6 +26,7 @@ from xen.xend.XendAPIConstants import XE
      XEN_API_ON_CRASH_BEHAVIOUR
 from xen.xm.opts import OptionError
 from xen.util import xsconstants
+from xen.util.pci import pci_opts_list_from_sxp
 from xen.util.path import SHAREDIR
 import xen.util.xsm.xsm as security
 
@@ -945,12 +946,11 @@ class sxp2xml:
                     = get_child_by_name(dev_sxp, "func",
"0")
                 pci.attributes["vslot"] \
                     = get_child_by_name(dev_sxp, "vslot",
"0")
-                for opt in get_child_by_name(dev_sxp, "opts",
""):
-                    if len(opt) > 0:
-                        pci_opt = document.createElement("pci_opt")
-                        pci_opt.attributes["key"] = opt[0]
-                        pci_opt.attributes["value"] = opt[1]
-                        pci.appendChild(pci_opt)
+                for opt in pci_opts_list_from_sxp(dev_sxp):
+                    pci_opt = document.createElement("pci_opt")
+                    pci_opt.attributes["key"] = opt[0]
+                    pci_opt.attributes["value"] = opt[1]
+                    pci.appendChild(pci_opt)
 
                 pcis.append(pci)
 
-- 
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel
Simon Horman
2009-Jun-17  02:56 UTC
[Xen-devel] [patch 07/17] xend: pass-through: Remove PciDeviceNotFoundError, it is never used
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:25.000000000
+1000
+++ xen-unstable.hg/tools/python/xen/util/pci.py	2009-06-15 11:24:25.000000000
+1000
@@ -375,17 +375,6 @@ def check_mmio_bar(devs_list):
 
     return result
 
-class PciDeviceNotFoundError(Exception):
-    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 __str__(self):
-        return (''PCI Device %s Not Found'' % (self.name))
-
 class PciDeviceParseError(Exception):
     def __init__(self,msg):
         self.message = msg
-- 
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel
Simon Horman
2009-Jun-17  02:56 UTC
[Xen-devel] [patch 08/17] xend: pass-through: Use PCIDevice as the parameter for the constructor for PCIQuirk
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-05
16:19:26.000000000 +1000
+++ xen-unstable.hg/tools/python/xen/xend/server/pciif.py	2009-06-07
21:49:07.000000000 +1000
@@ -301,8 +301,7 @@ class PciController(DevController):
         # if arch.type != "ia64":
         #    dev.do_FLR()
 
-        PCIQuirk(dev.vendor, dev.device, dev.subvendor, dev.subdevice, domain, 
-                bus, slot, func)
+        PCIQuirk(dev)
 
         if not self.vm.info.is_hvm():
             # Setup IOMMU device assignment
Index: xen-unstable.hg/tools/python/xen/xend/server/pciquirk.py
==================================================================---
xen-unstable.hg.orig/tools/python/xen/xend/server/pciquirk.py	2009-06-05
16:19:20.000000000 +1000
+++ xen-unstable.hg/tools/python/xen/xend/server/pciquirk.py	2009-06-05
17:01:20.000000000 +1000
@@ -11,18 +11,19 @@ PERMISSIVE_CONFIG_FILE = auxbin.xen_conf
 PERMISSIVE_SYSFS_NODE = "/sys/bus/pci/drivers/pciback/permissive"
 
 class PCIQuirk:
-    def __init__( self, vendor, device, subvendor, subdevice, domain, bus,
slot, func):
-        self.vendor = vendor
-        self.device = device
-        self.subvendor = subvendor
-        self.subdevice = subdevice
-        self.domain = domain
-        self.bus = bus
-        self.slot = slot
-        self.func = func
-
-        self.devid = "%04x:%04x:%04x:%04x" % (vendor, device,
subvendor, subdevice)
-        self.pciid = "%04x:%02x:%02x.%01x" % (domain, bus, slot,
func)
+    def __init__(self, dev):
+        self.vendor = dev.vendor
+        self.device = dev.device
+        self.subvendor = dev.subvendor
+        self.subdevice = dev.subdevice
+        self.domain = dev.domain
+        self.bus = dev.bus
+        self.slot = dev.slot
+        self.func = dev.func
+
+        self.devid = "%04x:%04x:%04x:%04x" % (self.vendor,
self.device,
+                                              self.subvendor, self.subdevice)
+        self.pciid = dev.name
         self.quirks = self.__getQuirksByID()
 
         self.__sendQuirks()
-- 
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel
Simon Horman
2009-Jun-17  02:56 UTC
[Xen-devel] [patch 09/17] 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.
Wed, 17 Jun 2009 12:12:05 +1000
* Up-port to xen-unstable.hg 19745:55ca7ef865b4
Index: xen-unstable.hg/tools/python/xen/util/pci.py
==================================================================---
xen-unstable.hg.orig/tools/python/xen/util/pci.py	2009-06-17 13:07:51.000000000
+1000
+++ xen-unstable.hg/tools/python/xen/util/pci.py	2009-06-17 13:10:00.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-17
13:07:51.000000000 +1000
+++ xen-unstable.hg/tools/python/xen/xend/XendDomainInfo.py	2009-06-17
13:10:00.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-17
12:12:46.000000000 +1000
+++ xen-unstable.hg/tools/python/xen/xend/XendNode.py	2009-06-17
13:10:00.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-17
13:07:51.000000000 +1000
+++ xen-unstable.hg/tools/python/xen/xend/server/pciif.py	2009-06-17
13:10:00.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-17  02:56 UTC
[Xen-devel] [patch 10/17] xend: pass-through: Use common parsing code in preprocess_pci()
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:24 +1000
* Initial post
Wed, 17 Jun 2009 12:01:53 +1000
* Up-port to staging/xen-unstable.hg 19745:55ca7ef865b4
Index: xen-unstable.hg/tools/python/xen/xm/create.py
==================================================================---
xen-unstable.hg.orig/tools/python/xen/xm/create.py	2009-06-17 11:59:15.000000000
+1000
+++ xen-unstable.hg/tools/python/xen/xm/create.py	2009-06-17 11:59:21.000000000
+1000
@@ -38,8 +38,8 @@ 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 split_pci_opts, check_pci_opts, \
-                         pci_opts_list_to_sxp
+from xen.util.pci import pci_opts_list_to_sxp, \
+                         parse_pci_name_extended, PciDeviceParseError
 
 from xen.xm.opts import *
 
@@ -710,14 +710,7 @@ def configure_pci(config_devs, vals):
         config_pci_bdf = [''dev'', [''domain'',
domain], [''bus'', bus], \
                           [''slot'', slot],
[''func'', func],
                           [''vslot'', vslot]]
-
-        opts_list = split_pci_opts(opts)
-        try:
-            check_pci_opts(opts_list)
-        except PciDeviceParseError, ex:
-            err(str(ex))
-
-        config_opts = pci_opts_list_to_sxp(split_pci_opts(opts))
+        config_opts = pci_opts_list_to_sxp(opts)
         config_pci.append(sxp.merge(config_pci_bdf, config_opts))
 
     if len(config_pci)>0:
@@ -1052,33 +1045,18 @@ def preprocess_cpuid(vals, attr_name):
                 cpuid[input][res[''reg'']] =
res[''val''] # new register
             setattr(vals, attr_name, cpuid)
 
+def pci_dict_to_tuple(dev):
+    return (dev[''domain''], dev[''bus''],
dev[''slot''], dev[''func''],
+            dev[''vslot''], dev.get(''opts'',
[]))
+
 def preprocess_pci(vals):
-    if not vals.pci: return
-    pci = []
-    for pci_dev_str in vals.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])" + \
-                r"(@(?P<vslot>[01]?[0-9a-fA-F]))?" + \
-                r"(,(?P<opts>.*))?$", \
-                pci_dev_str)
-        if pci_match!=None:
-            pci_dev_info = pci_match.groupdict('''')
-            if pci_dev_info[''domain'']=='''':
-                pci_dev_info[''domain'']=''0''
-            if pci_dev_info[''vslot'']=='''':
-                pci_dev_info[''vslot'']="%02x" %
AUTO_PHP_SLOT
-            try:
-                pci.append(
(''0x''+pci_dev_info[''domain''], \
-                       
''0x''+pci_dev_info[''bus''], \
-                       
''0x''+pci_dev_info[''slot''], \
-                       
''0x''+pci_dev_info[''func''], \
-                       
''0x''+pci_dev_info[''vslot''], \
-                        pci_dev_info[''opts'']))
-            except IndexError:
-                err(''Error in PCI slot syntax
"%s"''%(pci_dev_str))
-    vals.pci = pci
+    if not vals.pci:
+        return
+    try:
+        vals.pci = map(pci_dict_to_tuple,
+                       map(parse_pci_name_extended, vals.pci))
+    except PciDeviceParseError, ex:
+        err(str(ex))
 
 def preprocess_vscsi(vals):
     if not vals.vscsi: return
-- 
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel
Simon Horman
2009-Jun-17  02:56 UTC
[Xen-devel] [patch 11/17] 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-17  02:56 UTC
[Xen-devel] [patch 12/17] 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-17  02:56 UTC
[Xen-devel] [patch 13/17] 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-17  02:56 UTC
[Xen-devel] [patch 14/17] 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-17  02:56 UTC
[Xen-devel] [patch 15/17] 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-17  02:56 UTC
[Xen-devel] [patch 16/17] 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-17  02:56 UTC
[Xen-devel] [patch 17/17] 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-17  06:12 UTC
Re: [Xen-devel] [patch 00/17] xend: pass-through: various clean-ups and infrastructure: take iii
On 17/06/2009 03:56, "Simon Horman" <horms@verge.net.au> wrote:> 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 patch series applies against: > http://xenbits.xensource.com/xen-unstable.hg 19745:55ca7ef865b4http://xenbits.xensource.com/staging/xen-unstable.hg is now at c/s 19770, and as I already said I''ve already applied half these patches. I was expecting a set of about 8 patches comprising the synced-up remainder that I could not apply to current staging tip. Thanks, Keir _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Keir Fraser
2009-Jun-17  06:41 UTC
Re: [Xen-devel] [patch 00/17] xend: pass-through: various clean-ups and infrastructure: take iii
On 17/06/2009 07:12, "Keir Fraser" <keir.fraser@eu.citrix.com> wrote:>> 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 patch series applies against: >> http://xenbits.xensource.com/xen-unstable.hg 19745:55ca7ef865b4 > > http://xenbits.xensource.com/staging/xen-unstable.hg is now at c/s 19770, > and as I already said I''ve already applied half these patches. I was > expecting a set of about 8 patches comprising the synced-up remainder that I > could not apply to current staging tip.Scrub that. The patches you sent as attachments applied just fine. Please check xen-unstable as of c/s 19783 to check all your patches are applied as you wish. -- Keir _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Simon Horman
2009-Jun-17  06:55 UTC
Re: [Xen-devel] [patch 00/17] xend: pass-through: various clean-ups and infrastructure: take iii
On Wed, Jun 17, 2009 at 07:41:41AM +0100, Keir Fraser wrote:> On 17/06/2009 07:12, "Keir Fraser" <keir.fraser@eu.citrix.com> wrote: > > >> 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 patch series applies against: > >> http://xenbits.xensource.com/xen-unstable.hg 19745:55ca7ef865b4 > > > > http://xenbits.xensource.com/staging/xen-unstable.hg is now at c/s 19770, > > and as I already said I''ve already applied half these patches. I was > > expecting a set of about 8 patches comprising the synced-up remainder that I > > could not apply to current staging tip.Sorry, I got confused and checked out xen-unstable.hg instead of staging/xen-unstable.hg by mistake - which confused me even further.> Scrub that. The patches you sent as attachments applied just fine. Please > check xen-unstable as of c/s 19783 to check all your patches are applied as > you wish.Thanks, I will run my tests and let you know what happens. _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Simon Horman
2009-Jun-17  07:17 UTC
Re: [Xen-devel] [patch 00/17] xend: pass-through: various clean-ups and infrastructure: take iii
On Wed, Jun 17, 2009 at 04:55:20PM +1000, Simon Horman wrote:> On Wed, Jun 17, 2009 at 07:41:41AM +0100, Keir Fraser wrote: > > On 17/06/2009 07:12, "Keir Fraser" <keir.fraser@eu.citrix.com> wrote: > > > > >> 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 patch series applies against: > > >> http://xenbits.xensource.com/xen-unstable.hg 19745:55ca7ef865b4 > > > > > > http://xenbits.xensource.com/staging/xen-unstable.hg is now at c/s 19770, > > > and as I already said I''ve already applied half these patches. I was > > > expecting a set of about 8 patches comprising the synced-up remainder that I > > > could not apply to current staging tip. > > Sorry, I got confused and checked out xen-unstable.hg instead of > staging/xen-unstable.hg by mistake - which confused me even further. > > > Scrub that. The patches you sent as attachments applied just fine. Please > > check xen-unstable as of c/s 19783 to check all your patches are applied as > > you wish. > > Thanks, I will run my tests and let you know what happens.19783 passes my tests _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel