In order to compute the kcpustat delta on a nohz CPU, we'll need to
fetch the task running on that target. Checking that its vtime
state snapshot actually refers to the relevant target involves recording
that CPU under the seqcount locked on task switch.

This is a step toward making kcpustat moving forward on full nohz CPUs.

Signed-off-by: Frederic Weisbecker <frede...@kernel.org>
Cc: Yauheni Kaliuta <yauheni.kali...@redhat.com>
Cc: Thomas Gleixner <t...@linutronix.de>
Cc: Rik van Riel <r...@redhat.com>
Cc: Peter Zijlstra <pet...@infradead.org>
Cc: Wanpeng Li <wanpen...@tencent.com>
Cc: Ingo Molnar <mi...@kernel.org>
---
 include/linux/sched.h  | 1 +
 kernel/sched/cputime.c | 3 +++
 2 files changed, 4 insertions(+)

diff --git a/include/linux/sched.h b/include/linux/sched.h
index a51c13c..9f56880 100644
--- a/include/linux/sched.h
+++ b/include/linux/sched.h
@@ -275,6 +275,7 @@ struct vtime {
        seqcount_t              seqcount;
        unsigned long long      starttime;
        enum vtime_state        state;
+       unsigned int            cpu;
        u64                     utime;
        u64                     stime;
        u64                     gtime;
diff --git a/kernel/sched/cputime.c b/kernel/sched/cputime.c
index facc665..6ac27687 100644
--- a/kernel/sched/cputime.c
+++ b/kernel/sched/cputime.c
@@ -817,6 +817,7 @@ void vtime_task_switch_generic(struct task_struct *prev)
        else
                __vtime_account_kernel(prev, vtime);
        vtime->state = VTIME_INACTIVE;
+       vtime->cpu = -1;
        write_seqcount_end(&vtime->seqcount);
 
        vtime = &current->vtime;
@@ -824,6 +825,7 @@ void vtime_task_switch_generic(struct task_struct *prev)
        write_seqcount_begin(&vtime->seqcount);
        vtime->state = VTIME_SYS;
        vtime->starttime = sched_clock();
+       vtime->cpu = smp_processor_id();
        write_seqcount_end(&vtime->seqcount);
 }
 
@@ -836,6 +838,7 @@ void vtime_init_idle(struct task_struct *t, int cpu)
        write_seqcount_begin(&vtime->seqcount);
        vtime->state = VTIME_SYS;
        vtime->starttime = sched_clock();
+       vtime->cpu = cpu;
        write_seqcount_end(&vtime->seqcount);
        local_irq_restore(flags);
 }
-- 
2.7.4

Reply via email to