[libvirt] [PATCH 3/4] interface: re-use name and mac address rather than re-retrieving

Laine Stump laine at laine.org
Fri Sep 25 15:13:55 UTC 2015


Getting the MAC address of an interface is actually fairly expensive,
and we've already gotten it and stored it into def, so just keep def
around a bit longer and retrieve it from there.

This reduces the time for "virsh iface-list --all" from 28 to 23
seconds when there are 400 interfaces.
---
 src/interface/interface_backend_netcf.c | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/src/interface/interface_backend_netcf.c b/src/interface/interface_backend_netcf.c
index a01fbd6..169ca57 100644
--- a/src/interface/interface_backend_netcf.c
+++ b/src/interface/interface_backend_netcf.c
@@ -583,6 +583,7 @@ netcfConnectListAllInterfaces(virConnectPtr conn,
 
     for (i = 0; i < count; i++) {
         virInterfaceDefPtr def;
+
         iface = ncf_lookup_by_name(driver->netcf, names[i]);
         if (!iface) {
             const char *errmsg, *details;
@@ -615,27 +616,26 @@ netcfConnectListAllInterfaces(virConnectPtr conn,
             virInterfaceDefFree(def);
             continue;
         }
-        virInterfaceDefFree(def);
-
         /* XXX: Filter the result, need to be split once new filter flags
          * except active|inactive are supported.
          */
         if (MATCH(VIR_CONNECT_LIST_INTERFACES_FILTERS_ACTIVE) &&
             !((MATCH(VIR_CONNECT_LIST_INTERFACES_ACTIVE) && active) ||
               (MATCH(VIR_CONNECT_LIST_INTERFACES_INACTIVE) && !active))) {
+            virInterfaceDefFree(def);
             ncf_if_free(iface);
             iface = NULL;
             continue;
         }
 
         if (ifaces) {
-            if (!(iface_obj = virGetInterface(conn, ncf_if_name(iface),
-                                              ncf_if_mac_string(iface))))
+            if (!(iface_obj = virGetInterface(conn, def->name, def->mac)))
                 goto cleanup;
             tmp_iface_objs[niface_objs] = iface_obj;
         }
         niface_objs++;
 
+        virInterfaceDefFree(def);
         ncf_if_free(iface);
         iface = NULL;
     }
@@ -698,7 +698,7 @@ static virInterfacePtr netcfInterfaceLookupByName(virConnectPtr conn,
     if (virInterfaceLookupByNameEnsureACL(conn, def) < 0)
        goto cleanup;
 
-    ret = virGetInterface(conn, ncf_if_name(iface), ncf_if_mac_string(iface));
+    ret = virGetInterface(conn, def->name, def->mac);
 
  cleanup:
     ncf_if_free(iface);
@@ -746,7 +746,7 @@ static virInterfacePtr netcfInterfaceLookupByMACString(virConnectPtr conn,
     if (virInterfaceLookupByMACStringEnsureACL(conn, def) < 0)
        goto cleanup;
 
-    ret = virGetInterface(conn, ncf_if_name(iface), ncf_if_mac_string(iface));
+    ret = virGetInterface(conn, def->name, def->mac);
 
  cleanup:
     ncf_if_free(iface);
-- 
2.4.3




More information about the libvir-list mailing list