]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
4.5-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 10 Apr 2016 18:18:16 +0000 (11:18 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 10 Apr 2016 18:18:16 +0000 (11:18 -0700)
added patches:
sched-cputime-fix-steal-time-accounting-vs.-cpu-hotplug.patch

queue-4.5/sched-cputime-fix-steal-time-accounting-vs.-cpu-hotplug.patch [new file with mode: 0644]
queue-4.5/series

diff --git a/queue-4.5/sched-cputime-fix-steal-time-accounting-vs.-cpu-hotplug.patch b/queue-4.5/sched-cputime-fix-steal-time-accounting-vs.-cpu-hotplug.patch
new file mode 100644 (file)
index 0000000..0b88485
--- /dev/null
@@ -0,0 +1,81 @@
+From e9532e69b8d1d1284e8ecf8d2586de34aec61244 Mon Sep 17 00:00:00 2001
+From: Thomas Gleixner <tglx@linutronix.de>
+Date: Fri, 4 Mar 2016 15:59:42 +0100
+Subject: sched/cputime: Fix steal time accounting vs. CPU hotplug
+
+From: Thomas Gleixner <tglx@linutronix.de>
+
+commit e9532e69b8d1d1284e8ecf8d2586de34aec61244 upstream.
+
+On CPU hotplug the steal time accounting can keep a stale rq->prev_steal_time
+value over CPU down and up. So after the CPU comes up again the delta
+calculation in steal_account_process_tick() wreckages itself due to the
+unsigned math:
+
+        u64 steal = paravirt_steal_clock(smp_processor_id());
+
+        steal -= this_rq()->prev_steal_time;
+
+So if steal is smaller than rq->prev_steal_time we end up with an insane large
+value which then gets added to rq->prev_steal_time, resulting in a permanent
+wreckage of the accounting. As a consequence the per CPU stats in /proc/stat
+become stale.
+
+Nice trick to tell the world how idle the system is (100%) while the CPU is
+100% busy running tasks. Though we prefer realistic numbers.
+
+None of the accounting values which use a previous value to account for
+fractions is reset at CPU hotplug time. update_rq_clock_task() has a sanity
+check for prev_irq_time and prev_steal_time_rq, but that sanity check solely
+deals with clock warps and limits the /proc/stat visible wreckage. The
+prev_time values are still wrong.
+
+Solution is simple: Reset rq->prev_*_time when the CPU is plugged in again.
+
+Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
+Acked-by: Rik van Riel <riel@redhat.com>
+Cc: Frederic Weisbecker <fweisbec@gmail.com>
+Cc: Glauber Costa <glommer@parallels.com>
+Cc: Linus Torvalds <torvalds@linux-foundation.org>
+Cc: Peter Zijlstra <peterz@infradead.org>
+Fixes: commit 095c0aa83e52 "sched: adjust scheduler cpu power for stolen time"
+Fixes: commit aa483808516c "sched: Remove irq time from available CPU power"
+Fixes: commit e6e6685accfa "KVM guest: Steal time accounting"
+Link: http://lkml.kernel.org/r/alpine.DEB.2.11.1603041539490.3686@nanos
+Signed-off-by: Ingo Molnar <mingo@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ kernel/sched/core.c  |    1 +
+ kernel/sched/sched.h |   13 +++++++++++++
+ 2 files changed, 14 insertions(+)
+
+--- a/kernel/sched/core.c
++++ b/kernel/sched/core.c
+@@ -5630,6 +5630,7 @@ migration_call(struct notifier_block *nf
+       case CPU_UP_PREPARE:
+               rq->calc_load_update = calc_load_update;
++              account_reset_rq(rq);
+               break;
+       case CPU_ONLINE:
+--- a/kernel/sched/sched.h
++++ b/kernel/sched/sched.h
+@@ -1738,3 +1738,16 @@ static inline u64 irq_time_read(int cpu)
+ }
+ #endif /* CONFIG_64BIT */
+ #endif /* CONFIG_IRQ_TIME_ACCOUNTING */
++
++static inline void account_reset_rq(struct rq *rq)
++{
++#ifdef CONFIG_IRQ_TIME_ACCOUNTING
++      rq->prev_irq_time = 0;
++#endif
++#ifdef CONFIG_PARAVIRT
++      rq->prev_steal_time = 0;
++#endif
++#ifdef CONFIG_PARAVIRT_TIME_ACCOUNTING
++      rq->prev_steal_time_rq = 0;
++#endif
++}
index c8430c5fbf1e73dadee090f9d801879a95b8ee29..82249a878ced8a372d6cc44637c887de7839e7ca 100644 (file)
@@ -230,3 +230,4 @@ mtd-onenand-fix-deadlock-in-onenand_block_markbad.patch
 intel_idle-prevent-skl-h-boot-failure-when-c8-c9-c10-enabled.patch
 pm-sleep-clear-pm_suspend_global_flags-upon-hibernate.patch
 scsi_common-do-not-clobber-fixed-sense-information.patch
+sched-cputime-fix-steal-time-accounting-vs.-cpu-hotplug.patch