On Wed, Sep 09, 2026 at 07:26:13PM +0530, Shrikanth Hegde wrote:
> Add a new stat,
> - nr_migrations_cpu_non_preferred: number of migrations happened since
>   a CPU was marked as non preferred due to high steal time.
> 
> Signed-off-by: Shrikanth Hegde <[email protected]>
> ---
>  include/linux/sched.h | 1 +
>  kernel/sched/core.c   | 9 +++++++--
>  kernel/sched/debug.c  | 1 +
>  3 files changed, 9 insertions(+), 2 deletions(-)
> 
> diff --git a/include/linux/sched.h b/include/linux/sched.h
> index d7cc77181ef9..48639b0c75d0 100644
> --- a/include/linux/sched.h
> +++ b/include/linux/sched.h
> @@ -554,6 +554,7 @@ struct sched_statistics {
>       u64                             nr_failed_migrations_running;
>       u64                             nr_failed_migrations_hot;
>       u64                             nr_forced_migrations;
> +     u64                             nr_migrations_cpu_non_preferred;
>  
>       u64                             nr_wakeups;
>       u64                             nr_wakeups_sync;
> diff --git a/kernel/sched/core.c b/kernel/sched/core.c
> index 458b8c6fd9af..fb8404bd47e2 100644
> --- a/kernel/sched/core.c
> +++ b/kernel/sched/core.c
> @@ -11239,8 +11239,13 @@ static int sched_non_preferred_cpu_push_stop(void 
> *arg)
>       context_unsafe_alias(rq);
>  
>       if (task_rq(p) == rq && task_on_rq_queued(p) &&
> -         !is_migration_disabled(p))
> -             rq = __migrate_task(rq, &rf, p, cpu);
> +         !is_migration_disabled(p)) {
> +             struct rq *dest_rq = __migrate_task(rq, &rf, p, cpu);
> +
> +             if (rq != dest_rq)
> +                     schedstat_inc(p->stats.nr_migrations_cpu_non_preferred);
> +             rq = dest_rq;
> +     }
>  
>       rq_unlock(rq, &rf);
>       raw_spin_unlock_irq(&p->pi_lock);
> diff --git a/kernel/sched/debug.c b/kernel/sched/debug.c
> index fda10b3fa249..e6a3b516c703 100644
> --- a/kernel/sched/debug.c
> +++ b/kernel/sched/debug.c
> @@ -1440,6 +1440,7 @@ void proc_sched_show_task(struct task_struct *p, struct 
> pid_namespace *ns,
>               P_SCHEDSTAT(nr_failed_migrations_running);
>               P_SCHEDSTAT(nr_failed_migrations_hot);
>               P_SCHEDSTAT(nr_forced_migrations);
> +             P_SCHEDSTAT(nr_migrations_cpu_non_preferred);
>               P_SCHEDSTAT(nr_wakeups);
>               P_SCHEDSTAT(nr_wakeups_sync);
>               P_SCHEDSTAT(nr_wakeups_migrate);

Should we not also bump the schedstat version? I forgot the rules, but
you do change the output. And did we ever merge that perf schedstat
thing, then that probably needs 'fixing' for the new format too.

Reply via email to