[PATCH] Add mdev wait option

Mike McTernan (wavemobile) mike.mcternan at wavemobile.com
Mon Jun 1 10:55:13 UTC 2015


Hi BusyBox!

I'm using busybox 1.23.2 with mdev perfectly for hotplug and module loading.  In rc I have:

echo > /dev/mdev.seq                                                                                                                                          
echo /sbin/mdev > /proc/sys/kernel/hotplug                                                                                                                    
/sbin/mdev -s                                                                                                                                                 

To get USB and some bus device drivers to load, I have the rule in mdev.conf:

$MODALIAS=.*    0:0     0660    @modprobe "$MODALIAS"

So far this is as per the mdev.txt documentation, and works well, though a couple of devices that enumerate early get missed.  Therefore after the above, I synthesise uevents to ensure everthing gets modprobe'd too:

find /sys/devices/ -name "uevent" | while read L ; do echo add > $L ; done

This causes a number of mdev processes to be spawned from the kernel, and tick through according to mdev.seq.  All of this is wanted and works correctly.

The slight problem I have is knowing when all the 'queued' mdev processes have completed so that I can let the remainder of startup continue knowing that /dev is stable. 

To this end, attached is a small patch to optionally add a "-w" option to mdev.  This waits until there are no other processes named mdev running, and then returns.

The functionality is under ENABLE_FEATURE_MDEV_WAIT, and adds a some bytes to mdev_main when enabled:

function                                             old     new   delta
mdev_main                                           1252    1396    +144
.rodata                                            48899   48908      +9
packed_usage                                        1862    1868      +6
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 3/0 up/down: 159/0)             Total: 159 bytes
   text    data     bss     dec     hex filename
 442232    1849    8704  452785   6e8b1 busybox_old
 442385    1849    8704  452938   6e94a busybox_unstripped

Please consider the following patch for inclusion to busybox.

Kind Regards,

Mike

Signed-off-by: Michael McTernan <Michael.McTernan at wavemobile.com>
--- busybox-1.23.2_orig/util-linux/mdev.c	2015-03-23 03:07:19.000000000 +0000
+++ busybox-1.23.2/util-linux/mdev.c	2015-06-01 10:34:36.158023487 +0100
@@ -65,13 +65,25 @@
 //config:	  These devices will request userspace look up the files in
 //config:	  /lib/firmware/ and if it exists, send it to the kernel for
 //config:	  loading into the hardware.
+//config:config FEATURE_MDEV_WAIT
+//config:	bool "Support waiting for mdev to complete"
+//config:	default n
+//config:	depends on MDEV
+//config:	help
+//config:	  Allows running of mdev with the '-w' option to wait for all other
+//config:	  mdev processes to complete before returning.  This can be
+//config:	  particularly useful if using mdev with hotplug and mdev.seq to
+//config:	  ensure queued mdev processes have completed.
+
 
 //applet:IF_MDEV(APPLET(mdev, BB_DIR_SBIN, BB_SUID_DROP))
 
 //kbuild:lib-$(CONFIG_MDEV) += mdev.o
 
 //usage:#define mdev_trivial_usage
-//usage:       "[-s]"
+//usage:       "[-s"
+//usage:	IF_FEATURE_MDEV_WAIT("w")
+//usage:       "]"
 //usage:#define mdev_full_usage "\n\n"
 //usage:       "mdev -s is to be run during boot to scan /sys and populate /dev.\n"
 //usage:       "\n"
@@ -95,6 +107,12 @@
 //usage:       "To activate this feature, create empty /dev/mdev.seq at boot.\n"
 //usage:       "\n"
 //usage:       "If /dev/mdev.log file exists, debug log will be appended to it."
+//usage:	IF_FEATURE_MDEV_WAIT(
+//usage:       "\n"
+//usage:       "mdev -w waits for any running mdev processes to complete.  This\n"
+//usage:       "can be useful to wait for serialized hotplug invocations to"
+//usage:       "finish.\n"
+//usage:	)
 
 #include "libbb.h"
 #include "xregex.h"
@@ -1068,6 +1086,35 @@ int mdev_main(int argc UNUSED_PARAM, cha
 		recursive_action("/sys/class",
 			ACTION_RECURSE | ACTION_FOLLOWLINKS,
 			fileAction, dirAction, temp, 0);
+#if ENABLE_FEATURE_MDEV_WAIT
+	} else if (argv[1] && strcmp(argv[1], "-w") == 0) {
+		/*
+		 * Wait for no mdev instances running
+		 */
+		const unsigned my_pid = getpid();
+		bool           running;
+
+		do
+		{
+			procps_status_t* p = NULL;
+
+			running = false;
+
+			while ((p = procps_scan(p, PSSCAN_ARGV0)) != NULL) {
+				if (p->pid != my_pid
+				 && p->argv0
+				 && strcmp(bb_basename(p->argv0), "mdev") == 0
+				) {
+					waitpid(p->pid, NULL, 0);
+					running = true;
+				}
+			}
+
+			if (p)
+				free_procps_scan (p);
+
+		} while (running);
+#endif
 	} else {
 		char *fw;
 		char *seq;




More information about the busybox mailing list