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.

Reply via email to