[libvirt] [PATCH v3 2/6] nodedev: conf: Split PCI sub-capability parsing to separate methods

Erik Skultety posted 6 patches 8 years, 9 months ago
There is a newer version of this series
[libvirt] [PATCH v3 2/6] nodedev: conf: Split PCI sub-capability parsing to separate methods
Posted by Erik Skultety 8 years, 9 months ago
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: Erik Skultety <eskultet@redhat.com>
---
 src/conf/node_device_conf.c | 130 ++++++++++++++++++++++++++------------------
 1 file changed, 77 insertions(+), 53 deletions(-)

diff --git a/src/conf/node_device_conf.c b/src/conf/node_device_conf.c
index 85cfd8396..d70d9942c 100644
--- a/src/conf/node_device_conf.c
+++ b/src/conf/node_device_conf.c
@@ -1286,76 +1286,102 @@ virPCIEDeviceInfoParseXML(xmlXPathContextPtr ctxt,
 
 
 static int
-virNodeDevPCICapabilityParseXML(xmlXPathContextPtr ctxt,
-                                xmlNodePtr node,
-                                virNodeDevCapPCIDevPtr pci_dev)
+virNodeDevPCICapSRIOVPhysicalParseXML(xmlXPathContextPtr ctxt,
+                                      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)
-            goto out;
+            return -1;
 
         if (!address) {
             virReportError(VIR_ERR_XML_ERROR, "%s",
                            _("Missing address in 'phys_function' capability"));
-            goto out;
+            return -1;
         }
 
         if (virPCIDeviceAddressParseXML(address,
                                         pci_dev->physical_function) < 0)
-            goto out;
+            return -1;
 
         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)
-            goto out;
-
-        if (maxFuncsStr &&
-            virStrToLong_uip(maxFuncsStr, NULL, 10,
-                             &pci_dev->max_virtual_functions) < 0) {
-            virReportError(VIR_ERR_XML_ERROR, "%s",
-                           _("Malformed 'maxCount' parameter"));
-            goto out;
-        }
 
-        if (VIR_ALLOC_N(pci_dev->virtual_functions, naddresses) < 0)
-            goto out;
+    return 0;
+}
+
+
+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;
 
-        for (i = 0; i < naddresses; i++) {
-            virPCIDeviceAddressPtr addr = NULL;
+    if (naddresses < 0)
+        goto cleanup;
 
-            if (VIR_ALLOC(addr) < 0)
-                goto out;
+    if (maxFuncsStr &&
+        virStrToLong_uip(maxFuncsStr, NULL, 10,
+                         &pci_dev->max_virtual_functions) < 0) {
+        virReportError(VIR_ERR_XML_ERROR, "%s",
+                       _("Malformed 'maxCount' parameter"));
+        goto cleanup;
+    }
 
-            if (virPCIDeviceAddressParseXML(addresses[i], addr) < 0) {
-                VIR_FREE(addr);
-                goto out;
-            }
+    if (VIR_ALLOC_N(pci_dev->virtual_functions, naddresses) < 0)
+        goto cleanup;
 
-            if (VIR_APPEND_ELEMENT(pci_dev->virtual_functions,
-                                   pci_dev->num_virtual_functions,
-                                   addr) < 0)
-                goto out;
+    for (i = 0; i < naddresses; i++) {
+        virPCIDeviceAddressPtr addr = NULL;
+
+        if (VIR_ALLOC(addr) < 0)
+            goto cleanup;
+
+        if (virPCIDeviceAddressParseXML(addresses[i], addr) < 0) {
+            VIR_FREE(addr);
+            goto cleanup;
         }
 
-        pci_dev->flags |= VIR_NODE_DEV_CAP_FLAG_PCI_VIRTUAL_FUNCTION;
+        if (VIR_APPEND_ELEMENT(pci_dev->virtual_functions,
+                               pci_dev->num_virtual_functions,
+                               addr) < 0)
+            goto cleanup;
+    }
+
+    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 {
         int hdrType = virPCIHeaderTypeFromString(type);
 
@@ -1364,9 +1390,7 @@ virNodeDevPCICapabilityParseXML(xmlXPathContextPtr ctxt,
     }
 
     ret = 0;
- out:
-    VIR_FREE(addresses);
-    VIR_FREE(maxFuncsStr);
+ cleanup:
     VIR_FREE(type);
     ctxt->node = orignode;
     return ret;
-- 
2.12.2

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCH v3 2/6] nodedev: conf: Split PCI sub-capability parsing to separate methods
Posted by Pavel Hrdina 8 years, 9 months ago
On Wed, Apr 26, 2017 at 04:55:29PM +0200, Erik Skultety wrote:
> 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: Erik Skultety <eskultet@redhat.com>
> ---
>  src/conf/node_device_conf.c | 130 ++++++++++++++++++++++++++------------------
>  1 file changed, 77 insertions(+), 53 deletions(-)
> 
> diff --git a/src/conf/node_device_conf.c b/src/conf/node_device_conf.c
> index 85cfd8396..d70d9942c 100644
> --- a/src/conf/node_device_conf.c
> +++ b/src/conf/node_device_conf.c
> @@ -1286,76 +1286,102 @@ virPCIEDeviceInfoParseXML(xmlXPathContextPtr ctxt,
>  
>  
>  static int
> -virNodeDevPCICapabilityParseXML(xmlXPathContextPtr ctxt,
> -                                xmlNodePtr node,
> -                                virNodeDevCapPCIDevPtr pci_dev)
> +virNodeDevPCICapSRIOVPhysicalParseXML(xmlXPathContextPtr ctxt,
> +                                      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)
> -            goto out;
> +            return -1;
>  
>          if (!address) {
>              virReportError(VIR_ERR_XML_ERROR, "%s",
>                             _("Missing address in 'phys_function' capability"));
> -            goto out;
> +            return -1;
>          }
>  
>          if (virPCIDeviceAddressParseXML(address,
>                                          pci_dev->physical_function) < 0)
> -            goto out;
> +            return -1;
>  
>          pci_dev->flags |= VIR_NODE_DEV_CAP_FLAG_PCI_PHYSICAL_FUNCTION;

Wrong indentation of the function body.

Pavel
--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list