On Tue, Apr 25, 2006 at 09:04:41AM +1000, Peter Williams wrote:Looks like there's a NOT missing doesn't it. So there is an error but I don't think that your patch is the right way to fix it. We just need to negate the above assignment. E.g.
skip_for_load = !(busiest_best_prio_seen || idx != busiest_best_prio);
or
skip_for_load = !busiest_best_prio_seen && idx == busiest_best_prio;
whichever is more efficient.
That just will not be enough. busiest_best_prio needs to be set to '1'
whenever we skip the first best priority task(not whenever we move it)
And we also need to initialize busiest_best_prio_seen inside this check.
(like in my patch)
if (busiest->expired->nr_active) {
And we need to reset busiest_best_prio_seen to '0' whenever we finished
the checking of expired list (and move onto active list) and there are
no best prio tasks on expired list..
@@ -2072,6 +2067,13 @@ static int move_tasks(runqueue_t *this_rThis is a pretty bold assertion. How do we know that this is true.
if (busiest->expired->nr_active) {
array = busiest->expired;
dst_array = this_rq->expired;
+ /*
+ * We already have one or more busiest best prio tasks on
+ * active list.
That comment refers to when 'busiest_best_prio_seen' is initialized to '1'.
Comment needs to be fixed.