On 07/16/2017 05:04 PM, Laine Stump wrote: > On 07/11/2017 09:01 PM, ZhiPeng Lu wrote: >> 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. > > See my more detailed response to your earlier patch here: > > > https://www.redhat.com/archives/libvir-list/2017-July/msg00566.html > > There should be no need to configure the initial libnl buffer size, > because we enable MSG_PEEK on the libnl sockets (and recent versions of > libnl have it turned on by default anyway). If that's not permitting the > buffer to auto-grow as necessary, then there is a different bug somewhere. > If an old version of libnl is the problem, then perhaps a patch which just adds a comment in virNetlinkCreateSocket to "summarize" what gets discovered w/r/t MSG_PEEK and the "correct" minimum version of libnl so that the "next" person to come this way will have a chance at understanding what needs to be done without going through the submit a patch changing the size again! All that said, having it be configurable could be useful for someone who has a system that doesn't have that version, while still working as expected for the right version. John >> >> 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__ */ > > > -- > libvir-list mailing list > libvir-list@xxxxxxxxxx > https://www.redhat.com/mailman/listinfo/libvir-list > -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list