bed1e46362
Backport the patches for this issue: https://bugzilla.redhat.com/show_bug.cgi?id=1968528 It reports: The fix for Bug 1819868 has introduced a new issue related to its implementation of rate limiting. Rate limiting the mount_event_source can cause unmount events to be missed, which leads to mount unit cgroups being leaked (not cleaned up when the mount is gone). The fix for 1968528 can fix the issue we met: During the reboot process of subclouds (either lock-unlock or sudo reboot), unmounting failure messages repeat for a few hundred of times. The patches are listed at: https://github.com/redhat-plumbers/systemd-rhel8/pull/198/commits And they are picked from https://github.com/systemd-rhel/rhel-8/ (branch rhel-8.4.0). Verification: In my test on an AIO-SX lab, the bug appears as: run "sudo reboot" on controller, endless unmounting failure logs printed. Verified that the problem was there during the shutdown phase of a reboot. Reinstalled with a fixed image, and verified that the issue was now gone by doing 5 reboots. Ran sanity on the lab, and verified no new issues seen. Closes-Bug: #1948899 Signed-off-by: Li Zhou <li.zhou@windriver.com> Change-Id: If95932ceead1bea973f2219d3a8d6b04cf0fd5f8
99 lines
3.7 KiB
Diff
99 lines
3.7 KiB
Diff
From 766177b0afd897e43504c1228fe46ea03833df29 Mon Sep 17 00:00:00 2001
|
|
From: Yu Watanabe <watanabe.yu+github@gmail.com>
|
|
Date: Tue, 15 Jun 2021 00:51:33 +0900
|
|
Subject: [PATCH 3/6] sd-event: use CMP() macro
|
|
|
|
(cherry picked from commit 06e131477d82b83c5d516e66d6e413affd7c774a)
|
|
|
|
Related: #1984406
|
|
|
|
[commit eaab8d57d9db0d98d7e618ba634983c34cdb9c06 from
|
|
https://github.com/systemd-rhel/rhel-8/ (branch rhel-8.4.0)]
|
|
|
|
Signed-off-by: Li Zhou <li.zhou@windriver.com>
|
|
---
|
|
src/libsystemd/sd-event/sd-event.c | 37 ++++++++++++++----------------
|
|
1 file changed, 17 insertions(+), 20 deletions(-)
|
|
|
|
diff --git a/src/libsystemd/sd-event/sd-event.c b/src/libsystemd/sd-event/sd-event.c
|
|
index 9b6d2f0..84a874d 100644
|
|
--- a/src/libsystemd/sd-event/sd-event.c
|
|
+++ b/src/libsystemd/sd-event/sd-event.c
|
|
@@ -283,10 +283,9 @@ static int pending_prioq_compare(const void *a, const void *b) {
|
|
assert(y->pending);
|
|
|
|
/* Enabled ones first */
|
|
- if (x->enabled != SD_EVENT_OFF && y->enabled == SD_EVENT_OFF)
|
|
- return -1;
|
|
- if (x->enabled == SD_EVENT_OFF && y->enabled != SD_EVENT_OFF)
|
|
- return 1;
|
|
+ r = CMP(x->enabled == SD_EVENT_OFF, y->enabled == SD_EVENT_OFF);
|
|
+ if (r != 0)
|
|
+ return r;
|
|
|
|
/* Non rate-limited ones first. */
|
|
r = CMP(!!x->ratelimited, !!y->ratelimited);
|
|
@@ -310,10 +309,9 @@ static int prepare_prioq_compare(const void *a, const void *b) {
|
|
assert(y->prepare);
|
|
|
|
/* Enabled ones first */
|
|
- if (x->enabled != SD_EVENT_OFF && y->enabled == SD_EVENT_OFF)
|
|
- return -1;
|
|
- if (x->enabled == SD_EVENT_OFF && y->enabled != SD_EVENT_OFF)
|
|
- return 1;
|
|
+ r = CMP(x->enabled == SD_EVENT_OFF, y->enabled == SD_EVENT_OFF);
|
|
+ if (r != 0)
|
|
+ return r;
|
|
|
|
/* Non rate-limited ones first. */
|
|
r = CMP(!!x->ratelimited, !!y->ratelimited);
|
|
@@ -380,18 +378,17 @@ static bool event_source_timer_candidate(const sd_event_source *s) {
|
|
|
|
static int time_prioq_compare(const void *a, const void *b, usec_t (*time_func)(const sd_event_source *s)) {
|
|
const sd_event_source *x = a, *y = b;
|
|
+ int r;
|
|
|
|
/* Enabled ones first */
|
|
- if (x->enabled != SD_EVENT_OFF && y->enabled == SD_EVENT_OFF)
|
|
- return -1;
|
|
- if (x->enabled == SD_EVENT_OFF && y->enabled != SD_EVENT_OFF)
|
|
- return 1;
|
|
+ r = CMP(x->enabled == SD_EVENT_OFF, y->enabled == SD_EVENT_OFF);
|
|
+ if (r != 0)
|
|
+ return r;
|
|
|
|
/* Order "non-pending OR ratelimited" before "pending AND not-ratelimited" */
|
|
- if (event_source_timer_candidate(x) && !event_source_timer_candidate(y))
|
|
- return -1;
|
|
- if (!event_source_timer_candidate(x) && event_source_timer_candidate(y))
|
|
- return 1;
|
|
+ r = CMP(!event_source_timer_candidate(x), !event_source_timer_candidate(y));
|
|
+ if (r != 0)
|
|
+ return r;
|
|
|
|
/* Order by time */
|
|
return CMP(time_func(x), time_func(y));
|
|
@@ -407,15 +404,15 @@ static int latest_time_prioq_compare(const void *a, const void *b) {
|
|
|
|
static int exit_prioq_compare(const void *a, const void *b) {
|
|
const sd_event_source *x = a, *y = b;
|
|
+ int r;
|
|
|
|
assert(x->type == SOURCE_EXIT);
|
|
assert(y->type == SOURCE_EXIT);
|
|
|
|
/* Enabled ones first */
|
|
- if (x->enabled != SD_EVENT_OFF && y->enabled == SD_EVENT_OFF)
|
|
- return -1;
|
|
- if (x->enabled == SD_EVENT_OFF && y->enabled != SD_EVENT_OFF)
|
|
- return 1;
|
|
+ r = CMP(x->enabled == SD_EVENT_OFF, y->enabled == SD_EVENT_OFF);
|
|
+ if (r != 0)
|
|
+ return r;
|
|
|
|
/* Lower priority values first */
|
|
if (x->priority < y->priority)
|
|
--
|
|
2.17.1
|
|
|