All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] xend: Update info['platform']['pci']
@ 2009-05-28  7:01 Masaki Kanno
  2009-05-28 10:46 ` Simon Horman
  2009-06-01  6:01 ` Zhai, Edwin
  0 siblings, 2 replies; 8+ messages in thread
From: Masaki Kanno @ 2009-05-28  7:01 UTC (permalink / raw)
  To: xen-devel; +Cc: horms

[-- Attachment #1: Mail message body --]
[-- Type: text/plain, Size: 719 bytes --]

Hi,

This patch updates info['platform']['pci'] for PCI devices assignment 
to domains.

When a domain is started, xend confirms by using xc.test_assign_device 
whether PCI devices can be assigned to the domain. 
For the confirmation, info['platform']['pci'] must be an appropriate 
value.  However, info['platform']['pci'] may be not appropriate. 
Because info['platform']['pci'] isn't almost always updated even if 
the PCI device configuration of the domain was changed by using 
xm pci-attach/detach. 
This patch updates info['platform']['pci'] to the appropriate value 
when domains are started.

Cc: Simon Horman <horms@verge.net.au>
Signed-off-by: Masaki Kanno <kanno.masaki@jp.fujitsu.com>

Best regards,
 Kan


[-- Attachment #2: update_platform_pci.patch --]
[-- Type: application/octet-stream, Size: 6279 bytes --]

diff -r fe68405201d2 tools/python/xen/util/pci.py
--- a/tools/python/xen/util/pci.py	Wed May 27 15:55:29 2009 +0100
+++ b/tools/python/xen/util/pci.py	Thu May 28 11:56:44 2009 +0900
@@ -14,6 +14,7 @@
 import time
 import threading
 from xen.util import utils
+from xen.xend import sxp
 
 PROC_PCI_PATH = '/proc/bus/pci/devices'
 PROC_PCI_NUM_RESOURCES = 7
@@ -140,10 +141,17 @@
     return (domain, bus, slot, func)
 
 def assigned_or_requested_vslot(dev):
-    if dev.has_key("vslot"):
-        return dev["vslot"]
-    if dev.has_key("requested_vslot"):
-        return dev["requested_vslot"]
+    if isinstance(dev, types.DictType):
+        if dev.has_key("vslot"):
+            return dev["vslot"]
+        if dev.has_key("requested_vslot"):
+            return dev["requested_vslot"]
+    elif isinstance(dev, (types.ListType, types.TupleType)):
+        vslot = sxp.child_value(dev, 'vslot', None)
+        if not vslot:
+            vslot = sxp.child_value(dev, 'requested_vslot', None)
+        if vslot:
+            return vslot
     raise PciDeviceVslotMissing("%s" % dev)
 
 def find_sysfs_mnt():
diff -r fe68405201d2 tools/python/xen/xend/XendConfig.py
--- a/tools/python/xen/xend/XendConfig.py	Wed May 27 15:55:29 2009 +0100
+++ b/tools/python/xen/xend/XendConfig.py	Thu May 28 11:56:44 2009 +0900
@@ -37,6 +37,7 @@
 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 assigned_or_requested_vslot
 from xen.util import xsconstants
 import xen.util.auxbin
 
@@ -2186,3 +2187,26 @@
 
     def is_hap(self):
         return self['platform'].get('hap', 0)
+
+    def update_platform_pci(self):
+        if not self.is_hvm():
+            return
+
+        pci = []
+        for dev_type, dev_info in self.all_devices_sxpr():
+            if dev_type != 'pci':
+                continue
+            for dev in sxp.children(dev_info, 'dev'):
+                domain = sxp.child_value(dev, 'domain')
+                bus = sxp.child_value(dev, 'bus')
+                slot = sxp.child_value(dev, 'slot')
+                func = sxp.child_value(dev, 'func')
+                vslot = assigned_or_requested_vslot(dev) 
+                opts = ''
+                for opt in sxp.child_value(dev, 'opts', []):
+                    if opts:
+                        opts += ','
+                    opts += '%s=%s' % (opt[0], str(opt[1]))
+                pci.append([domain, bus, slot, func, vslot, opts])
+        self['platform']['pci'] = pci
+
diff -r fe68405201d2 tools/python/xen/xend/XendDomainInfo.py
--- a/tools/python/xen/xend/XendDomainInfo.py	Wed May 27 15:55:29 2009 +0100
+++ b/tools/python/xen/xend/XendDomainInfo.py	Thu May 28 11:56:44 2009 +0900
@@ -893,18 +893,9 @@
             if num_devs == 0:
                 if self.info.is_hvm():
                     self.destroyDevice('pci', devid, True)
-                    del self.info['devices'][dev_uuid]
-                    platform = self.info['platform']
-                    orig_dev_num = len(platform['pci'])
-                    # TODO: can use this to keep some info to ask high level
-                    # management tools to hot insert a new passthrough dev
-                    # after migration
-                    if orig_dev_num != 0:
-                        #platform['pci'] = ["%dDEVs" % orig_dev_num]
-                        platform['pci'] = []
                 else:
                     self.destroyDevice('pci', devid)
-                    del self.info['devices'][dev_uuid]
+                del self.info['devices'][dev_uuid]
         else:
             new_dev_sxp = ['pci']
             for cur_dev in sxp.children(existing_dev_info, 'dev'):
@@ -923,18 +914,9 @@
             dev_uuid = sxp.child_value(existing_dev_info, 'uuid')
             self.info.device_update(dev_uuid, new_dev_sxp)
 
-            # If there is only 'vscsi' in new_dev_sxp, remove the config.
+            # If there is no device left, remove config.
             if len(sxp.children(new_dev_sxp, 'dev')) == 0:
                 del self.info['devices'][dev_uuid]
-                if self.info.is_hvm():
-                    platform = self.info['platform']
-                    orig_dev_num = len(platform['pci'])
-                    # TODO: can use this to keep some info to ask high level
-                    # management tools to hot insert a new passthrough dev
-                    # after migration
-                    if orig_dev_num != 0:
-                        #platform['pci'] = ["%dDEVs" % orig_dev_num]
-                        platform['pci'] = []
 
         xen.xend.XendDomain.instance().managed_config_save(self)
 
@@ -2463,6 +2445,7 @@
                               (self.getVCpuCount() * 100))
 
         # Test whether the devices can be assigned with VT-d
+        self.info.update_platform_pci()
         pci = self.info["platform"].get("pci")
         pci_str = ''
         if pci and len(pci) > 0:
diff -r fe68405201d2 tools/python/xen/xend/server/pciif.py
--- a/tools/python/xen/xend/server/pciif.py	Wed May 27 15:55:29 2009 +0100
+++ b/tools/python/xen/xend/server/pciif.py	Thu May 28 11:56:44 2009 +0900
@@ -223,6 +223,11 @@
                     except IndexError:
                         dev_dict['vslot'] = AUTO_PHP_SLOT_STR
 
+                #append opts info
+                opts = self.readBackend(devid, 'opts-%d' % i)
+                if opts is not None:
+                    dev_dict['opts'] = opts
+
                 pci_devs.append(dev_dict)
 
         result['devs'] = pci_devs
@@ -243,8 +248,14 @@
         
         for dev in devs:
             dev_sxpr = ['dev']
-            for dev_item in dev.items():
-                dev_sxpr.append(list(dev_item))
+            for dev_key, dev_val in dev.items():
+                if dev_key == 'opts':
+                    opts = []
+                    for opt in dev_val.split(','):
+                        opts.append(opt.split('='))
+                    dev_sxpr.append(['opts', opts])
+                else:
+                    dev_sxpr.append([dev_key, dev_val])
             sxpr.append(dev_sxpr)
         
         for key, val in configDict.items():

[-- Attachment #3: Type: text/plain, Size: 138 bytes --]

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2009-06-01  9:54 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-05-28  7:01 [PATCH] xend: Update info['platform']['pci'] Masaki Kanno
2009-05-28 10:46 ` Simon Horman
2009-06-01  4:08   ` Masaki Kanno
2009-06-01  4:24     ` Simon Horman
2009-06-01  5:50       ` Masaki Kanno
2009-06-01  6:01 ` Zhai, Edwin
2009-06-01  9:35   ` Masaki Kanno
2009-06-01  9:54     ` Zhai, Edwin

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.