aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKeir Fraser <keir.fraser@citrix.com>2009-01-08 11:26:16 +0000
committerKeir Fraser <keir.fraser@citrix.com>2009-01-08 11:26:16 +0000
commit925d7f9d822d213043229f79c4a72f95385fd03f (patch)
tree10afa4aefbb8dfcbe4b0dc21bc782ef7b1dbf163
parent925b2ca585a28793c0dd2ee52f6842f89370cb4c (diff)
downloadxen-925d7f9d822d213043229f79c4a72f95385fd03f.tar.gz
xen-925d7f9d822d213043229f79c4a72f95385fd03f.tar.bz2
xen-925d7f9d822d213043229f79c4a72f95385fd03f.zip
pci: add pci option support for XenAPI sever
Allow the per-device options for passthrough pci devices This patch is for XenAPI server A new key-value pair element of 'pci' named 'pci_opt' is added to xml config file Signed-off-by: Qing He <qing.he@intel.com>
-rw-r--r--tools/python/xen/xend/XendConfig.py10
-rw-r--r--tools/python/xen/xend/XendDPCI.py7
-rw-r--r--tools/python/xen/xend/XendDomainInfo.py6
-rw-r--r--tools/python/xen/xm/create.dtd7
-rw-r--r--tools/python/xen/xm/main.py3
-rw-r--r--tools/python/xen/xm/xenapi_create.py11
6 files changed, 40 insertions, 4 deletions
diff --git a/tools/python/xen/xend/XendConfig.py b/tools/python/xen/xend/XendConfig.py
index adef04dd06..9b436ae647 100644
--- a/tools/python/xen/xend/XendConfig.py
+++ b/tools/python/xen/xend/XendConfig.py
@@ -1247,6 +1247,11 @@ class XendConfig(dict):
'PPCI': ppci_uuid,
'hotplug_slot': pci_dev.get('vslot', 0)
}
+
+ dpci_opts = pci_dev.get('opts')
+ if dpci_opts and len(dpci_opts) > 0:
+ dpci_record['options'] = dpci_opts
+
XendDPCI(dpci_uuid, dpci_record)
target['devices'][pci_devs_uuid] = (dev_type,
@@ -1762,6 +1767,11 @@ class XendConfig(dict):
'PPCI': ppci_uuid,
'hotplug_slot': pci_dev.get('vslot', 0)
}
+
+ dpci_opts = pci_dev.get('opts')
+ if dpci_opts and len(dpci_opts) > 0:
+ dpci_record['options'] = dpci_opts
+
XendDPCI(dpci_uuid, dpci_record)
self['devices'][dev_uuid] = (dev_type,
diff --git a/tools/python/xen/xend/XendDPCI.py b/tools/python/xen/xend/XendDPCI.py
index c5dc920cfb..0a564d7c23 100644
--- a/tools/python/xen/xend/XendDPCI.py
+++ b/tools/python/xen/xend/XendDPCI.py
@@ -41,7 +41,8 @@ class XendDPCI(XendBase):
'virtual_name',
'VM',
'PPCI',
- 'hotplug_slot']
+ 'hotplug_slot',
+ 'options']
return XendBase.getAttrRO() + attrRO
def getAttrRW(self):
@@ -119,6 +120,8 @@ class XendDPCI(XendBase):
self.VM = record['VM']
self.PPCI = record['PPCI']
self.hotplug_slot = record['hotplug_slot']
+ if 'options' in record.keys():
+ self.options = record['options']
def destroy(self):
xendom = XendDomain.instance()
@@ -152,3 +155,5 @@ class XendDPCI(XendBase):
def get_hotplug_slot(self):
return self.hotplug_slot
+ def get_options(self):
+ return self.options
diff --git a/tools/python/xen/xend/XendDomainInfo.py b/tools/python/xen/xend/XendDomainInfo.py
index 9184ee2869..7feca1c22d 100644
--- a/tools/python/xen/xend/XendDomainInfo.py
+++ b/tools/python/xen/xend/XendDomainInfo.py
@@ -3538,6 +3538,11 @@ class XendDomainInfo:
dpci_uuid = uuid.createString()
+ dpci_opts = []
+ opts_dict = xenapi_pci.get('options')
+ for k in opts_dict.keys():
+ dpci_opts.append([k, opts_dict[k]])
+
# Convert xenapi to sxp
ppci = XendAPIStore.get(xenapi_pci.get('PPCI'), 'PPCI')
@@ -3549,6 +3554,7 @@ class XendDomainInfo:
['slot', '0x%02x' % ppci.get_slot()],
['func', '0x%1x' % ppci.get_func()],
['vslt', '0x%02x' % xenapi_pci.get('hotplug_slot')],
+ ['opts', dpci_opts],
['uuid', dpci_uuid]
],
['state', 'Initialising']
diff --git a/tools/python/xen/xm/create.dtd b/tools/python/xen/xm/create.dtd
index bae076afe7..9b76ca4e9f 100644
--- a/tools/python/xen/xm/create.dtd
+++ b/tools/python/xen/xm/create.dtd
@@ -82,11 +82,12 @@
<!ELEMENT vtpm (name*)>
<!ATTLIST vtpm backend CDATA #REQUIRED>
-<!ELEMENT pci EMPTY>
+<!ELEMENT pci (pci_opt*)>
<!ATTLIST pci domain CDATA #REQUIRED
bus CDATA #REQUIRED
slot CDATA #REQUIRED
func CDATA #REQUIRED
+ opts_str CDATA #IMPLIED
vslt CDATA #IMPLIED>
<!ELEMENT vscsi EMPTY>
@@ -138,6 +139,10 @@
<!ATTLIST vcpu_param key CDATA #REQUIRED
value CDATA #REQUIRED>
+<!ELEMENT pci_opt EMPTY>
+<!ATTLIST pci_opt key CDATA #REQUIRED
+ value CDATA #REQUIRED>
+
<!ELEMENT other_config EMPTY>
<!ATTLIST other_config key CDATA #REQUIRED
value CDATA #REQUIRED>
diff --git a/tools/python/xen/xm/main.py b/tools/python/xen/xm/main.py
index 8fe6b8bbcf..d32fd3f339 100644
--- a/tools/python/xen/xm/main.py
+++ b/tools/python/xen/xm/main.py
@@ -2499,7 +2499,8 @@ def xm_pci_attach(args):
dpci_record = {
"VM": get_single_vm(dom),
"PPCI": target_ref,
- "hotplug_slot": vslt
+ "hotplug_slot": vslt,
+ "options": dict([k, v] for k, v in config_pci_opts)
}
server.xenapi.DPCI.create(dpci_record)
diff --git a/tools/python/xen/xm/xenapi_create.py b/tools/python/xen/xm/xenapi_create.py
index b49913c190..c1cc66ec52 100644
--- a/tools/python/xen/xm/xenapi_create.py
+++ b/tools/python/xen/xm/xenapi_create.py
@@ -533,7 +533,10 @@ class xenapi_create:
"PPCI":
target_ref,
"hotplug_slot":
- int(pci.attributes["func"].value, 16)
+ int(pci.attributes["func"].value, 16),
+ "options":
+ get_child_nodes_as_dict(pci,
+ "pci_opt", "key", "value")
}
return server.xenapi.DPCI.create(dpci_record)
@@ -931,6 +934,12 @@ class sxp2xml:
= get_child_by_name(dev_sxp, "func", "0")
pci.attributes["vslt"] \
= get_child_by_name(dev_sxp, "vslt", "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)
pcis.append(pci)