From 8b72687876747186d5f1a5a45464bf64b1a166f5 Mon Sep 17 00:00:00 2001 From: "kay.sievers@vrfy.org" Date: Wed, 5 Jan 2005 05:33:26 +0100 Subject: [PATCH] [PATCH] limit the initial timeout of the udevd event handling Define an inititialization phase, where we delay the events only for a short time to eventually recollect the event sequence instead of delaying the very first events for 10 seconds, which breaks the firmware loader. --- udevd.c | 21 ++++++++++++++++++--- udevd.h | 4 +++- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/udevd.c b/udevd.c index 3c29c2be..c6642f43 100644 --- a/udevd.c +++ b/udevd.c @@ -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 @@ static void msg_queue_manager(void) 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 @@ recheck: 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 @@ recheck: /* 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 @@ static void user_sighandler(void) int main(int argc, char *argv[], char *envp[]) { + struct sysinfo info; int maxsockplus; struct sockaddr_un saddr; socklen_t addrlen; @@ -532,6 +543,10 @@ int main(int argc, char *argv[], char *envp[]) else udev_bin = UDEV_BIN; + /* handle special startup timeout*/ + sysinfo(&info); + startup_time = info.uptime; + FD_ZERO(&readfds); FD_SET(udevsendsock, &readfds); FD_SET(pipefds[0], &readfds); diff --git a/udevd.h b/udevd.h index 1c4b1b88..28f62cf5 100644 --- a/udevd.h +++ b/udevd.h @@ -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 -- 2.39.5