mirror of
https://github.com/systemd/systemd-stable.git
synced 2025-01-26 10:03:40 +03:00
[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.
This commit is contained in:
parent
d3c3763530
commit
8b72687876
21
udevd.c
21
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);
|
||||
|
4
udevd.h
4
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
|
||||
|
Loading…
x
Reference in New Issue
Block a user