Messages in this thread Patch in this message | | | From | Konstantin Khorenko <> | Subject | [PATCH] sched/fair: Do not scan non-movable tasks several times | Date | Thu, 14 Dec 2023 17:42:04 +0300 |
| |
If busiest rq is small, nr_running < SCHED_NR_MIGRATE_BREAK and all tasks are not movable, detach_tasks() should not iterate more than tasks available in the busiest rq.
Previously the (env->loop > env->loop_max) condition prevented us from scanning non-movable tasks more than rq size times, but after we start checking the LBF_ALL_PINNED flag, the "all tasks are not movable" case is under threat.
Signed-off-by: Konstantin Khorenko <khorenko@virtuozzo.com> --- kernel/sched/fair.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index d7a3c63a2171..faa2a765e899 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c @@ -11219,7 +11219,6 @@ static int load_balance(int this_cpu, struct rq *this_rq, .dst_rq = this_rq, .dst_grpmask = group_balance_mask(sd->groups), .idle = idle, - .loop_break = SCHED_NR_MIGRATE_BREAK, .cpus = cpus, .fbq_type = all, .tasks = LIST_HEAD_INIT(env.tasks), @@ -11265,6 +11264,12 @@ static int load_balance(int this_cpu, struct rq *this_rq, * correctly treated as an imbalance. */ env.loop_max = min(sysctl_sched_nr_migrate, busiest->nr_running); + /* + * If busiest rq is small, nr_running < SCHED_NR_MIGRATE_BREAK + * and all tasks are not movable, detach_tasks() should not + * iterate more than tasks available in rq. + */ + env.loop_break = min(SCHED_NR_MIGRATE_BREAK, busiest->nr_running); more_balance: rq_lock_irqsave(busiest, &rf); -- 2.39.3
| |