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 <j...@kloetzke.net> --- util-linux/mdev.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/util-linux/mdev.c b/util-linux/mdev.c index cfc1a38bc..91c4ff466 100644 --- a/util-linux/mdev.c +++ b/util-linux/mdev.c @@ -1206,6 +1206,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; -- 2.20.1 _______________________________________________ busybox mailing list busybox@busybox.net http://lists.busybox.net/mailman/listinfo/busybox