[libvirt] [PATCH 2/4] Introduce virNetlinkEventServiceStopAll() to stop all netlink services.

Tang Chen tangchen at cn.fujitsu.com
Tue Aug 21 10:12:16 UTC 2012


This patch introduce virNetlinkEventServiceStopAll() to stop
all the monitors to receive netlink messages for libvirtd.

Signed-off-by: Tang Chen <tangchen at cn.fujitsu.com>
---
 daemon/libvirtd.c        |    2 +-
 src/libvirt_private.syms |    1 +
 src/util/virnetlink.c    |   50 ++++++++++++++++++++++++++++++++++++++++++++++
 src/util/virnetlink.h    |    5 +++++
 4 files changed, 57 insertions(+), 1 deletion(-)

diff --git a/daemon/libvirtd.c b/daemon/libvirtd.c
index e2e4fbd..922c5b5 100644
--- a/daemon/libvirtd.c
+++ b/daemon/libvirtd.c
@@ -1325,7 +1325,7 @@ int main(int argc, char **argv) {
                 0, "shutdown", NULL, NULL);
 
 cleanup:
-    virNetlinkEventServiceStop(NETLINK_ROUTE);
+    virNetlinkEventServiceStopAll();
     virObjectUnref(remoteProgram);
     virObjectUnref(qemuProgram);
     virNetServerClose(srv);
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index a55fb73..af1a22a 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -1470,6 +1470,7 @@ virNetlinkEventRemoveClient;
 virNetlinkEventServiceIsRunning;
 virNetlinkEventServiceLocalPid;
 virNetlinkEventServiceStop;
+virNetlinkEventServiceStopAll;
 virNetlinkEventServiceStart;
 virNetlinkShutdown;
 virNetlinkStartup;
diff --git a/src/util/virnetlink.c b/src/util/virnetlink.c
index 8a227df..fff98f1 100644
--- a/src/util/virnetlink.c
+++ b/src/util/virnetlink.c
@@ -407,6 +407,46 @@ virNetlinkEventServiceStop(unsigned int protocol)
 }
 
 /**
+ * virNetlinkEventServiceStopAll:
+ *
+ * Stop all the monitors to receive netlink messages for libvirtd.
+ *
+ * Returns -1 if any monitor cannot be unregistered, 0 upon success
+ */
+int
+virNetlinkEventServiceStopAll(void)
+{
+    unsigned int i, j;
+
+    VIR_INFO("stopping all netlink event services");
+
+    virNetlinkEventSrvPrivatePtr srv = NULL;
+    for (i = 0; i < MAX_LINKS; i++) {
+        srv = server[i];
+        if (!srv)
+            continue;
+
+        virNetlinkEventServerLock(srv);
+        nl_close(srv->netlinknh);
+        virNetlinkFree(srv->netlinknh);
+        virEventRemoveHandle(srv->eventwatch);
+
+        for (j = 0; j < srv->handlesCount; j++) {
+            if (srv->handles[j].deleted == VIR_NETLINK_HANDLE_VALID)
+                virNetlinkEventRemoveClientPrimitive(j, i);
+        }
+
+        server[i] = NULL;
+        virNetlinkEventServerUnlock(srv);
+
+        virMutexDestroy(&srv->lock);
+        VIR_FREE(srv);
+    }
+
+    return 0;
+}
+
+/**
  * virNetlinkEventServiceIsRunning:
  *
  * Returns if the netlink event service is running.
@@ -741,6 +781,16 @@ int virNetlinkEventServiceStop(unsigned int protocol ATTRIBUTE_UNUSED)
 }
 
 /**
+ * stopNetlinkEventServerAll: stop all the monitors to receive netlink
+ * messages for libvirtd
+ */
+int virNetlinkEventServiceStopAll(void)
+{
+    VIR_DEBUG("%s", _(unsupported));
+    return 0;
+}
+
+/**
  * startNetlinkEventServer: start a monitor to receive netlink
  * messages for libvirtd
  */
diff --git a/src/util/virnetlink.h b/src/util/virnetlink.h
index 2e18af4..1982dae 100644
--- a/src/util/virnetlink.h
+++ b/src/util/virnetlink.h
@@ -54,6 +54,11 @@ typedef void (*virNetlinkEventRemoveCallback)(int watch, const virMacAddrPtr mac
 int virNetlinkEventServiceStop(unsigned int protocol);
 
 /**
+ * stopNetlinkEventServerAll: stop all the monitors to receive netlink messages for libvirtd
+ */
+int virNetlinkEventServiceStopAll(void);
+
+/**
  * startNetlinkEventServer: start a monitor to receive netlink messages for libvirtd
  */
 int virNetlinkEventServiceStart(unsigned int protocol, unsigned int groups);
-- 
1.7.10.1




More information about the libvir-list mailing list