home: hub: mkinitfs

Download patch

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)) {