Messages in this thread | | | Date | Mon, 25 Jan 2010 15:14:04 -0800 | From | Andrew Morton <> | Subject | Re: [PATCH] sched: cpuacct: Use bigger percpu counter batch values for stats counters |
| |
On Mon, 18 Jan 2010 15:41:42 +1100 Anton Blanchard <anton@samba.org> wrote:
> When CONFIG_VIRT_CPU_ACCOUNTING and CONFIG_CGROUP_CPUACCT are enabled we can > call cpuacct_update_stats with values much larger than percpu_counter_batch. > This means the call to percpu_counter_add will always add to the global count > which is protected by a spinlock and we end up with a global spinlock in > the scheduler.
When one looks at the end result:
: static void cpuacct_update_stats(struct task_struct *tsk, : enum cpuacct_stat_index idx, cputime_t val) : { : struct cpuacct *ca; : int batch; : : if (unlikely(!cpuacct_subsys.active)) : return; : : rcu_read_lock(); : ca = task_ca(tsk); : : batch = min_t(long, percpu_counter_batch * cputime_one_jiffy, INT_MAX); : do { : __percpu_counter_add(&ca->cpustat[idx], val, batch); : ca = ca->parent; : } while (ca); : rcu_read_unlock(); : }
the code (which used to be quite obvious) becomes pretty unobvious. In fact it looks quite wrong.
Shouldn't there be a comment there explaining wtf is going on?
| |