Skip to content

Commit

Permalink
sched/cpuacct: Optimize away RCU read lock
Browse files Browse the repository at this point in the history
Since cpuacct_charge() is called from the scheduler update_curr(),
we must already have rq lock held, then the RCU read lock can
be optimized away.

And do the same thing in it's wrapper cgroup_account_cputime(),
but we can't use lockdep_assert_rq_held() there, which defined
in kernel/sched/sched.h.

Suggested-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Signed-off-by: Chengming Zhou <zhouchengming@bytedance.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Link: https://lore.kernel.org/r/20220220051426.5274-2-zhouchengming@bytedance.com
  • Loading branch information
Chengming Zhou authored and Peter Zijlstra committed Mar 1, 2022
1 parent 248cc99 commit dc6e081
Show file tree
Hide file tree
Showing 2 changed files with 1 addition and 5 deletions.
2 changes: 0 additions & 2 deletions include/linux/cgroup.h
Original file line number Diff line number Diff line change
Expand Up @@ -791,11 +791,9 @@ static inline void cgroup_account_cputime(struct task_struct *task,

cpuacct_charge(task, delta_exec);

rcu_read_lock();
cgrp = task_dfl_cgroup(task);
if (cgroup_parent(cgrp))
__cgroup_account_cputime(cgrp, delta_exec);
rcu_read_unlock();
}

static inline void cgroup_account_cputime_field(struct task_struct *task,
Expand Down
4 changes: 1 addition & 3 deletions kernel/sched/cpuacct.c
Original file line number Diff line number Diff line change
Expand Up @@ -337,12 +337,10 @@ void cpuacct_charge(struct task_struct *tsk, u64 cputime)
unsigned int cpu = task_cpu(tsk);
struct cpuacct *ca;

rcu_read_lock();
lockdep_assert_rq_held(cpu_rq(cpu));

for (ca = task_ca(tsk); ca; ca = parent_ca(ca))
*per_cpu_ptr(ca->cpuusage, cpu) += cputime;

rcu_read_unlock();
}

/*
Expand Down

0 comments on commit dc6e081

Please sign in to comment.