[libvirt] [PATCH v2] network: allow to specify buffer size for netlink socket

John Ferlan jferlan at redhat.com
Mon Jul 17 12:00:25 UTC 2017



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 at zte.com.cn>
>> ---
>>  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 at redhat.com
> https://www.redhat.com/mailman/listinfo/libvir-list
> 




More information about the libvir-list mailing list