sched-ext.lists.linux.dev archive mirror
 help / color / mirror / Atom feed
From: sashiko-bot@kernel.org
To: "Tejun Heo" <tj@kernel.org>
Cc: sched-ext@lists.linux.dev
Subject: Re: [PATCH 2/2] sched_ext: Sync common and compat headers from the scx repo
Date: Tue, 18 Aug 2026 21:07:32 +0000	[thread overview]
Message-ID: <20260818210732.AB27B1F000E9@smtp.kernel.org> (raw)
In-Reply-To: <20260818205711.3175265-3-tj@kernel.org>

Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:
- [High] The default value of `__scx_prolog_disables_migration` contradicts its safety documentation and causes dangerous under-reporting.
- [High] Missing ksym guard for `scx_bpf_cpu_rq` causes BPF program load failure on newer kernels.
--

--- Patch [2]: [PATCH 2/2] sched_ext: Sync common and compat headers from the scx repo ---
commit d5556fe1c132d0cef0267d7ea8593fa9b725e9e6
Author: Tejun Heo <tj@kernel.org>

sched_ext: Sync common and compat headers from the scx repo

Sync common.bpf.h, compat.bpf.h and compat.h with the scx repo. This 
includes updates to 64-bit enum recovery, is_migration_disabled() logic, 
and backwards compatibility for scx_bpf_cpu_curr and scx_bpf_cpu_rq.

Link: https://lore.kernel.org/all/20260817143126.562923-1-changwoo@igalia.com

> diff --git a/tools/sched_ext/include/scx/common.bpf.h b/tools/sched_ext/include/scx/common.bpf.h
> index 979d4cabfaf98..76f5e025e1076 100644
> --- a/tools/sched_ext/include/scx/common.bpf.h
> +++ b/tools/sched_ext/include/scx/common.bpf.h

[ ... ]

> @@ -527,32 +529,103 @@ static __always_inline const struct cpumask *cast_mask(struct bpf_cpumask *mask)
>  	return (const struct cpumask *)mask;
>  }
>  
> +/*
> + * True if the non-sleepable BPF trampoline prolog (__bpf_prog_enter) calls
> + * migrate_disable() for the current task. Recorded once by
> + * scx_lib_init_probe, an fentry program on bpf_scx_reg() that fires during
> + * the natural scheduler-attach call chain (auto-attached by scx_ops_attach!).
> + *
> + * Defaults to true (conservative). Over-reporting in is_migration_disabled()
> + * causes local-only dispatch, which is safe. Under-reporting can crash the
> + * scheduler, so we err high if the probe somehow fails to run.
> + */
> +bool __scx_prolog_disables_migration __weak = true;

[Severity: High]
Does this default value actually under-report if the probe fails to run?

The documentation indicates that the fallback should err high (over-report)
to avoid crashing the scheduler. However, looking at the slow path in
is_migration_disabled() below, when __scx_prolog_disables_migration is true,
the macro evaluates bpf_get_current_task_btf() != p. This causes it to
return false for the current task, which means it incorrectly assumes
migration is not disabled (under-reporting).

Should the default value of __scx_prolog_disables_migration be false
instead, so that it falls back to returning true?

> +
> +/*
> + * scx_lib_init_probe - non-sleepable prolog probe.

[ ... ]

>  static inline bool is_migration_disabled(const struct task_struct *p)
>  {

[ ... ]

> +	if (bpf_core_field_exists(p->migration_disabled)) {
> -		if (p->migration_disabled == 1)
> -			return bpf_get_current_task_btf() != p;
> -		else
> -			return p->migration_disabled;
> +		if (p->migration_disabled == 1) {
> +			/* Fast path: prolog always disables migration */
> +			if (CONFIG_PREEMPT_RCU)
> +				return bpf_get_current_task_btf() != p;
> +			/* Fast path: prolog never disables migration */
> +			if (LINUX_KERNEL_VERSION >= KERNEL_VERSION(6, 18, 0))
> +				return true;
> +			/* Slow path: pre-v6.18, !PREEMPT_RCU - use runtime flag */
> +			return __scx_prolog_disables_migration ?
> +			       bpf_get_current_task_btf() != p : true;
> +		}
> +		return p->migration_disabled;
>  	}
>  	return false;
>  }

[ ... ]

> diff --git a/tools/sched_ext/include/scx/compat.bpf.h b/tools/sched_ext/include/scx/compat.bpf.h
> index 3ab642f92c8a5..6944221f96cc0 100644
> --- a/tools/sched_ext/include/scx/compat.bpf.h
> +++ b/tools/sched_ext/include/scx/compat.bpf.h

[ ... ]

> @@ -238,6 +243,26 @@ static inline bool __COMPAT_is_enq_cpu_selected(u64 enq_flags)
>  	 scx_bpf_pick_any_cpu_node(cpus_allowed, node, flags) :			\
>  	 scx_bpf_pick_any_cpu(cpus_allowed, flags))
>  
> +/*
> + * v6.18: Add a helper to retrieve the current task running on a CPU.
> + *
> + * The kernel tree dropped this helper and scx_bpf_cpu_rq(), but schedulers in
> + * this tree still support pre-v6.18 kernels where scx_bpf_cpu_curr() doesn't
> + * resolve and the scx_bpf_cpu_rq() fallback still exists. Keep it until
> + * pre-v6.18 kernels fall out of the support window.
> + */
> +static inline struct task_struct *__COMPAT_scx_bpf_cpu_curr(int cpu)
> +{
> +	struct rq *rq;
> +
> +	if (bpf_ksym_exists(scx_bpf_cpu_curr))
> +		return scx_bpf_cpu_curr(cpu);
> +
> +	rq = scx_bpf_cpu_rq(cpu);

[Severity: High]
Will this unconditionally call scx_bpf_cpu_rq() on newer kernels?

If both scx_bpf_cpu_curr and scx_bpf_cpu_rq have been dropped from the kernel
tree, on modern kernels bpf_ksym_exists(scx_bpf_cpu_curr) evaluates to false
and the fallback path is taken.

Because the call to scx_bpf_cpu_rq() is not guarded by its own
bpf_ksym_exists() check, won't libbpf poison the missing call and cause the
BPF verifier to reject the program on newer kernels? Should we guard the
fallback call as well?

> +
> +	return rq ? rq->curr : NULL;
> +}

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20260818205711.3175265-1-tj@kernel.org?part=2

  reply	other threads:[~2026-08-18 21:07 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-08-18 20:57 [PATCHSET sched_ext/for-7.3-fixes] sched_ext: Sync tools headers from the scx repo Tejun Heo
2026-08-18 20:57 ` [PATCH 1/2] sched_ext: Sync tools autogen enum " Tejun Heo
2026-08-18 20:57 ` [PATCH 2/2] sched_ext: Sync common and compat " Tejun Heo
2026-08-18 21:07   ` sashiko-bot [this message]
2026-08-18 21:33     ` Tejun Heo

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20260818210732.AB27B1F000E9@smtp.kernel.org \
    --to=sashiko-bot@kernel.org \
    --cc=sashiko-reviews@lists.linux.dev \
    --cc=sched-ext@lists.linux.dev \
    --cc=tj@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).