Commit 59846988 authored by Rusty Russell's avatar Rusty Russell

timer: put level-0 optimization directly into find_first.

Signed-off-by: default avatarRusty Russell <rusty@rustcorp.com.au>
parent 08dac128
...@@ -131,7 +131,10 @@ static void add_level(struct timers *timers, unsigned int level) ...@@ -131,7 +131,10 @@ static void add_level(struct timers *timers, unsigned int level)
timer_add_raw(timers, t); timer_add_raw(timers, t);
} }
/* We don't need to search past the first at level 0, since the
* bucket range is 1; they're all the same. */
static const struct timer *find_first(const struct list_head *list, static const struct timer *find_first(const struct list_head *list,
unsigned int level,
const struct timer *prev) const struct timer *prev)
{ {
struct timer *t; struct timer *t;
...@@ -139,6 +142,8 @@ static const struct timer *find_first(const struct list_head *list, ...@@ -139,6 +142,8 @@ static const struct timer *find_first(const struct list_head *list,
list_for_each(list, t, list) { list_for_each(list, t, list) {
if (!prev || t->time < prev->time) if (!prev || t->time < prev->time)
prev = t; prev = t;
if (level == 0)
break;
} }
return prev; return prev;
} }
...@@ -162,7 +167,7 @@ static const struct timer *get_first(const struct timers *timers) ...@@ -162,7 +167,7 @@ static const struct timer *get_first(const struct timers *timers)
next: next:
if (!timers->level[level]) if (!timers->level[level])
return find_first(&timers->far, NULL); return find_first(&timers->far, -1U, NULL);
need_next = false; need_next = false;
off = base % PER_LEVEL; off = base % PER_LEVEL;
...@@ -188,15 +193,12 @@ next: ...@@ -188,15 +193,12 @@ next:
} }
/* Level 0 is exact, so they're all the same. */ /* Level 0 is exact, so they're all the same. */
if (level == 0) found = find_first(h, level, NULL);
found = list_top(h, struct timer, list);
else
found = find_first(h, NULL);
while (need_next) { while (need_next) {
need_next = false; need_next = false;
if (!timers->level[level+1]) { if (!timers->level[level+1]) {
found = find_first(&timers->far, found); found = find_first(&timers->far, -1U, found);
} else { } else {
/* Current upper bucket has emptied into this /* Current upper bucket has emptied into this
* bucket; we want *next* one. */ * bucket; we want *next* one. */
...@@ -208,7 +210,7 @@ next: ...@@ -208,7 +210,7 @@ next:
need_next = true; need_next = true;
} else { } else {
h = &timers->level[level+1]->list[off]; h = &timers->level[level+1]->list[off];
found = find_first(h, found); found = find_first(h, level+1, found);
} }
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment