small load-balancer clean-up in move_tasks()
PATCH 1/1 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.
kernel/sched.c renamed from kernel/sched.c.bak +25 -38
@@ -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,