[systemd-commits] src/libsystemd src/network src/systemd

Tom Gundersen tomegun at kemper.freedesktop.org
Thu Nov 27 10:00:03 PST 2014


 src/libsystemd/sd-rtnl/sd-rtnl.c |    4 ++++
 src/network/networkd-manager.c   |    7 +++++++
 src/systemd/sd-rtnl.h            |    1 +
 3 files changed, 12 insertions(+)

New commits:
commit be660c371b231c253a97464ddd8f32ec8721da21
Author: Alin Rauta <alin.rauta at intel.com>
Date:   Thu Nov 27 18:50:48 2014 +0100

    networkd: fix kernel rtnl receive buffer overrun error
    
    We got the following error when running systemd on a device  with many ports:
    
    "rtnl: kernel receive buffer overrun
    Event source 'rtnl-receive-message' returned error, disabling: No buffer space
    available"
    
    I think the kernel socket receive buffer queue should be increased. The default
    value is taken from:
    "/proc/sys/net/core/rmem_default", but we can overwrite it using SO_RCVBUF
    socket option.
    
    This is already done in networkd for other sockets.
    For example, the bus socket (sd-bus/bus-socket.c) has a receive queue of 8MB.
    In our case, the default is 208KB.
    
    Increasing the buffer receive queue for manager socket to 512KB should be enough
    to get rid of the above error.
    
    [tomegun: bump the limit even higher to 8M]

diff --git a/src/libsystemd/sd-rtnl/sd-rtnl.c b/src/libsystemd/sd-rtnl/sd-rtnl.c
index 1af38f3..abb011e 100644
--- a/src/libsystemd/sd-rtnl/sd-rtnl.c
+++ b/src/libsystemd/sd-rtnl/sd-rtnl.c
@@ -140,6 +140,10 @@ int sd_rtnl_open(sd_rtnl **ret, unsigned n_groups, ...) {
         return 0;
 }
 
+int sd_rtnl_inc_rcvbuf(const sd_rtnl *const rtnl, const int size) {
+        return fd_inc_rcvbuf(rtnl->fd, size);
+}
+
 sd_rtnl *sd_rtnl_ref(sd_rtnl *rtnl) {
         assert_return(rtnl, NULL);
         assert_return(!rtnl_pid_changed(rtnl), NULL);
diff --git a/src/network/networkd-manager.c b/src/network/networkd-manager.c
index 2c8a330..6046dc7 100644
--- a/src/network/networkd-manager.c
+++ b/src/network/networkd-manager.c
@@ -36,6 +36,9 @@
 
 #include "sd-rtnl.h"
 
+/* use 8 MB for receive socket kernel queue. */
+#define RCVBUF_SIZE    (8*1024*1024)
+
 const char* const network_dirs[] = {
         "/etc/systemd/network",
         "/run/systemd/network",
@@ -98,6 +101,10 @@ int manager_new(Manager **ret) {
         if (r < 0)
                 return r;
 
+        r = sd_rtnl_inc_rcvbuf(m->rtnl, RCVBUF_SIZE);
+        if (r < 0)
+                return r;
+
         r = sd_bus_default_system(&m->bus);
         if (r < 0 && r != -ENOENT) /* TODO: drop when we can rely on kdbus */
                 return r;
diff --git a/src/systemd/sd-rtnl.h b/src/systemd/sd-rtnl.h
index 0980de8..95bdb1d 100644
--- a/src/systemd/sd-rtnl.h
+++ b/src/systemd/sd-rtnl.h
@@ -41,6 +41,7 @@ typedef int (*sd_rtnl_message_handler_t)(sd_rtnl *rtnl, sd_rtnl_message *m, void
 
 /* bus */
 int sd_rtnl_open(sd_rtnl **nl, unsigned n_groups, ...);
+int sd_rtnl_inc_rcvbuf(const sd_rtnl *const rtnl, const int size);
 
 sd_rtnl *sd_rtnl_ref(sd_rtnl *nl);
 sd_rtnl *sd_rtnl_unref(sd_rtnl *nl);



More information about the systemd-commits mailing list