[git commit] mdev: re-initialize if uevent messages were lost

Denys Vlasenko vda.linux at googlemail.com
Sun Nov 22 13:33:58 UTC 2020


commit: https://git.busybox.net/busybox/commit/?id=d560030548cb237f9ef09a82fd6f372836655306
branch: https://git.busybox.net/busybox/commit/?id=refs/heads/master

If the netlink read() failed with ENOBUFS we know that we have missed at
least one message due to a socket receive buffer overrun. The only way
how to recover is to drop the old socket, open a fresh one and make a
cold-plug scan of the current system state.

Signed-off-by: Jan Klötzke <jan at kloetzke.net>
Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
 util-linux/mdev.c | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/util-linux/mdev.c b/util-linux/mdev.c
index 4c00a2d7e..d4f06c128 100644
--- a/util-linux/mdev.c
+++ b/util-linux/mdev.c
@@ -1199,6 +1199,16 @@ static void daemon_loop(char *temp, int fd)
 
 		len = safe_read(fd, netbuf, sizeof(netbuf) - 1);
 		if (len < 0) {
+			if (errno == ENOBUFS) {
+				/*
+				 * We ran out of socket receive buffer space.
+				 * Start from scratch.
+				 */
+				dbg1s("uevent overrun, rescanning");
+				close(fd);
+				fd = daemon_init(temp);
+				continue;
+			}
 			bb_simple_perror_msg_and_die("read");
 		}
 		end = netbuf + len;


More information about the busybox-cvs mailing list