mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 10:40:03 +01:00
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>
This commit is contained in:
1 parent
925b2ca585
commit
925d7f9d82
6 files changed
+40
-4
No files matched your search
@@ -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,
|
||||
|
||||
@@ -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
|
||||
@@ -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']
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||