This patch introduce virNetlinkEventServiceStopAll() to stop all the monitors to receive netlink messages for libvirtd. Signed-off-by: Tang Chen <tangchen@xxxxxxxxxxxxxx> --- 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 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list