From mboxrd@z Thu Jan 1 00:00:00 1970 From: Yosuke Iwamatsu Subject: [PATCH] XM on XenAPI: Create PCI-Assigned Domains in XenAPI Mode Date: Thu, 31 Jul 2008 21:13:29 +0900 Message-ID: <4891AC69.3010108@ab.jp.nec.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="------------030106050600070003050208" Return-path: List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xensource.com Errors-To: xen-devel-bounces@lists.xensource.com To: xen-devel@lists.xensource.com List-Id: xen-devel@lists.xenproject.org This is a multi-part message in MIME format. --------------030106050600070003050208 Content-Type: text/plain; charset=ISO-2022-JP Content-Transfer-Encoding: 7bit Create domains with pci devices attached to it when 'xm create' is invoked in xen-api mode. Regards, ----------------------- Yosuke Iwamatsu NEC Corporation --------------030106050600070003050208 Content-Type: all/allfiles; name="xm_xenapi_create_pci.patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="xm_xenapi_create_pci.patch" xm on xenapi: Add missing support for creating pci-assigned domains Signed-off-by: Yosuke Iwamatsu diff -r 21dd1fdb73d8 tools/python/xen/xm/create.dtd --- a/tools/python/xen/xm/create.dtd Wed Jul 30 16:22:45 2008 +0100 +++ b/tools/python/xen/xm/create.dtd Thu Jul 31 14:58:44 2008 +0900 @@ -39,6 +39,7 @@ vbd*, vif*, vtpm*, + pci*, console*, platform*, vcpu_param*, @@ -79,6 +80,13 @@ + + + diff -r 21dd1fdb73d8 tools/python/xen/xm/xenapi_create.py --- a/tools/python/xen/xm/xenapi_create.py Wed Jul 30 16:22:45 2008 +0100 +++ b/tools/python/xen/xm/xenapi_create.py Thu Jul 31 14:58:44 2008 +0900 @@ -369,6 +369,12 @@ class xenapi_create: self.create_consoles(vm_ref, consoles) + # Now create pcis + + pcis = vm.getElementsByTagName("pci") + + self.create_pcis(vm_ref, pcis) + return vm_ref except: server.xenapi.VM.destroy(vm_ref) @@ -493,6 +499,39 @@ class xenapi_create: return server.xenapi.console.create(console_record) + def create_pcis(self, vm_ref, pcis): + log(DEBUG, "create_pcis") + return map(lambda pci: self.create_pci(vm_ref, pci), pcis) + + def create_pci(self, vm_ref, pci): + log(DEBUG, "create_pci") + + domain = int(pci.attributes["domain"].value, 16) + bus = int(pci.attributes["bus"].value, 16) + slot = int(pci.attributes["slot"].value, 16) + func = int(pci.attributes["func"].value, 16) + name = "%04x:%02x:%02x.%01x" % (domain, bus, slot, func) + + target_ref = None + for ppci_ref in server.xenapi.PPCI.get_all(): + if name == server.xenapi.PPCI.get_name(ppci_ref): + target_ref = ppci_ref + break + if target_ref is None: + log(DEBUG, "create_pci: pci device not found") + return None + + dpci_record = { + "VM": + vm_ref, + "PPCI": + target_ref, + "hotplug_slot": + int(pci.attributes["func"].value, 16) + } + + return server.xenapi.DPCI.create(dpci_record) + def get_child_by_name(exp, childname, default = None): try: return [child for child in sxp.children(exp) @@ -520,6 +559,9 @@ class sxp2xml: vfbs_sxp = map(lambda x: x[1], [device for device in devices if device[1][0] == "vfb"]) + + pcis_sxp = map(lambda x: x[1], [device for device in devices + if device[1][0] == "pci"]) # Create XML Document @@ -656,6 +698,12 @@ class sxp2xml: map(vm.appendChild, vtpms) + # And now the pcis + + pcis = self.extract_pcis(pcis_sxp, document) + + map(vm.appendChild, pcis) + # Last but not least the consoles... consoles = self.extract_consoles(image, document) @@ -823,7 +871,28 @@ class sxp2xml: return vfb - _eths = -1 + def extract_pcis(self, pcis_sxp, document): + + pcis = [] + + for pci_sxp in pcis_sxp: + for dev_sxp in sxp.children(pci_sxp, "dev"): + pci = document.createElement("pci") + + pci.attributes["domain"] \ + = get_child_by_name(dev_sxp, "domain", "0") + pci.attributes["bus"] \ + = get_child_by_name(dev_sxp, "bus", "0") + pci.attributes["slot"] \ + = get_child_by_name(dev_sxp, "slot", "0") + pci.attributes["func"] \ + = get_child_by_name(dev_sxp, "func", "0") + pci.attributes["vslt"] \ + = get_child_by_name(dev_sxp, "vslt", "0") + + pcis.append(pci) + + return pcis def mk_other_config(self, key, value, document): other_config = document.createElement("other_config") @@ -916,6 +985,8 @@ class sxp2xml: return platform_configs + _eths = -1 + def getFreshEthDevice(self): self._eths += 1 return "eth%i" % self._eths --------------030106050600070003050208 Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel --------------030106050600070003050208--