]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
sched_ext: Guard BPF arena helper calls to fix 32-bit build
authorTejun Heo <tj@kernel.org>
Sun, 31 May 2026 18:01:47 +0000 (08:01 -1000)
committerTejun Heo <tj@kernel.org>
Sun, 31 May 2026 18:01:47 +0000 (08:01 -1000)
BPF arena (kernel/bpf/arena.c) is compiled only on MMU && 64BIT, while
SCHED_CLASS_EXT depends on BPF_SYSCALL && BPF_JIT && DEBUG_INFO_BTF with no
64BIT requirement. On a 32-bit arch with a BPF JIT, SCX builds while the
arena helpers are absent, so the cid-form code's unconditional calls to
bpf_prog_arena() and bpf_arena_map_kern_vm_start() fail to link:

  build_policy.o: undefined reference to `bpf_prog_arena'
  build_policy.o: undefined reference to `bpf_arena_map_kern_vm_start'

Guard the three call sites with the same MMU && 64BIT condition that gates
arena.o. A cid-form scheduler needs a BPF arena, which isn't available on
such builds, so it can't run there regardless. cpu-form schedulers don't
touch the arena and are unaffected.

This is a quick workaround to get past the build errors. A fuller fix may
make the whole cid-form path conditional on the same condition, or drop
32-bit support outright.

Fixes: 0e2819cba977 ("sched_ext: Require an arena for cid-form schedulers")
Reported-by: kernel test robot <lkp@intel.com>
Closes: https://lore.kernel.org/oe-kbuild-all/202605310454.U9iByL2n-lkp@intel.com/
Closes: https://lore.kernel.org/oe-kbuild-all/202605310926.APXMc0RJ-lkp@intel.com/
Signed-off-by: Tejun Heo <tj@kernel.org>
kernel/sched/ext.c
kernel/sched/ext_arena.c

index 83272acf176371de29db5d2485f6fbdde6c2e1fe..32ebbc351564a287a56f53f6e536a5b05ddfdcac 100644 (file)
@@ -622,8 +622,12 @@ static inline void scx_call_op_set_cpumask(struct scx_sched *sch, struct rq *rq,
 
        if (scx_is_cid_type()) {
                struct scx_cmask *kern_va = *this_cpu_ptr(sch->set_cmask_scratch);
-               unsigned long uaddr = (unsigned long)kern_va -
-                       bpf_arena_map_kern_vm_start(sch->arena_map);
+               unsigned long uaddr = (unsigned long)kern_va;
+
+               /* arena.o, which defines these, is built only on MMU && 64BIT */
+#if defined(CONFIG_MMU) && defined(CONFIG_64BIT)
+               uaddr -= bpf_arena_map_kern_vm_start(sch->arena_map);
+#endif
                /*
                 * Build the per-CPU arena cmask and hand BPF the uaddr. Caller
                 * holds the rq lock with IRQs disabled, which makes us the sole
@@ -7992,8 +7996,12 @@ struct scx_arena_scan {
 static int scx_arena_scan_prog(struct bpf_prog *prog, void *data)
 {
        struct scx_arena_scan *s = data;
-       struct bpf_map *arena = bpf_prog_arena(prog);
+       struct bpf_map *arena = NULL;
 
+       /* arena.o, which defines these, is built only on MMU && 64BIT */
+#if defined(CONFIG_MMU) && defined(CONFIG_64BIT)
+       arena = bpf_prog_arena(prog);
+#endif
        if (!arena)
                return 0;
        if (s->arena && s->arena != arena) {
index b413e155ba6b15f5705ad195738dcf147cad75f2..493c2424f8429be759f6fabc2bc644ac2389a210 100644 (file)
@@ -80,7 +80,12 @@ static int scx_arena_grow(struct scx_sched *sch, u32 page_cnt)
                return -ENOMEM;
 
        uaddr32 = (u32)(unsigned long)p;
+       /* arena.o, which defines these, is built only on MMU && 64BIT */
+#if defined(CONFIG_MMU) && defined(CONFIG_64BIT)
        kern_vm_start = bpf_arena_map_kern_vm_start(sch->arena_map);
+#else
+       kern_vm_start = 0;
+#endif
 
        ret = gen_pool_add(sch->arena_pool, kern_vm_start + uaddr32,
                           page_cnt * PAGE_SIZE, NUMA_NO_NODE);