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 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list