From a3d79fc3a0557b8f3c07c1ed559902c4e6473480 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Thu, 8 May 2025 01:07:44 +0900 Subject: [PATCH 1/3] 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 397ed03410..d9cc44bc5c 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 dc684d4b95..2ad47258f7 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 4f6d116857..4a2225d1c2 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 d087a33b5d..5c0a97be3d 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); } From 9999e8b409307c09f1b601f2810196d313af8fd0 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Thu, 8 May 2025 04:07:04 +0900 Subject: [PATCH 2/3] TEST-17-UDEV: drop needless numbering The subtest was renamed from TEST-17-UDEV.10.sh. Let's also drop the numbering from function name and interface name. Follow-up for 40959dcc028a6884fbea00c11d89217a77716d4d. --- test/units/TEST-17-UDEV.sanity-check.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/units/TEST-17-UDEV.sanity-check.sh b/test/units/TEST-17-UDEV.sanity-check.sh index 125a5946f7..004107eded 100755 --- a/test/units/TEST-17-UDEV.sanity-check.sh +++ b/test/units/TEST-17-UDEV.sanity-check.sh @@ -9,7 +9,7 @@ set -o pipefail # Coverage test for udevadm # shellcheck disable=SC2317 -cleanup_17_10() { +cleanup() { set +e losetup -d "$loopdev" @@ -19,9 +19,9 @@ cleanup_17_10() { } # Set up some test devices -trap cleanup_17_10 EXIT +trap cleanup EXIT -netdev=dummy17.10 +netdev=hoge ip link add $netdev type dummy blk="$(mktemp)" From 75e906a4067e9c4103c4ebbd8569002517666dfa Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Thu, 8 May 2025 04:18:58 +0900 Subject: [PATCH 3/3] TEST-17-UDEV: extend test cases for udevadm control --start-exec-queue/--stop-exec-queue --- test/units/TEST-17-UDEV.sanity-check.sh | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/test/units/TEST-17-UDEV.sanity-check.sh b/test/units/TEST-17-UDEV.sanity-check.sh index 004107eded..a655a4d775 100755 --- a/test/units/TEST-17-UDEV.sanity-check.sh +++ b/test/units/TEST-17-UDEV.sanity-check.sh @@ -55,8 +55,18 @@ udevadm control -l notice udevadm control --log-level info udevadm control --log-level debug (! udevadm control -l hello) -udevadm control -s -udevadm control -S + +# Check if processing queued events has been stopped. +udevadm control --stop-exec-queue +ip link add foobar type dummy +(! udevadm info --wait-for-initialization=3 /sys/class/net/foobar) +(! udevadm settle --timeout=0) +# Check if processing queued events has been restarted. +udevadm control --start-exec-queue +udevadm settle --timeout=30 +udevadm info --wait-for-initialization=0 /sys/class/net/foobar +ip link del foobar + udevadm control -R udevadm control -p HELLO=world udevadm control -m 42