chiark / gitweb /
force event socket buffer size to 16MB
authorKay Sievers <kay.sievers@suse.de>
Tue, 11 Oct 2005 19:06:50 +0000 (21:06 +0200)
committerKay Sievers <kay.sievers@suse.de>
Tue, 11 Oct 2005 19:06:50 +0000 (21:06 +0200)
Netlink events get lost when the kernel creates thousends of events
faster than udevd reads it. The default is 128 KB, which can carry
app. 500 events. Set it to 16 MB now.

  I have 4000 fibrechannel LUNs connected to my system.  There are two
  paths to the devices and two ports on the host connected via a switch.
  This gives 16000 when probed.
  I have had problems getting all of the entries in /dev created.
  -- Mark Haverkamp <markh@osdl.org>

Signed-off-by: Kay Sievers <kay.sievers@suse.de>
udev_libc_wrapper.h
udevd.c

index 9dd22175cd5a15964843ad054b4ea89bfb2be526..6f8c8f24c7eb4693792f941c97bcbe1338d7cdf7 100644 (file)
 #define NETLINK_KOBJECT_UEVENT 15
 #endif
 
+#ifndef SO_RCVBUFFORCE
+#define SO_RCVBUFFORCE 33
+#endif
+
 #ifdef __KLIBC__
 static inline int clearenv(void)
 {
diff --git a/udevd.c b/udevd.c
index 5974d14e8ec6a84432209f5bcb7634674c1422eb..aaf80a2314e007cff05e6c9033dce68766f850ad 100644 (file)
--- a/udevd.c
+++ b/udevd.c
@@ -686,7 +686,7 @@ static void reap_sigchilds(void)
 static int init_udevd_socket(void)
 {
        struct sockaddr_un saddr;
-       const int buffersize = 1024 * 1024;
+       const int buffersize = 16 * 1024 * 1024;
        socklen_t addrlen;
        const int feature_on = 1;
        int retval;
@@ -704,7 +704,7 @@ static int init_udevd_socket(void)
        }
 
        /* set receive buffersize */
-       setsockopt(udevd_sock, SOL_SOCKET, SO_RCVBUF, &buffersize, sizeof(buffersize));
+       setsockopt(udevd_sock, SOL_SOCKET, SO_RCVBUFFORCE, &buffersize, sizeof(buffersize));
 
        /* the bind takes care of ensuring only one copy running */
        retval = bind(udevd_sock, (struct sockaddr *) &saddr, addrlen);
@@ -723,7 +723,7 @@ static int init_udevd_socket(void)
 static int init_uevent_netlink_sock(void)
 {
        struct sockaddr_nl snl;
-       const int buffersize = 1024 * 1024;
+       const int buffersize = 16 * 1024 * 1024;
        int retval;
 
        memset(&snl, 0x00, sizeof(struct sockaddr_nl));
@@ -738,7 +738,7 @@ static int init_uevent_netlink_sock(void)
        }
 
        /* set receive buffersize */
-       setsockopt(uevent_netlink_sock, SOL_SOCKET, SO_RCVBUF, &buffersize, sizeof(buffersize));
+       setsockopt(uevent_netlink_sock, SOL_SOCKET, SO_RCVBUFFORCE, &buffersize, sizeof(buffersize));
 
        retval = bind(uevent_netlink_sock, (struct sockaddr *) &snl,
                      sizeof(struct sockaddr_nl));