Some task misfit cases can be handled directly by the push mecanism
instead of triggering an idle load balance to pull the task on a better
CPU.
Signed-off-by: Vincent Guittot <vincent.guittot@linaro.org>
---
kernel/sched/fair.c | 38 +++++++++++++++++++++++++-------------
1 file changed, 25 insertions(+), 13 deletions(-)
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
index c3e383b86808..21bd62cf138c 100644
--- a/kernel/sched/fair.c
+++ b/kernel/sched/fair.c
@@ -8508,6 +8508,8 @@ static int find_energy_efficient_cpu(struct task_struct *p, int prev_cpu)
target_stat.runnable = cpu_runnable(cpu_rq(cpu));
target_stat.capa = capacity_of(cpu);
target_stat.nr_running = cpu_rq(cpu)->cfs.h_nr_runnable;
+ if ((p->on_rq) && (!p->se.sched_delayed) && (cpu == prev_cpu))
+ target_stat.nr_running--;
/* If the target needs a lower OPP, then look up for
* the corresponding OPP and its associated cost.
@@ -8613,6 +8615,9 @@ static inline bool sched_energy_push_task(struct task_struct *p, struct rq *rq)
if (p->nr_cpus_allowed == 1)
return false;
+ if (!task_fits_cpu(p, cpu_of(rq)))
+ return true;
+
if (is_rd_overutilized(rq->rd))
return false;
@@ -8624,33 +8629,33 @@ static inline bool sched_energy_push_task(struct task_struct *p, struct rq *rq)
static int active_load_balance_cpu_stop(void *data);
-static inline void check_pushable_task(struct task_struct *p, struct rq *rq)
+static inline bool check_pushable_task(struct task_struct *p, struct rq *rq)
{
int new_cpu, cpu = cpu_of(rq);
if (!sched_energy_enabled())
- return;
+ return false;
if (WARN_ON(!p))
- return;
+ return false;
if (WARN_ON(!task_current(rq, p)))
- return;
+ return false;
if (is_migration_disabled(p))
- return;
+ return false;
/* If there are several task, wait for being put back */
if (rq->nr_running > 1)
- return;
+ return false;
if (!sched_energy_push_task(p, rq))
- return;
+ return false;
new_cpu = find_energy_efficient_cpu(p, cpu);
if (new_cpu == cpu)
- return;
+ return false;
/*
* ->active_balance synchronizes accesses to
@@ -8661,13 +8666,15 @@ static inline void check_pushable_task(struct task_struct *p, struct rq *rq)
rq->active_balance = 1;
rq->push_cpu = new_cpu;
} else
- return;
+ return false;
raw_spin_rq_unlock(rq);
stop_one_cpu_nowait(cpu,
active_load_balance_cpu_stop, rq,
&rq->active_balance_work);
raw_spin_rq_lock(rq);
+
+ return true;
}
static inline int has_pushable_tasks(struct rq *rq)
@@ -8952,7 +8959,11 @@ balance_fair(struct rq *rq, struct task_struct *prev, struct rq_flags *rf)
return sched_balance_newidle(rq, rf) != 0;
}
#else
-static inline void check_pushable_task(struct task_struct *p, struct rq *rq) {}
+static inline bool check_pushable_task(struct task_struct *p, struct rq *rq)
+{
+ return false
+}
+
static inline void fair_queue_pushable_tasks(struct rq *rq) {}
static void fair_remove_pushable_task(struct rq *rq, struct task_struct *p) {}
static inline void fair_add_pushable_task(struct rq *rq, struct task_struct *p) {}
@@ -13362,9 +13373,10 @@ static void task_tick_fair(struct rq *rq, struct task_struct *curr, int queued)
if (static_branch_unlikely(&sched_numa_balancing))
task_tick_numa(rq, curr);
- check_pushable_task(curr, rq);
- update_misfit_status(curr, rq);
- check_update_overutilized_status(task_rq(curr));
+ if (!check_pushable_task(curr, rq)) {
+ update_misfit_status(curr, rq);
+ check_update_overutilized_status(task_rq(curr));
+ }
task_tick_core(rq, curr);
}
--
2.43.0
Hi Vincent,
kernel test robot noticed the following build errors:
[auto build test ERROR on tip/sched/core]
[also build test ERROR on peterz-queue/sched/core linus/master v6.14-rc4 next-20250228]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Vincent-Guittot/sched-fair-Filter-false-overloaded_group-case-for-EAS/20250303-001556
base: tip/sched/core
patch link: https://lore.kernel.org/r/20250302161321.1476139-7-vincent.guittot%40linaro.org
patch subject: [PATCH 6/7 v4] sched/fair: Add misfit case to push task mecanism for EAS
config: riscv-randconfig-002-20250303 (https://download.01.org/0day-ci/archive/20250303/202503030443.zgft6lMb-lkp@intel.com/config)
compiler: riscv32-linux-gcc (GCC) 14.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250303/202503030443.zgft6lMb-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202503030443.zgft6lMb-lkp@intel.com/
All errors (new ones prefixed by >>):
kernel/sched/fair.c: In function 'check_pushable_task':
>> kernel/sched/fair.c:8964:21: error: expected ';' before '}' token
8964 | return false
| ^
| ;
8965 | }
| ~
vim +8964 kernel/sched/fair.c
8952
8953 static int
8954 balance_fair(struct rq *rq, struct task_struct *prev, struct rq_flags *rf)
8955 {
8956 if (sched_fair_runnable(rq))
8957 return 1;
8958
8959 return sched_balance_newidle(rq, rf) != 0;
8960 }
8961 #else
8962 static inline bool check_pushable_task(struct task_struct *p, struct rq *rq)
8963 {
> 8964 return false
8965 }
8966
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
© 2016 - 2026 Red Hat, Inc.