[libvirt] [PATCH] network: fix connection usage counts after restart

Daniel P. Berrangé berrange at redhat.com
Fri Sep 13 14:59:15 UTC 2019


Since the introduction of the virNetworkPort object, the network driver
has a persistent record of ports that have been created against the
networks. Thus the hypervisor drivers no longer communicate to the
network driver during libvirtd restart.

This change, however, meant that the connection usage counts were
no longer re-initialized during a libvirtd restart. To deal with this we
must iterate over all virNetworkPortDefPtr objects we have and invoke
the notify callback to record the connection usage count.

Signed-off-by: Daniel P. Berrangé <berrange at redhat.com>
---
 src/conf/virnetworkobj.c    | 33 +++++++++++++++++++++++++++++++++
 src/conf/virnetworkobj.h    |  9 +++++++++
 src/libvirt_private.syms    |  1 +
 src/network/bridge_driver.c | 17 +++++++++++++++++
 4 files changed, 60 insertions(+)

diff --git a/src/conf/virnetworkobj.c b/src/conf/virnetworkobj.c
index d63ead7fac..ca1d598cf9 100644
--- a/src/conf/virnetworkobj.c
+++ b/src/conf/virnetworkobj.c
@@ -1844,6 +1844,39 @@ virNetworkObjPortListExport(virNetworkPtr net,
 }
 
 
+typedef struct _virNetworkObjPortListForEachData virNetworkObjPortListForEachData;
+struct _virNetworkObjPortListForEachData {
+    virNetworkPortListIter iter;
+    void *opaque;
+    bool err;
+};
+
+static int
+virNetworkObjPortForEachCallback(void *payload,
+                                 const void *name ATTRIBUTE_UNUSED,
+                                 void *opaque)
+{
+    virNetworkObjPortListForEachData *data = opaque;
+
+    if (!data->iter(payload, data->opaque))
+        data->err = true;
+
+    return 0;
+}
+
+int
+virNetworkObjPortForEach(virNetworkObjPtr obj,
+                         virNetworkPortListIter iter,
+                         void *opaque)
+{
+    virNetworkObjPortListForEachData data = { iter, opaque, false };
+    virHashForEach(obj->ports, virNetworkObjPortForEachCallback, &data);
+    if (data.err)
+        return -1;
+    return 0;
+}
+
+
 static int
 virNetworkObjLoadAllPorts(virNetworkObjPtr net,
                           const char *stateDir)
diff --git a/src/conf/virnetworkobj.h b/src/conf/virnetworkobj.h
index 1c28f0888c..a91b4304c6 100644
--- a/src/conf/virnetworkobj.h
+++ b/src/conf/virnetworkobj.h
@@ -190,6 +190,15 @@ virNetworkObjPortListExport(virNetworkPtr net,
                             virNetworkPortPtr **ports,
                             virNetworkPortListFilter filter);
 
+typedef bool
+(*virNetworkPortListIter)(virNetworkPortDefPtr portdef,
+                          void *opaque);
+
+int
+virNetworkObjPortForEach(virNetworkObjPtr obj,
+                         virNetworkPortListIter iter,
+                         void *opaque);
+
 int
 virNetworkObjSaveStatus(const char *statusDir,
                         virNetworkObjPtr net,
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 7fe10d2286..37afb07e21 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -1097,6 +1097,7 @@ virNetworkObjLookupPort;
 virNetworkObjMacMgrAdd;
 virNetworkObjMacMgrDel;
 virNetworkObjNew;
+virNetworkObjPortForEach;
 virNetworkObjPortListExport;
 virNetworkObjRemoveInactive;
 virNetworkObjReplacePersistentDef;
diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c
index 7b44184616..0fee153cb8 100644
--- a/src/network/bridge_driver.c
+++ b/src/network/bridge_driver.c
@@ -527,6 +527,21 @@ networkBridgeDummyNicName(const char *brname)
 }
 
 
+static int
+networkNotifyPort(virNetworkObjPtr obj,
+                  virNetworkPortDefPtr port);
+
+static bool
+networkUpdatePort(virNetworkPortDefPtr port,
+                  void *opaque)
+{
+    virNetworkObjPtr obj = opaque;
+
+    networkNotifyPort(obj, port);
+
+    return false;
+}
+
 static int
 networkUpdateState(virNetworkObjPtr obj,
                    void *opaque)
@@ -591,6 +606,8 @@ networkUpdateState(virNetworkObjPtr obj,
         goto cleanup;
     }
 
+    virNetworkObjPortForEach(obj, networkUpdatePort, obj);
+
     /* Try and read dnsmasq/radvd pids of active networks */
     if (virNetworkObjIsActive(obj) && def->ips && (def->nips > 0)) {
         pid_t radvdPid;
-- 
2.21.0




More information about the libvir-list mailing list