Patch "sched/cpuacct: Fix charge percpu cpuusage" has been added to the 5.10-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    sched/cpuacct: Fix charge percpu cpuusage

to the 5.10-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     sched-cpuacct-fix-charge-percpu-cpuusage.patch
and it can be found in the queue-5.10 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 42b47adc5d1c7f3bd9823dd12eaaffaee25cef90
Author: Chengming Zhou <zhouchengming@xxxxxxxxxxxxx>
Date:   Fri Sep 29 16:14:16 2023 +0300

    sched/cpuacct: Fix charge percpu cpuusage
    
    commit 248cc9993d1cc12b8e9ed716cc3fc09f6c3517dd upstream.
    
    The cpuacct_account_field() is always called by the current task
    itself, so it's ok to use __this_cpu_add() to charge the tick time.
    
    But cpuacct_charge() maybe called by update_curr() in load_balance()
    on a random CPU, different from the CPU on which the task is running.
    So __this_cpu_add() will charge that cputime to a random incorrect CPU.
    
    Fixes: 73e6aafd9ea8 ("sched/cpuacct: Simplify the cpuacct code")
    Reported-by: Minye Zhu <zhuminye@xxxxxxxxxxxxx>
    Signed-off-by: Chengming Zhou <zhouchengming@xxxxxxxxxxxxx>
    Signed-off-by: Peter Zijlstra (Intel) <peterz@xxxxxxxxxxxxx>
    Acked-by: Tejun Heo <tj@xxxxxxxxxx>
    Link: https://lore.kernel.org/r/20220220051426.5274-1-zhouchengming@xxxxxxxxxxxxx
    Signed-off-by: Ovidiu Panait <ovidiu.panait@xxxxxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/kernel/sched/cpuacct.c b/kernel/sched/cpuacct.c
index 8a260115a137b..3c59c541dd314 100644
--- a/kernel/sched/cpuacct.c
+++ b/kernel/sched/cpuacct.c
@@ -328,12 +328,13 @@ static struct cftype files[] = {
  */
 void cpuacct_charge(struct task_struct *tsk, u64 cputime)
 {
+	unsigned int cpu = task_cpu(tsk);
 	struct cpuacct *ca;
 
 	rcu_read_lock();
 
 	for (ca = task_ca(tsk); ca; ca = parent_ca(ca))
-		__this_cpu_add(*ca->cpuusage, cputime);
+		*per_cpu_ptr(ca->cpuusage, cpu) += cputime;
 
 	rcu_read_unlock();
 }



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux