summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkay.sievers@vrfy.org <kay.sievers@vrfy.org>2005-01-05 05:33:26 +0100
committerGreg KH <gregkh@suse.de>2005-04-26 23:19:09 -0700
commit8b72687876747186d5f1a5a45464bf64b1a166f5 (patch)
tree62d59b83b3ddc13d8a2cbd55c73248e9043512fe
parentd3c3763530955a898e1d50c6844765e94ac957c2 (diff)
[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.
-rw-r--r--udevd.c21
-rw-r--r--udevd.h4
2 files changed, 21 insertions, 4 deletions
diff --git a/udevd.c b/udevd.c
index 3c29c2be6e..c6642f4359 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 1c4b1b88c2..28f62cf528 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