On large configurations some events take longer than the default 30 seconds. Killing those events will leave the machine halfway configured. So add a commandline option '--event-timeout' to handle these cases.
Signed-off-by: Hannes Reinecke <h...@suse.de> --- man/systemd-udevd.service.xml | 19 +++++++++++++++++++ src/udev/udevd.c | 14 ++++++++++++-- 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/man/systemd-udevd.service.xml b/man/systemd-udevd.service.xml index f44b7a0..8de43b1 100644 --- a/man/systemd-udevd.service.xml +++ b/man/systemd-udevd.service.xml @@ -44,6 +44,7 @@ <arg><option>--debug</option></arg> <arg><option>--children-max=</option></arg> <arg><option>--exec-delay=</option></arg> + <arg><option>--event-timeout=</option></arg> <arg><option>--resolve-names=early|late|never</option></arg> <arg><option>--version</option></arg> <arg><option>--help</option></arg> @@ -96,6 +97,15 @@ </varlistentry> <varlistentry> + <term><option>--event-timeout=</option></term> + <listitem> + <para>Wait for the event to finish up to the given + number of seconds. After this time the event will + be terminated. Default is 30.</para> + </listitem> + </varlistentry> + + <varlistentry> <term><option>--resolve-names=</option></term> <listitem> <para>Specify when systemd-udevd should resolve names of users and groups. @@ -156,6 +166,15 @@ </listitem> </varlistentry> <varlistentry> + <term><varname>udev.event-timeout=</varname></term> + <term><varname>rd.udev.event-timeout=</varname></term> + <listitem> + <para>Wait for events to finish up to the given number + of seconds. This option might be useful if events are + terminated due to a timeout in large configurations.</para> + </listitem> + </varlistentry> + <varlistentry> <term><varname>net.ifnames=</varname></term> <listitem> <para>Network interfaces are renamed to give them predictable names diff --git a/src/udev/udevd.c b/src/udev/udevd.c index 1c9488e..9221fad 100644 --- a/src/udev/udevd.c +++ b/src/udev/udevd.c @@ -72,6 +72,7 @@ static bool reload; static int children; static int children_max; static int exec_delay; +static int event_timeout = 30; static sigset_t sigmask_orig; static UDEV_LIST(event_list); static UDEV_LIST(worker_list); @@ -306,6 +307,9 @@ static void worker_new(struct event *event) } } + if (event_timeout != 30) + udev_event->timeout_usec = event_timeout * 1000 * 1000; + /* apply rules, create node, symlinks */ udev_event_execute_rules(udev_event, rules, &sigmask_orig); @@ -912,6 +916,8 @@ static void kernel_cmdline_options(struct udev *udev) children_max = strtoul(opt + 18, NULL, 0); } else if (startswith(opt, "udev.exec-delay=")) { exec_delay = strtoul(opt + 16, NULL, 0); + } else if (startswith(opt, "udev.event-timeout=")) { + event_timeout = strtoul(opt + 16, NULL, 0); } free(s); @@ -929,6 +935,7 @@ int main(int argc, char *argv[]) { "debug", no_argument, NULL, 'D' }, { "children-max", required_argument, NULL, 'c' }, { "exec-delay", required_argument, NULL, 'e' }, + { "event-timeout", required_argument, NULL, 't' }, { "resolve-names", required_argument, NULL, 'N' }, { "help", no_argument, NULL, 'h' }, { "version", no_argument, NULL, 'V' }, @@ -972,6 +979,9 @@ int main(int argc, char *argv[]) case 'e': exec_delay = strtoul(optarg, NULL, 0); break; + case 't': + event_timeout = strtoul(optarg, NULL, 0); + break; case 'D': debug = true; log_set_max_level(LOG_DEBUG); @@ -1259,7 +1269,7 @@ int main(int argc, char *argv[]) break; /* timeout at exit for workers to finish */ - timeout = 30 * MSEC_PER_SEC; + timeout = event_timeout * MSEC_PER_SEC; } else if (udev_list_node_is_empty(&event_list) && children == 0) { /* we are idle */ timeout = -1; @@ -1309,7 +1319,7 @@ int main(int argc, char *argv[]) if (worker->state != WORKER_RUNNING) continue; - if ((now(CLOCK_MONOTONIC) - worker->event_start_usec) > 30 * USEC_PER_SEC) { + if ((now(CLOCK_MONOTONIC) - worker->event_start_usec) > event_timeout * USEC_PER_SEC) { log_error("worker [%u] %s timeout; kill it", worker->pid, worker->event ? worker->event->devpath : "<idle>"); kill(worker->pid, SIGKILL); -- 1.8.4.5 _______________________________________________ systemd-devel mailing list systemd-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/systemd-devel