| From: Hiroshi Shimamoto <h-shimamoto@ct.jp.nec.com> |
| Date: Thu, 19 Nov 2015 16:47:28 +0100 |
| Subject: sched/cputime: Fix invalid gtime in proc |
| |
| commit 2541117b0cf79977fa11a0d6e17d61010677bd7b upstream. |
| |
| /proc/stats shows invalid gtime when the thread is running in guest. |
| When vtime accounting is not enabled, we cannot get a valid delta. |
| The delta is calculated with now - tsk->vtime_snap, but tsk->vtime_snap |
| is only updated when vtime accounting is runtime enabled. |
| |
| This patch makes task_gtime() just return gtime without computing the |
| buggy non-existing tickless delta when vtime accounting is not enabled. |
| |
| Use context_tracking_is_enabled() to check if vtime is accounting on |
| some cpu, in which case only we need to check the tickless delta. This |
| way we fix the gtime value regression on machines not running nohz full. |
| |
| The kernel config contains CONFIG_VIRT_CPU_ACCOUNTING_GEN=y and |
| CONFIG_NO_HZ_FULL_ALL=n and boot without nohz_full. |
| |
| I ran and stop a busy loop in VM and see the gtime in host. |
| Dump the 43rd field which shows the gtime in every second: |
| |
| # while :; do awk '{print $3" "$43}' /proc/3955/task/4014/stat; sleep 1; done |
| S 4348 |
| R 7064566 |
| R 7064766 |
| R 7064967 |
| R 7065168 |
| S 4759 |
| S 4759 |
| |
| During running busy loop, it returns large value. |
| |
| After applying this patch, we can see right gtime. |
| |
| # while :; do awk '{print $3" "$43}' /proc/10913/task/10956/stat; sleep 1; done |
| S 5338 |
| R 5365 |
| R 5465 |
| R 5566 |
| R 5666 |
| S 5726 |
| S 5726 |
| |
| Signed-off-by: Hiroshi Shimamoto <h-shimamoto@ct.jp.nec.com> |
| Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com> |
| Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> |
| Cc: Chris Metcalf <cmetcalf@ezchip.com> |
| Cc: Christoph Lameter <cl@linux.com> |
| Cc: Linus Torvalds <torvalds@linux-foundation.org> |
| Cc: Luiz Capitulino <lcapitulino@redhat.com> |
| Cc: Mike Galbraith <efault@gmx.de> |
| Cc: Paul E . McKenney <paulmck@linux.vnet.ibm.com> |
| Cc: Paul E. McKenney <paulmck@linux.vnet.ibm.com> |
| Cc: Peter Zijlstra <peterz@infradead.org> |
| Cc: Rik van Riel <riel@redhat.com> |
| Cc: Thomas Gleixner <tglx@linutronix.de> |
| Link: http://lkml.kernel.org/r/1447948054-28668-2-git-send-email-fweisbec@gmail.com |
| Signed-off-by: Ingo Molnar <mingo@kernel.org> |
| Signed-off-by: Ben Hutchings <ben@decadent.org.uk> |
| --- |
| kernel/sched/cputime.c | 3 +++ |
| 1 file changed, 3 insertions(+) |
| |
| --- a/kernel/sched/cputime.c |
| +++ b/kernel/sched/cputime.c |
| @@ -753,6 +753,9 @@ cputime_t task_gtime(struct task_struct |
| unsigned int seq; |
| cputime_t gtime; |
| |
| + if (!context_tracking_is_enabled()) |
| + return t->gtime; |
| + |
| do { |
| seq = read_seqbegin(&t->vtime_seqlock); |
| |