В Чт, 24/07/2014 в 17:04 -0700, Tim Chen пишет: > On Tue, 2014-07-22 at 15:30 +0400, Kirill Tkhai wrote: > > Bad situation: > > > > double_lock_balance() drops busiest_rq lock. The busiest_rq is *busiest*, > > and a lot of tasks and context switches there. We are dropping the lock > > and waiting for it again. > > > > Let's just detach the task and once finally unlock it! > > > > Warning: this admits unlocked using of can_migrate_task(), > > throttled_lb_pair(), > > and task_hot(). I added comments about that. > > > > Wonder if we should also consider removing double_lock_balance usage > from rt.c and deadline.c? Then those two schedulers will also not > lock both the source and destination queues at the same time > for load balancing.
rt.c and deadline.c are similar, so we are able to discuss about one of them. There are two places with double_lock_balance() in rt.c: 1)push_rt_task()->find_lock_lowest_rq() We can't detach a task before we are locked lowest_rq. It's unknown whether it will still be suitable to be attached to lowest_rq after we are locked it, because the highest prioriry of lowest_rq may change. We have the race there. 2)pull_rt_task() The same with here. The situation may change. We must keep both locks locked to be sure the priorities won't change. For example, somebody may wake a high priority task on src_rq, or somebody can pull a task there. RT balancing is stricter than fair's.. Regards, Kirill -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/