Messages in this thread | | | Date | Wed, 19 Apr 2017 11:53:01 +0200 | From | Peter Zijlstra <> | Subject | Re: [patch V2 08/10] timer: Implement the hierarchical pull model |
| |
On Wed, Apr 19, 2017 at 11:44:45AM +0200, Peter Zijlstra wrote: > On Wed, Apr 19, 2017 at 11:09:14AM +0200, Peter Zijlstra wrote: > > > Would it be very onerous to rewrite that into regular loops? That avoids > > us having to think (and worry) about blowing our stack. > > void walk_groups(bool (*up)(void *), void (*down)(void *), void *data) > { > struct tmigr_cpu *tmc = this_cpu_ptr(&tmigr_cpu); > struct group *stack[tmigr_hierarchy_levels]; > struct group *group = tmc->group; > int i = 0; > > raw_spin_lock(&tmc->lock); > > do { > stack[i++] = group; > > if (up(data)) > break; > > } while ((group = group->parent)); > > do { > group = stack[--i]; > > down(data); > > } while (group != tmc->group); > > raw_spin_unlock(&tmc->lock); > } > > Something like so, iterates the hierarchy for the current CPU and calls > @up and @down at each level in the proper order. And has obvious stack > usage.
I should, of course, have added @group as an argument to @up,@down. Otherwise its a bit hard for them to know what to do.
| |