From: Yu Watanabe Date: Wed, 7 May 2025 16:07:44 +0000 (+0900) Subject: udev: enable kill workers timer when processing queued events stopped X-Git-Tag: v258-rc1~662^2~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a3d79fc3a0557b8f3c07c1ed559902c4e6473480;p=thirdparty%2Fsystemd.git udev: enable kill workers timer when processing queued events stopped It is not necessary to keep idle workers so long time in that case. --- diff --git a/src/udev/udev-manager-ctrl.c b/src/udev/udev-manager-ctrl.c index 397ed034106..d9cc44bc5ca 100644 --- a/src/udev/udev-manager-ctrl.c +++ b/src/udev/udev-manager-ctrl.c @@ -29,6 +29,7 @@ static int on_ctrl_msg(UdevCtrl *uctrl, UdevCtrlMessageType type, const UdevCtrl case UDEV_CTRL_STOP_EXEC_QUEUE: log_debug("Received udev control message (STOP_EXEC_QUEUE)"); manager->stop_exec_queue = true; + (void) manager_reset_kill_workers_timer(manager); break; case UDEV_CTRL_START_EXEC_QUEUE: log_debug("Received udev control message (START_EXEC_QUEUE)"); diff --git a/src/udev/udev-manager.c b/src/udev/udev-manager.c index dc684d4b95b..2ad47258f71 100644 --- a/src/udev/udev-manager.c +++ b/src/udev/udev-manager.c @@ -201,7 +201,7 @@ static int on_kill_workers_event(sd_event_source *s, uint64_t usec, void *userda return 0; } -static int manager_reset_kill_workers_timer(Manager *manager) { +int manager_reset_kill_workers_timer(Manager *manager) { int r; assert(manager); diff --git a/src/udev/udev-manager.h b/src/udev/udev-manager.h index 4f6d1168577..4a2225d1c2d 100644 --- a/src/udev/udev-manager.h +++ b/src/udev/udev-manager.h @@ -93,6 +93,7 @@ void manager_exit(Manager *manager); void notify_ready(Manager *manager); void manager_kill_workers(Manager *manager, int signo); +int manager_reset_kill_workers_timer(Manager *manager); bool devpath_conflict(const char *a, const char *b); diff --git a/src/udev/udev-varlink.c b/src/udev/udev-varlink.c index d087a33b5d0..5c0a97be3da 100644 --- a/src/udev/udev-varlink.c +++ b/src/udev/udev-varlink.c @@ -136,6 +136,14 @@ static int vl_method_start_stop_exec_queue(sd_varlink *link, sd_json_variant *pa log_debug("Received %s()", method); manager->stop_exec_queue = streq(method, "io.systemd.Udev.StopExecQueue"); + + /* In case that processing queued events will be stopped for a while, regardless if there exist + * queued events, enable the kill workers timer here unless it is already enabled. Note, it is not + * necessary to disable the timer when processing is restarted, as it will be anyway disabled in + * on_post() -> event_queue_start(). */ + if (manager->stop_exec_queue) + (void) manager_reset_kill_workers_timer(manager); + return sd_varlink_reply(link, NULL); }