Blob Blame History Raw
From: Christian Borntraeger <borntraeger@de.ibm.com>
Subject: s390/cputime: fix guest/irq/softirq times after CPU hotplug
Patch-mainline: v4.14-rc6
Git-commit: b7662eef14caf4f582d453d45395825b5a8f594c
References: bnc#1066983, LTC#161328

Description:  cputime: Fix guest/irq/softirq time after cpu hotplug
Symptom:      /proc/stat has very high values for guest, irq and
              softirq after a cpu hotplug.
Problem:      The counters are not properly initialized on CPU hotplug.
Solution:     Properly initialize the counters.
Reproduction: Do a CPU hotplug and check /proc/stat.

Upstream-Description:

              s390/cputime: fix guest/irq/softirq times after CPU hotplug

              On CPU hotplug some cpu stats contain bogus values:

              $ cat /proc/stat
              cpu 0 0 49 1280 0 0 0 3 0 0
              cpu0 0 0 49 618 0 0 0 3 0 0
              cpu1 0 0 0 662 0 0 0 0 0 0
              [...]
              $ echo 0 > /sys/devices/system/cpu/cpu1/online
              $ echo 1 > /sys/devices/system/cpu/cpu1/online
              $ cat /proc/stat
              cpu 0 0 49 3200 0 450359962737 450359962737 3 0 0
              cpu0 0 0 49 1956 0 0 0 3 0 0
              cpu1 0 0 0 1244 0 450359962737 450359962737 0 0 0
              [...]

              pcpu_attach_task() needs the same assignments as vtime_task_switch.

              Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
              Fixes: b7394a5f4ce9 ("sched/cputime, s390: Implement delayed accounting of system time")
              Cc: stable@vger.kernel.org # 4.11+
              Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>


Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
Acked-by: Hannes Reinecke <hare@suse.com>
---
 arch/s390/kernel/smp.c |    3 +++
 1 file changed, 3 insertions(+)

--- a/arch/s390/kernel/smp.c
+++ b/arch/s390/kernel/smp.c
@@ -290,7 +290,10 @@ static void pcpu_attach_task(struct pcpu
 	lc->lpp = LPP_MAGIC;
 	lc->current_pid = tsk->pid;
 	lc->user_timer = tsk->thread.user_timer;
+	lc->guest_timer = tsk->thread.guest_timer;
 	lc->system_timer = tsk->thread.system_timer;
+	lc->hardirq_timer = tsk->thread.hardirq_timer;
+	lc->softirq_timer = tsk->thread.softirq_timer;
 	lc->steal_timer = 0;
 }