summaryrefslogtreecommitdiffstats
path: root/debian/patches-rt/0183-hrtimer-Don-t-lose-state-in-cpu_chill.patch
diff options
context:
space:
mode:
Diffstat (limited to 'debian/patches-rt/0183-hrtimer-Don-t-lose-state-in-cpu_chill.patch')
-rw-r--r--debian/patches-rt/0183-hrtimer-Don-t-lose-state-in-cpu_chill.patch48
1 files changed, 48 insertions, 0 deletions
diff --git a/debian/patches-rt/0183-hrtimer-Don-t-lose-state-in-cpu_chill.patch b/debian/patches-rt/0183-hrtimer-Don-t-lose-state-in-cpu_chill.patch
new file mode 100644
index 000000000..bb9264a1f
--- /dev/null
+++ b/debian/patches-rt/0183-hrtimer-Don-t-lose-state-in-cpu_chill.patch
@@ -0,0 +1,48 @@
+From f5a443f1a8355f1e2aca72d20e931d136b979ac9 Mon Sep 17 00:00:00 2001
+From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+Date: Tue, 19 Feb 2019 16:59:15 +0100
+Subject: [PATCH 183/347] hrtimer: Don't lose state in cpu_chill()
+Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.246-rt110.tar.xz
+
+In cpu_chill() the state is set to TASK_UNINTERRUPTIBLE and a timer is
+programmed. On return the state is always TASK_RUNNING which means we
+lose the state if it was something other than RUNNING. Also
+set_current_state() sets ->task_state_change to within cpu_chill() which
+is not expected.
+
+Save the task state on entry and restore it on return. Simply set the
+state in order to avoid updating ->task_state_change.
+
+Cc: stable-rt@vger.kernel.org
+Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+---
+ kernel/time/hrtimer.c | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+diff --git a/kernel/time/hrtimer.c b/kernel/time/hrtimer.c
+index 0b94f54453ef..96e505abf939 100644
+--- a/kernel/time/hrtimer.c
++++ b/kernel/time/hrtimer.c
+@@ -1969,15 +1969,18 @@ void cpu_chill(void)
+ {
+ ktime_t chill_time;
+ unsigned int freeze_flag = current->flags & PF_NOFREEZE;
++ long saved_state;
+
++ saved_state = current->state;
+ chill_time = ktime_set(0, NSEC_PER_MSEC);
+- set_current_state(TASK_UNINTERRUPTIBLE);
++ __set_current_state_no_track(TASK_UNINTERRUPTIBLE);
+ current->flags |= PF_NOFREEZE;
+ sleeping_lock_inc();
+ schedule_hrtimeout(&chill_time, HRTIMER_MODE_REL_HARD);
+ sleeping_lock_dec();
+ if (!freeze_flag)
+ current->flags &= ~PF_NOFREEZE;
++ __set_current_state_no_track(saved_state);
+ }
+ EXPORT_SYMBOL(cpu_chill);
+ #endif
+--
+2.36.1
+