60 lines
2.7 KiB
Diff
60 lines
2.7 KiB
Diff
From f1a8b69808777aff37c036fd94a0275873d12407 Mon Sep 17 00:00:00 2001
|
|
From: Yu Watanabe <watanabe.yu+github@gmail.com>
|
|
Date: Thu, 23 Feb 2023 07:31:01 +0900
|
|
Subject: [PATCH] sd-event: always initialize sd_event.perturb
|
|
|
|
If the boot ID cannot be obtained, let's first fallback to the machine
|
|
ID, and if still cannot, then let's use 0.
|
|
Otherwise, no timer event source cannot be triggered.
|
|
|
|
Fixes #26549.
|
|
|
|
(cherry picked from commit 6d2326e036ceed30f9ccdb0266713c10a44dcf6c)
|
|
(cherry picked from commit 58c821af607b61738b7b72ad1452e70f648689a6)
|
|
(cherry picked from commit 78976199b2e016600c3f7cf8f39747c9ef6c853b)
|
|
(cherry picked from commit ac04d804c30f519918866fb4eeb3bc4a9cbadd43)
|
|
---
|
|
src/libsystemd/sd-event/sd-event.c | 21 ++++++++++-----------
|
|
1 file changed, 10 insertions(+), 11 deletions(-)
|
|
|
|
diff --git a/src/libsystemd/sd-event/sd-event.c b/src/libsystemd/sd-event/sd-event.c
|
|
index 89accdce00..37565b17be 100644
|
|
--- a/src/libsystemd/sd-event/sd-event.c
|
|
+++ b/src/libsystemd/sd-event/sd-event.c
|
|
@@ -1126,22 +1126,21 @@ _public_ int sd_event_add_io(
|
|
}
|
|
|
|
static void initialize_perturb(sd_event *e) {
|
|
- sd_id128_t bootid = {};
|
|
+ sd_id128_t id = {};
|
|
|
|
- /* When we sleep for longer, we try to realign the wakeup to
|
|
- the same time within each minute/second/250ms, so that
|
|
- events all across the system can be coalesced into a single
|
|
- CPU wakeup. However, let's take some system-specific
|
|
- randomness for this value, so that in a network of systems
|
|
- with synced clocks timer events are distributed a
|
|
- bit. Here, we calculate a perturbation usec offset from the
|
|
- boot ID. */
|
|
+ /* When we sleep for longer, we try to realign the wakeup to the same time within each
|
|
+ * minute/second/250ms, so that events all across the system can be coalesced into a single CPU
|
|
+ * wakeup. However, let's take some system-specific randomness for this value, so that in a network
|
|
+ * of systems with synced clocks timer events are distributed a bit. Here, we calculate a
|
|
+ * perturbation usec offset from the boot ID (or machine ID if failed, e.g. /proc is not mounted). */
|
|
|
|
if (_likely_(e->perturb != USEC_INFINITY))
|
|
return;
|
|
|
|
- if (sd_id128_get_boot(&bootid) >= 0)
|
|
- e->perturb = (bootid.qwords[0] ^ bootid.qwords[1]) % USEC_PER_MINUTE;
|
|
+ if (sd_id128_get_boot(&id) >= 0 || sd_id128_get_machine(&id) > 0)
|
|
+ e->perturb = (id.qwords[0] ^ id.qwords[1]) % USEC_PER_MINUTE;
|
|
+ else
|
|
+ e->perturb = 0; /* This is a super early process without /proc and /etc ?? */
|
|
}
|
|
|
|
static int event_setup_timer_fd(
|
|
--
|
|
2.33.0
|
|
|