提交 a5c1f3b7 编写于 作者: E Erik Skultety

nodedev: conf: Split PCI sub-capability parsing to separate methods

Since there's at least SRIOV and MDEV sub-capabilities to be parsed,
let's make the code more readable by splitting it to several logical
blocks.
Signed-off-by: NErik Skultety <eskultet@redhat.com>
上级 3a2a2a74
...@@ -1286,76 +1286,102 @@ virPCIEDeviceInfoParseXML(xmlXPathContextPtr ctxt, ...@@ -1286,76 +1286,102 @@ virPCIEDeviceInfoParseXML(xmlXPathContextPtr ctxt,
static int static int
virNodeDevPCICapabilityParseXML(xmlXPathContextPtr ctxt, virNodeDevPCICapSRIOVPhysicalParseXML(xmlXPathContextPtr ctxt,
xmlNodePtr node,
virNodeDevCapPCIDevPtr pci_dev) virNodeDevCapPCIDevPtr pci_dev)
{ {
char *maxFuncsStr = virXMLPropString(node, "maxCount");
char *type = virXMLPropString(node, "type");
xmlNodePtr *addresses = NULL;
xmlNodePtr orignode = ctxt->node;
int ret = -1;
size_t i = 0;
ctxt->node = node;
if (!type) {
virReportError(VIR_ERR_XML_ERROR, "%s", _("Missing capability type"));
goto out;
}
if (STREQ(type, "phys_function")) {
xmlNodePtr address = virXPathNode("./address[1]", ctxt); xmlNodePtr address = virXPathNode("./address[1]", ctxt);
if (VIR_ALLOC(pci_dev->physical_function) < 0) if (VIR_ALLOC(pci_dev->physical_function) < 0)
goto out; return -1;
if (!address) { if (!address) {
virReportError(VIR_ERR_XML_ERROR, "%s", virReportError(VIR_ERR_XML_ERROR, "%s",
_("Missing address in 'phys_function' capability")); _("Missing address in 'phys_function' capability"));
goto out; return -1;
} }
if (virPCIDeviceAddressParseXML(address, if (virPCIDeviceAddressParseXML(address,
pci_dev->physical_function) < 0) pci_dev->physical_function) < 0)
goto out; return -1;
pci_dev->flags |= VIR_NODE_DEV_CAP_FLAG_PCI_PHYSICAL_FUNCTION; pci_dev->flags |= VIR_NODE_DEV_CAP_FLAG_PCI_PHYSICAL_FUNCTION;
} else if (STREQ(type, "virt_functions")) {
int naddresses;
if ((naddresses = virXPathNodeSet("./address", ctxt, &addresses)) < 0) return 0;
goto out; }
static int
virNodeDevPCICapSRIOVVirtualParseXML(xmlXPathContextPtr ctxt,
virNodeDevCapPCIDevPtr pci_dev)
{
int ret = -1;
xmlNodePtr *addresses = NULL;
int naddresses = virXPathNodeSet("./address", ctxt, &addresses);
char *maxFuncsStr = virXPathString("string(./@maxCount)", ctxt);
size_t i;
if (naddresses < 0)
goto cleanup;
if (maxFuncsStr && if (maxFuncsStr &&
virStrToLong_uip(maxFuncsStr, NULL, 10, virStrToLong_uip(maxFuncsStr, NULL, 10,
&pci_dev->max_virtual_functions) < 0) { &pci_dev->max_virtual_functions) < 0) {
virReportError(VIR_ERR_XML_ERROR, "%s", virReportError(VIR_ERR_XML_ERROR, "%s",
_("Malformed 'maxCount' parameter")); _("Malformed 'maxCount' parameter"));
goto out; goto cleanup;
} }
if (VIR_ALLOC_N(pci_dev->virtual_functions, naddresses) < 0) if (VIR_ALLOC_N(pci_dev->virtual_functions, naddresses) < 0)
goto out; goto cleanup;
for (i = 0; i < naddresses; i++) { for (i = 0; i < naddresses; i++) {
virPCIDeviceAddressPtr addr = NULL; virPCIDeviceAddressPtr addr = NULL;
if (VIR_ALLOC(addr) < 0) if (VIR_ALLOC(addr) < 0)
goto out; goto cleanup;
if (virPCIDeviceAddressParseXML(addresses[i], addr) < 0) { if (virPCIDeviceAddressParseXML(addresses[i], addr) < 0) {
VIR_FREE(addr); VIR_FREE(addr);
goto out; goto cleanup;
} }
if (VIR_APPEND_ELEMENT(pci_dev->virtual_functions, if (VIR_APPEND_ELEMENT(pci_dev->virtual_functions,
pci_dev->num_virtual_functions, pci_dev->num_virtual_functions,
addr) < 0) addr) < 0)
goto out; goto cleanup;
} }
pci_dev->flags |= VIR_NODE_DEV_CAP_FLAG_PCI_VIRTUAL_FUNCTION; pci_dev->flags |= VIR_NODE_DEV_CAP_FLAG_PCI_VIRTUAL_FUNCTION;
ret = 0;
cleanup:
VIR_FREE(addresses);
VIR_FREE(maxFuncsStr);
return ret;
}
static int
virNodeDevPCICapabilityParseXML(xmlXPathContextPtr ctxt,
xmlNodePtr node,
virNodeDevCapPCIDevPtr pci_dev)
{
char *type = virXMLPropString(node, "type");
xmlNodePtr orignode = ctxt->node;
int ret = -1;
ctxt->node = node;
if (!type) {
virReportError(VIR_ERR_XML_ERROR, "%s", _("Missing capability type"));
goto cleanup;
}
if (STREQ(type, "phys_function") &&
virNodeDevPCICapSRIOVPhysicalParseXML(ctxt, pci_dev) < 0) {
goto cleanup;
} else if (STREQ(type, "virt_functions") &&
virNodeDevPCICapSRIOVVirtualParseXML(ctxt, pci_dev) < 0) {
goto cleanup;
} else { } else {
int hdrType = virPCIHeaderTypeFromString(type); int hdrType = virPCIHeaderTypeFromString(type);
...@@ -1364,9 +1390,7 @@ virNodeDevPCICapabilityParseXML(xmlXPathContextPtr ctxt, ...@@ -1364,9 +1390,7 @@ virNodeDevPCICapabilityParseXML(xmlXPathContextPtr ctxt,
} }
ret = 0; ret = 0;
out: cleanup:
VIR_FREE(addresses);
VIR_FREE(maxFuncsStr);
VIR_FREE(type); VIR_FREE(type);
ctxt->node = orignode; ctxt->node = orignode;
return ret; return ret;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册