Messages in this thread Patch in this message | | | Subject | Re: [patch 1/2] sched, timers: move calc_load() to scheduler | From | Peter Zijlstra <> | Date | Thu, 14 May 2009 22:00:27 +0200 |
| |
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?
| |