ref: 9ddca061143ab335fe5e1878d53d4edf2868f2ec
parent: 6a09876be6297e601920382ca93555917e31f1f1
author: Cory Snyder <csnyder@1111systems.com>
date: Wed Mar 15 02:44:40 CDT 2023
add kernel param for uevent buffer size
--- a/initramfs-init.in
+++ b/initramfs-init.in
@@ -347,7 +347,7 @@
cryptdiscards cryptkey debug_init dma init init_args keep_apk_new modules ovl_dev
pkgs quiet root_size root usbdelay ip alpine_repo apkovl alpine_start splash
blacklist overlaytmpfs overlaytmpfsflags rootfstype rootflags nbd resume s390x_net
- dasd ssh_key BOOTIF zfcp"
+ dasd ssh_key BOOTIF zfcp uevent_buf_size"
for opt; do
case "$opt" in
@@ -507,6 +507,7 @@
# run nlplug-findfs before SINGLEMODE so we load keyboard drivers
ebegin "Mounting root"
nlplug-findfs $cryptopts -p /sbin/mdev ${KOPT_debug_init:+-d} \
+ ${KOPT_uevent_buf_size:+-U $KOPT_uevent_buf_size} \
$KOPT_root
if [ "$SINGLEMODE" = "yes" ]; then
@@ -580,6 +581,7 @@
ebegin "Mounting boot media"
nlplug-findfs $cryptopts -p /sbin/mdev ${KOPT_debug_init:+-d} \
${KOPT_usbdelay:+-t $(( $KOPT_usbdelay * 1000 ))} \
+ ${KOPT_uevent_buf_size:+-U $KOPT_uevent_buf_size} \
$repoopts -a /tmp/apkovls
eend $?
--- a/nlplug-findfs.1.in
+++ b/nlplug-findfs.1.in
@@ -55,6 +55,8 @@
.TP
\fB\-t \fITIMEOUT\fR
Timeout after \fITIMEOUT\fR milliseconds without uevents.
+\fB\-U \fISIZE\fR
+uevent buffer size in bytes.
.SH AUTHOR
.PP
Written by Natanael Copa <ncopa@alpinelinux.org>, Timo Teräs <timo.teras@iki.fi> and others.
--- a/nlplug-findfs/nlplug-findfs.c
+++ b/nlplug-findfs/nlplug-findfs.c
@@ -402,10 +402,10 @@
signal(SIGPIPE, SIG_IGN);
}
-static int init_netlink_socket(void)
+static int init_netlink_socket(unsigned int slen)
{
struct sockaddr_nl nls;
- int fd, slen;
+ int fd;
memset(&nls, 0, sizeof(nls));
nls.nl_family = AF_NETLINK;
@@ -417,9 +417,6 @@
if (fd < 0)
err(1, "socket");
- /* kernel will not create events bigger than 16kb, but we need
- buffer up all events during coldplug */
- slen = 1024*1024;
if (setsockopt(fd, SOL_SOCKET, SO_RCVBUFFORCE, &slen,
sizeof(slen)) < 0) {
err(1, "setsockopt");
@@ -1209,6 +1206,7 @@
" -f, --filter SUBSYSTEM filter subsystem\n"
" -p, --event-handler PROGRAM use PROGRAM as handler for every event with DEVNAME\n"
" -t, --timeout TIMEOUT timeout after TIMEOUT milliseconds without uevents\n"
+ " -U, --uevent-buffer-size SIZE uevent buffer size in bytes\n"
"\n", argv0);
exit(rc);
@@ -1233,6 +1231,10 @@
char *program_argv[2] = {0,0};
sigset_t sigchldmask;
+ /* kernel will not create events bigger than 16kb, but we need
+ buffer up all events during coldplug */
+ unsigned int netlink_buf_len = 1024*1024;
+
for (r = 0; environ[r]; r++) {
if (envcmp(environ[r], "PATH"))
default_envp[0] = environ[r];
@@ -1274,9 +1276,10 @@
{ "filter", required_argument, NULL, 'f'},
{ "event-handler", required_argument, NULL, 'p'},
{ "timeout", required_argument, NULL, 't'},
+ { "uevent-buffer-size", required_argument, NULL, 'U'},
};
- int c = getopt_long(argc, argv, "a:b:c:hH:k:m:no:Ddf:p:t:", options, NULL);
+ int c = getopt_long(argc, argv, "a:b:c:hH:k:m:no:Ddf:p:t:U:", options, NULL);
if (c == -1)
break;
@@ -1330,6 +1333,11 @@
case 't':
conf.uevent_timeout = atoi(optarg);
break;
+ case 'U':
+ if(sscanf(optarg, "%u", &netlink_buf_len) != 1) {
+ err(1, "%s", optarg);
+ }
+ break;
default:
usage(1);
}
@@ -1343,7 +1351,7 @@
sigaddset(&sigchldmask, SIGCHLD);
sigprocmask(SIG_BLOCK, &sigchldmask, NULL);
- fds[0].fd = init_netlink_socket();
+ fds[0].fd = init_netlink_socket(netlink_buf_len);
fds[0].events = POLLIN;
fds[1].fd = signalfd(-1, &sigchldmask, SFD_NONBLOCK|SFD_CLOEXEC);
@@ -1394,6 +1402,8 @@
if (len < 0) {
if (errno == EINTR)
continue;
+ if (errno == ENOBUFS)
+ warnx("uevent buffer overflow: current size is %u, increase the buffer size with the uevent_buf_size kernel param", netlink_buf_len);
err(1, "recvmsg");
}
if (len < 32 || len >= sizeof(buf)) {