From a3d79fc3a0557b8f3c07c1ed559902c4e6473480 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Thu, 8 May 2025 01:07:44 +0900 Subject: [PATCH] udev: enable kill workers timer when processing queued events stopped It is not necessary to keep idle workers so long time in that case. --- src/udev/udev-manager-ctrl.c | 1 + src/udev/udev-manager.c | 2 +- src/udev/udev-manager.h | 1 + src/udev/udev-varlink.c | 8 ++++++++ 4 files changed, 11 insertions(+), 1 deletion(-) 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); } -- 2.47.3