aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Klötzke <jan@kloetzke.net>2019-12-16 22:56:50 +0100
committerDenys Vlasenko <vda.linux@googlemail.com>2020-11-22 13:32:06 +0100
commit3cd55d49a2ee5d74f019b1a4c32ab28a9ce5e1d3 (patch)
treee92374eb03e98c8c0ed814eebeb93fd913a59039
parent12aa68d10fdcc5bd2d9385506d11aed3a0c2eaf1 (diff)
downloadbusybox-w32-3cd55d49a2ee5d74f019b1a4c32ab28a9ce5e1d3.tar.gz
busybox-w32-3cd55d49a2ee5d74f019b1a4c32ab28a9ce5e1d3.tar.bz2
busybox-w32-3cd55d49a2ee5d74f019b1a4c32ab28a9ce5e1d3.zip
mdev: increase netlink buffer sizes
The socket receive buffer turned out to be too small for real world systems. Use the same size as udevd to be on the safe side. As this is just a limit and the memory is not allocated by the kernel until really needed there is actually no memory wasted. Signed-off-by: Jan Klötzke <jan@kloetzke.net> Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r--util-linux/mdev.c26
1 files changed, 17 insertions, 9 deletions
diff --git a/util-linux/mdev.c b/util-linux/mdev.c
index 59dbcf0cd..8b06d3456 100644
--- a/util-linux/mdev.c
+++ b/util-linux/mdev.c
@@ -269,10 +269,6 @@
269# define dbg3s(msg) ((void)0) 269# define dbg3s(msg) ((void)0)
270#endif 270#endif
271 271
272
273#ifndef SO_RCVBUFFORCE
274#define SO_RCVBUFFORCE 33
275#endif
276static const char keywords[] ALIGN1 = "add\0remove\0"; // "change\0" 272static const char keywords[] ALIGN1 = "add\0remove\0"; // "change\0"
277enum { OP_add, OP_remove }; 273enum { OP_add, OP_remove };
278 274
@@ -1152,15 +1148,27 @@ static void initial_scan(char *temp)
1152 1148
1153#if ENABLE_FEATURE_MDEV_DAEMON 1149#if ENABLE_FEATURE_MDEV_DAEMON
1154 1150
1155/* uevent applet uses 16k buffer, and mmaps it before every read */ 1151/*
1156# define BUFFER_SIZE (2 * 1024) 1152 * The kernel (as of v5.4) will pass up to 32 environment variables with a
1157# define RCVBUF (2 * 1024 * 1024) 1153 * total of 2kiB on each event. On top of that the action string and device
1154 * path are added. Using a 3kiB buffer for the event should suffice in any
1155 * case.
1156 *
1157 * As far as the socket receive buffer size is concerned 2MiB proved to be too
1158 * small (see [1]). Udevd seems to use a whooping 128MiB. The socket receive
1159 * buffer size is just a resource limit. The buffers are allocated lazily so
1160 * the memory is not wasted.
1161 *
1162 * [1] http://lists.busybox.net/pipermail/busybox/2019-December/087665.html
1163 */
1164# define USER_RCVBUF (3 * 1024)
1165# define KERN_RCVBUF (128 * 1024 * 1024)
1158# define MAX_ENV 32 1166# define MAX_ENV 32
1159 1167
1160static void daemon_loop(char *temp, int fd) 1168static void daemon_loop(char *temp, int fd)
1161{ 1169{
1162 for (;;) { 1170 for (;;) {
1163 char netbuf[BUFFER_SIZE]; 1171 char netbuf[USER_RCVBUF];
1164 char *env[MAX_ENV]; 1172 char *env[MAX_ENV];
1165 char *s, *end; 1173 char *s, *end;
1166 ssize_t len; 1174 ssize_t len;
@@ -1237,7 +1245,7 @@ int mdev_main(int argc UNUSED_PARAM, char **argv)
1237 * mdev -d 1245 * mdev -d
1238 * find /sys -name uevent -exec sh -c 'echo add >"{}"' ';' 1246 * find /sys -name uevent -exec sh -c 'echo add >"{}"' ';'
1239 */ 1247 */
1240 fd = create_and_bind_to_netlink(NETLINK_KOBJECT_UEVENT, 1 << 0, RCVBUF); 1248 fd = create_and_bind_to_netlink(NETLINK_KOBJECT_UEVENT, 1 << 0, KERN_RCVBUF);
1241 1249
1242 /* 1250 /*
1243 * Make inital scan after the uevent socket is alive and 1251 * Make inital scan after the uevent socket is alive and