From mboxrd@z Thu Jan 1 00:00:00 1970 From: Kay Sievers Date: Sun, 26 Dec 2004 03:01:36 +0000 Subject: udevd - shorten initial timout after startup Message-Id: <1104030096.5805.22.camel@localhost.localdomain> MIME-Version: 1 Content-Type: multipart/mixed; boundary="=-If+ltnIwCS5+vy3RQrDf" List-Id: To: linux-hotplug@vger.kernel.org --=-If+ltnIwCS5+vy3RQrDf Content-Type: text/plain Content-Transfer-Encoding: 7bit If udevd manages the hotplug events we need to limit the initial timeout. With this change we wait only 2 seconds for more events to arrive after startup and then start the event execution. After the initialization phase we switch the timeout to wait for missing events back to the usual 10 seconds. This should fix the issue where the firmware_class loader reaches its timout, cause udevd delayed the very first events for 10 seconds. Thanks, Kay --=-If+ltnIwCS5+vy3RQrDf Content-Disposition: inline; filename=udevd-init-phase-01.patch Content-Type: text/x-patch; name=udevd-init-phase-01.patch; charset=UTF-8 Content-Transfer-Encoding: 7bit diff -Nru a/udevd.c b/udevd.c --- a/udevd.c 2004-12-26 03:53:21 +01:00 +++ b/udevd.c 2004-12-26 03:53:21 +01:00 @@ -47,6 +47,7 @@ static int udevsendsock; static int pipefds[2]; +static long startup_time; static unsigned long long expected_seqnum = 0; static volatile int sigchilds_waiting; static volatile int run_msg_q; @@ -220,6 +221,8 @@ struct hotplug_msg *tmp_msg; struct sysinfo info; long msg_age = 0; + static int timeout = EVENT_INIT_TIMEOUT_SEC; + static int init = 1; dbg("msg queue manager, next expected is %llu", expected_seqnum); recheck: @@ -230,11 +233,18 @@ continue; } + /* see if we are in the initialization phase and wait for the very first events */ + if (init && (info.uptime - startup_time >= INIT_TIME_SEC)) { + init = 0; + timeout = EVENT_TIMEOUT_SEC; + dbg("initialization phase passed, set timeout to %i seconds", EVENT_TIMEOUT_SEC); + } + /* move event with expired timeout to the exec list */ sysinfo(&info); msg_age = info.uptime - loop_msg->queue_time; dbg("seq %llu is %li seconds old", loop_msg->seqnum, msg_age); - if (msg_age > EVENT_TIMEOUT_SEC-1) { + if (msg_age >= timeout) { msg_move_exec(loop_msg); goto recheck; } else { @@ -246,8 +256,8 @@ /* set timeout for remaining queued events */ if (list_empty(&msg_list) == 0) { - struct itimerval itv = {{0, 0}, {EVENT_TIMEOUT_SEC - msg_age, 0}}; - dbg("next event expires in %li seconds", EVENT_TIMEOUT_SEC - msg_age); + struct itimerval itv = {{0, 0}, {timeout - msg_age, 0}}; + dbg("next event expires in %li seconds", timeout - msg_age); setitimer(ITIMER_REAL, &itv, NULL); } } @@ -429,6 +439,7 @@ int main(int argc, char *argv[], char *envp[]) { + struct sysinfo info; int maxsockplus; struct sockaddr_un saddr; socklen_t addrlen; @@ -531,6 +542,10 @@ dbg("udev binary is set to '%s'", udev_bin); else udev_bin = UDEV_BIN; + + /* handle special startup timeout*/ + sysinfo(&info); + startup_time = info.uptime; FD_ZERO(&readfds); FD_SET(udevsendsock, &readfds); diff -Nru a/udevd.h b/udevd.h --- a/udevd.h 2004-12-26 03:53:21 +01:00 +++ b/udevd.h 2004-12-26 03:53:21 +01:00 @@ -25,10 +25,12 @@ #include "list.h" #define UDEV_MAGIC "udevd_" UDEV_VERSION -#define EVENT_TIMEOUT_SEC 10 #define UDEVD_SOCK_PATH "udevd" #define SEND_WAIT_MAX_SECONDS 3 #define SEND_WAIT_LOOP_PER_SECOND 10 +#define INIT_TIME_SEC 5 +#define EVENT_INIT_TIMEOUT_SEC 2 +#define EVENT_TIMEOUT_SEC 10 /* environment buffer, should match the kernel's size in lib/kobject_uevent.h */ #define HOTPLUG_BUFFER_SIZE 1024 --=-If+ltnIwCS5+vy3RQrDf-- ------------------------------------------------------- SF email is sponsored by - The IT Product Guide Read honest & candid reviews on hundreds of IT Products from real users. Discover which products truly live up to the hype. Start reading now. http://productguide.itmanagersjournal.com/ _______________________________________________ Linux-hotplug-devel mailing list http://linux-hotplug.sourceforge.net Linux-hotplug-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linux-hotplug-devel