summarylogtreecommitdiffstats
path: root/0003-tick-Detect-and-fix-jiffies-update-stall.patch
diff options
context:
space:
mode:
authorgraysky2022-04-13 06:33:14 -0400
committergraysky2022-04-13 06:33:14 -0400
commit51ada6c0f5ade1b03716f83641c4ef030d173faf (patch)
tree52adfbc7095af41d3d98a90210be1f3f94938aae /0003-tick-Detect-and-fix-jiffies-update-stall.patch
parent779064652f54ae6826d7e18090020d4a71c90121 (diff)
downloadaur-51ada6c0f5ade1b03716f83641c4ef030d173faf.tar.gz
Update to 5.17.3rc1-1
Diffstat (limited to '0003-tick-Detect-and-fix-jiffies-update-stall.patch')
-rw-r--r--0003-tick-Detect-and-fix-jiffies-update-stall.patch86
1 files changed, 86 insertions, 0 deletions
diff --git a/0003-tick-Detect-and-fix-jiffies-update-stall.patch b/0003-tick-Detect-and-fix-jiffies-update-stall.patch
new file mode 100644
index 000000000000..be56c710811d
--- /dev/null
+++ b/0003-tick-Detect-and-fix-jiffies-update-stall.patch
@@ -0,0 +1,86 @@
+From e3fb9a238974e20ab8a7b56e9f6a19e2acdc9b87 Mon Sep 17 00:00:00 2001
+From: Frederic Weisbecker <frederic@kernel.org>
+Date: Wed, 2 Feb 2022 01:01:07 +0100
+Subject: [PATCH 3/9] tick: Detect and fix jiffies update stall
+
+On some rare cases, the timekeeper CPU may be delaying its jiffies
+update duty for a while. Known causes include:
+
+* The timekeeper is waiting on stop_machine in a MULTI_STOP_DISABLE_IRQ
+ or MULTI_STOP_RUN state. Disabled interrupts prevent from timekeeping
+ updates while waiting for the target CPU to complete its
+ stop_machine() callback.
+
+* The timekeeper vcpu has VMEXIT'ed for a long while due to some overload
+ on the host.
+
+Detect and fix these situations with emergency timekeeping catchups.
+
+Original-patch-by: Paul E. McKenney <paulmck@kernel.org>
+Signed-off-by: Frederic Weisbecker <frederic@kernel.org>
+Cc: Thomas Gleixner <tglx@linutronix.de>
+---
+ kernel/time/tick-sched.c | 17 +++++++++++++++++
+ kernel/time/tick-sched.h | 4 ++++
+ 2 files changed, 21 insertions(+)
+
+diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c
+index 17a283ce2b20..c89f50a7e690 100644
+--- a/kernel/time/tick-sched.c
++++ b/kernel/time/tick-sched.c
+@@ -169,6 +169,8 @@ static ktime_t tick_init_jiffy_update(void)
+ return period;
+ }
+
++#define MAX_STALLED_JIFFIES 5
++
+ static void tick_sched_do_timer(struct tick_sched *ts, ktime_t now)
+ {
+ int cpu = smp_processor_id();
+@@ -196,6 +198,21 @@ static void tick_sched_do_timer(struct tick_sched *ts, ktime_t now)
+ if (tick_do_timer_cpu == cpu)
+ tick_do_update_jiffies64(now);
+
++ /*
++ * If jiffies update stalled for too long (timekeeper in stop_machine()
++ * or VMEXIT'ed for several msecs), force an update.
++ */
++ if (ts->last_tick_jiffies != jiffies) {
++ ts->stalled_jiffies = 0;
++ ts->last_tick_jiffies = READ_ONCE(jiffies);
++ } else {
++ if (++ts->stalled_jiffies == MAX_STALLED_JIFFIES) {
++ tick_do_update_jiffies64(now);
++ ts->stalled_jiffies = 0;
++ ts->last_tick_jiffies = READ_ONCE(jiffies);
++ }
++ }
++
+ if (ts->inidle)
+ ts->got_idle_tick = 1;
+ }
+diff --git a/kernel/time/tick-sched.h b/kernel/time/tick-sched.h
+index d952ae393423..504649513399 100644
+--- a/kernel/time/tick-sched.h
++++ b/kernel/time/tick-sched.h
+@@ -49,6 +49,8 @@ enum tick_nohz_mode {
+ * @timer_expires_base: Base time clock monotonic for @timer_expires
+ * @next_timer: Expiry time of next expiring timer for debugging purpose only
+ * @tick_dep_mask: Tick dependency mask - is set, if someone needs the tick
++ * @last_tick_jiffies: Value of jiffies seen on last tick
++ * @stalled_jiffies: Number of stalled jiffies detected across ticks
+ */
+ struct tick_sched {
+ struct hrtimer sched_timer;
+@@ -77,6 +79,8 @@ struct tick_sched {
+ u64 next_timer;
+ ktime_t idle_expires;
+ atomic_t tick_dep_mask;
++ unsigned long last_tick_jiffies;
++ unsigned int stalled_jiffies;
+ };
+
+ extern struct tick_sched *tick_get_tick_sched(int cpu);
+--
+2.35.1
+