-/* Take timers from level and distribute them down one. */
-static void cascade(struct timers *timers, unsigned int level)
-{
- struct timer *i;
- struct list_head from_far, *list;
-
- if (level == ARRAY_SIZE(timers->level) || !timers->level[level]) {
- list_head_init(&from_far);
- timers_far_get(timers, &from_far,
- timers->base
- + (1ULL << (level*TIMER_LEVEL_BITS))-1);
- list = &from_far;
- if (level != ARRAY_SIZE(timers->level))
- add_level(timers, level);
- } else {
- unsigned src;
-
- src = (timers->base >> (level * TIMER_LEVEL_BITS)) % PER_LEVEL;
- if (src == 0)
- cascade(timers, level + 1);
- list = &timers->level[level]->list[src];
- }
-
- while ((i = list_pop(list, struct timer, list)) != NULL) {
- unsigned dst;
-
- assert(i->time >= timers->base);
- assert(i->time < (timers->base
- + (1ULL << ((level+1)*TIMER_LEVEL_BITS))));
-
- dst = (i->time >> ((level-1)*TIMER_LEVEL_BITS)) % PER_LEVEL;
- list_add_tail(&timers->level[level-1]->list[dst], &i->list);
- }
-}
-