Messages in this thread Patch in this message | | | Date | Sun, 24 Apr 2005 18:09:57 +0200 | From | Eric Piel <> | Subject | [PATCH] small load-balancer clean-up in move_tasks() |
| |
Hello,
Here is a small clean-up which changes some goto's into loops for move_tasks(). It makes the code a bit easier to read (the two loops are explicit now) and it also reduces the number of lines. I've checked the patch on x86 and IA-64 (with 4 processors).
Concerning the size of the binary, on x86, depending on the options, it can be one instruction (4 bytes) bigger to one instruction smaller. On IA-64, it suprisingly saves 4 instructions (64 bytes) most of the time.
This patch was done for 2.6.12-rc1 but should apply against 2.6.12-rc3 cleanly. It's quite trivial and makes the clode cleaner, please apply.
Eric Piel
--
Small clean-up of move_tasks(). Converts the goto's into two eplicit loops.
Signed-off-by: Eric Piel <eric.piel@tremplin-utc.net> --- linux-2.6.12-rc1/kernel/sched.c.bak 2005-04-03 00:21:07.000000000 +0200 +++ linux-2.6.12-rc1/kernel/sched.c 2005-04-03 01:08:28.000000000 +0200 @@ -1695,50 +1695,37 @@ static int move_tasks(runqueue_t *this_r new_array: /* Start searching at priority 0: */ - idx = 0; -skip_bitmap: - if (!idx) - idx = sched_find_first_bit(array->bitmap); - else - idx = find_next_bit(array->bitmap, MAX_PRIO, idx); - if (idx >= MAX_PRIO) { - if (array == busiest->expired && busiest->active->nr_active) { - array = busiest->active; - dst_array = this_rq->active; - goto new_array; - } - goto out; - } - - head = array->queue + idx; - curr = head->prev; -skip_queue: - tmp = list_entry(curr, task_t, run_list); - - curr = curr->prev; - - if (!can_migrate_task(tmp, busiest, this_cpu, sd, idle)) { - if (curr != head) - goto skip_queue; - idx++; - goto skip_bitmap; - } + for (idx = sched_find_first_bit(array->bitmap); + idx < MAX_PRIO; + idx = find_next_bit(array->bitmap, MAX_PRIO, idx + 1)) { + head = array->queue + idx; + for (curr = head->prev; + curr != head; ) { + tmp = list_entry(curr, task_t, run_list); + + curr = curr->prev; + + if (!can_migrate_task(tmp, busiest, this_cpu, sd, idle)) + continue; #ifdef CONFIG_SCHEDSTATS - if (task_hot(tmp, busiest->timestamp_last_tick, sd)) - schedstat_inc(sd, lb_hot_gained[idle]); + if (task_hot(tmp, busiest->timestamp_last_tick, sd)) + schedstat_inc(sd, lb_hot_gained[idle]); #endif - pull_task(busiest, array, tmp, this_rq, dst_array, this_cpu); - pulled++; + pull_task(busiest, array, tmp, this_rq, dst_array, this_cpu); + pulled++; - /* We only want to steal up to the prescribed number of tasks. */ - if (pulled < max_nr_move) { - if (curr != head) - goto skip_queue; - idx++; - goto skip_bitmap; + /* We only want to steal up to the prescribed number of tasks. */ + if (pulled >= max_nr_move) + goto out; + } } + if (array == busiest->expired && busiest->active->nr_active) { + array = busiest->active; + dst_array = this_rq->active; + goto new_array; + } out: /* * Right now, this is the only place pull_task() is called, | |