]> xenbits.xensource.com Git - people/liuw/libxenctrl-split/libvirt.git/commitdiff
interface: re-use name and mac address rather than re-retrieving
authorLaine Stump <laine@laine.org>
Fri, 18 Sep 2015 17:19:27 +0000 (13:19 -0400)
committerLaine Stump <laine@laine.org>
Fri, 2 Oct 2015 15:16:11 +0000 (11:16 -0400)
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

index a01fbd6fe8715d79087982257bc3dba33ed2ae0d..169ca571fa86eada4e27e070c6355a063d625128 100644 (file)
@@ -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);