Messages in this thread | | | Subject | Re: [patch 1/2] sched, timers: move calc_load() to scheduler | From | Peter Zijlstra <> | Date | Fri, 15 May 2009 07:13:11 +0200 |
| |
On Thu, 2009-05-14 at 22:40 +0200, Thomas Gleixner wrote: > On Thu, 14 May 2009, Peter Zijlstra wrote: > > On Thu, 2009-05-14 at 11:21 +0000, Thomas Gleixner wrote: > > > plain text document attachment (move-calc-load-to-scheduler-v1.patch) > > > > > +/* > > > + * calc_load - update the avenrun load estimates 10 ticks after the > > > + * CPUs have updated calc_load_tasks. > > > + */ > > > +void calc_global_load(void) > > > +{ > > > + unsigned long upd = calc_load_update + 10; > > > + long active; > > > + > > > + if (time_before(jiffies, upd)) > > > + return; > > > > > > + active = atomic_long_read(&calc_load_tasks); > > > + active = active > 0 ? active * FIXED_1 : 0; > > > > > > + avenrun[0] = calc_load(avenrun[0], EXP_1, active); > > > + avenrun[1] = calc_load(avenrun[1], EXP_5, active); > > > + avenrun[2] = calc_load(avenrun[2], EXP_15, active); > > > + > > > + calc_load_update += LOAD_FREQ; > > > +} > > > > > @@ -1211,7 +1160,8 @@ static inline void update_times(unsigned > > > void do_timer(unsigned long ticks) > > > { > > > jiffies_64 += ticks; > > > - update_times(ticks); > > > + update_wall_time(); > > > + calc_global_load(); > > > } > > > > I can see multiple cpus fall into calc_global_load() concurrently, which > > would 'age' the load faster than expected. > > > > Should we plug that hole? > > They can't. do_timer() is called by exactly one CPU under xtime > lock. What we removed is the loop over all online CPUs to retrieve the > number of active tasks.
Ah, D'0h, yes.
Patches look good then.
Acked-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
| |