* udevd - shorten initial timout after startup
@ 2004-12-26 3:01 Kay Sievers
0 siblings, 0 replies; only message in thread
From: Kay Sievers @ 2004-12-26 3:01 UTC (permalink / raw)
To: linux-hotplug
[-- Attachment #1: Type: text/plain, Size: 450 bytes --]
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
[-- Attachment #2: udevd-init-phase-01.patch --]
[-- Type: text/x-patch, Size: 2602 bytes --]
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
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2004-12-26 3:01 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2004-12-26 3:01 udevd - shorten initial timout after startup Kay Sievers
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).