This patchs allow to set the buffer size for netlink socket in the libvirtd configuration file. The default buffer size remain as before at 128k. Signed-off-by: Zhipeng Lu <lu.zhipeng@xxxxxxxxxx> --- daemon/libvirtd-config.c | 6 ++++++ daemon/libvirtd-config.h | 2 ++ daemon/libvirtd.aug | 1 + daemon/libvirtd.c | 12 ++++++++++++ daemon/libvirtd.conf | 3 +++ daemon/test_libvirtd.aug.in | 1 + src/libvirt_private.syms | 1 + src/util/virnetlink.c | 19 ++++++++++++++++++- src/util/virnetlink.h | 7 ++++++- 9 files changed, 50 insertions(+), 2 deletions(-) diff --git a/daemon/libvirtd-config.c b/daemon/libvirtd-config.c index 6c0f00e..b2bda28 100644 --- a/daemon/libvirtd-config.c +++ b/daemon/libvirtd-config.c @@ -33,6 +33,7 @@ #include "remote/remote_protocol.h" #include "remote/remote_driver.h" #include "util/virnetdevopenvswitch.h" +#include "util/virnetlink.h" #include "virstring.h" #include "virutil.h" @@ -172,6 +173,8 @@ daemonConfigNew(bool privileged ATTRIBUTE_UNUSED) data->admin_keepalive_count = 5; data->ovs_timeout = VIR_NETDEV_OVS_DEFAULT_TIMEOUT; + + data->netlink_sock_buffer_size = VIRT_NETLINK_SOCK_BUFFER_SIZE; localhost = virGetHostname(); if (localhost == NULL) { @@ -394,6 +397,9 @@ daemonConfigLoadOptions(struct daemonConfig *data, if (virConfGetValueUInt(conf, "ovs_timeout", &data->ovs_timeout) < 0) goto error; + if (virConfGetValueUInt(conf, "netlink_sock_buffer_size", &data->netlink_sock_buffer_size) < 0) + goto error; + return 0; error: diff --git a/daemon/libvirtd-config.h b/daemon/libvirtd-config.h index 1edf5fa..22befd1 100644 --- a/daemon/libvirtd-config.h +++ b/daemon/libvirtd-config.h @@ -94,6 +94,8 @@ struct daemonConfig { unsigned int admin_keepalive_count; unsigned int ovs_timeout; + + unsigned int netlink_sock_buffer_size; }; diff --git a/daemon/libvirtd.aug b/daemon/libvirtd.aug index 24fdf44..84ea00a 100644 --- a/daemon/libvirtd.aug +++ b/daemon/libvirtd.aug @@ -89,6 +89,7 @@ module Libvirtd = let misc_entry = str_entry "host_uuid" | str_entry "host_uuid_source" | int_entry "ovs_timeout" + | int_entry "netlink_sock_buffer_size" (* Each enty in the config is one of the following three ... *) let entry = network_entry diff --git a/daemon/libvirtd.c b/daemon/libvirtd.c index a558458..34db23a 100644 --- a/daemon/libvirtd.c +++ b/daemon/libvirtd.c @@ -648,6 +648,16 @@ daemonSetupNetDevOpenvswitch(struct daemonConfig *config) /* + * Set up the netlink socket buffer size + */ +static void +daemonSetupNetLink(struct daemonConfig *config) +{ + virNetLinkSetBufferSize(config->netlink_sock_buffer_size); +} + + +/* * Set up the logging environment * By default if daemonized all errors go to the logfile libvirtd.log, * but if verbose or error debugging is asked for then also output @@ -1257,6 +1267,8 @@ int main(int argc, char **argv) { exit(EXIT_FAILURE); } + daemonSetupNetLink(config); + daemonSetupNetDevOpenvswitch(config); if (daemonSetupAccessManager(config) < 0) { diff --git a/daemon/libvirtd.conf b/daemon/libvirtd.conf index e83e9a1..b174767 100644 --- a/daemon/libvirtd.conf +++ b/daemon/libvirtd.conf @@ -476,3 +476,6 @@ # potential infinite waits blocking libvirt. # #ovs_timeout = 5 + +# This allow to specify buffer size for netlink socket. +#netlink_sock_buffer_size = 131072 diff --git a/daemon/test_libvirtd.aug.in b/daemon/test_libvirtd.aug.in index 1200952..0a1207f 100644 --- a/daemon/test_libvirtd.aug.in +++ b/daemon/test_libvirtd.aug.in @@ -64,3 +64,4 @@ module Test_libvirtd = { "admin_keepalive_interval" = "5" } { "admin_keepalive_count" = "5" } { "ovs_timeout" = "5" } + { "netlink_sock_buffer_size" = "131072" } diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 888412a..83be39d 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -2248,6 +2248,7 @@ virNetlinkEventServiceStart; virNetlinkEventServiceStop; virNetlinkEventServiceStopAll; virNetlinkGetErrorCode; +virNetLinkSetBufferSize; virNetlinkShutdown; virNetlinkStartup; diff --git a/src/util/virnetlink.c b/src/util/virnetlink.c index d732fe8..0a549b7 100644 --- a/src/util/virnetlink.c +++ b/src/util/virnetlink.c @@ -49,6 +49,7 @@ VIR_LOG_INIT("util.netlink"); #define NETLINK_ACK_TIMEOUT_S (2*1000) + #if defined(__linux__) && defined(HAVE_LIBNL) /* State for a single netlink event handle */ struct virNetlinkEventHandle { @@ -104,6 +105,22 @@ static int nextWatch = 1; static virNetlinkEventSrvPrivatePtr server[MAX_LINKS] = {NULL}; static virNetlinkHandle *placeholder_nlhandle; +/* + * Set netlink default buffer size + */ +static unsigned int virNetLinkBufferSize = VIRT_NETLINK_SOCK_BUFFER_SIZE; + +/** + * virNetLinkSetBufferSize: + * @size: the buffer size + * + * Set netlink socket buffer size + */ +void +virNetLinkSetBufferSize(unsigned int size) +{ + virNetLinkBufferSize = size; +} /* Function definitions */ /** @@ -189,7 +206,7 @@ virNetlinkCreateSocket(int protocol) goto error; } - if (virNetlinkSetBufferSize(nlhandle, 131702, 0) < 0) { + if (virNetlinkSetBufferSize(nlhandle, virNetLinkBufferSize, 0) < 0) { virReportSystemError(errno, "%s", _("cannot set netlink socket buffer " "size to 128k")); diff --git a/src/util/virnetlink.h b/src/util/virnetlink.h index 088b013..2d6e762 100644 --- a/src/util/virnetlink.h +++ b/src/util/virnetlink.h @@ -22,7 +22,6 @@ # include "internal.h" # include "virmacaddr.h" - # if defined(__linux__) && defined(HAVE_LIBNL) /* Work around a bug where older libnl-1 headers expected older gcc @@ -44,6 +43,8 @@ struct nlmsghdr; # endif /* __linux__ */ +#define VIRT_NETLINK_SOCK_BUFFER_SIZE (131072) + int virNetlinkStartup(void); void virNetlinkShutdown(void); @@ -120,5 +121,9 @@ int virNetlinkEventAddClient(virNetlinkEventHandleCallback handleCB, */ int virNetlinkEventRemoveClient(int watch, const virMacAddr *macaddr, unsigned int protocol); +/** + *virNetLinkSetBufferSize: set netlink socket buffer size + */ +void virNetLinkSetBufferSize(unsigned int size); #endif /* __VIR_NETLINK_H__ */ -- 1.8.3.1 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list