Files
linux/include/linux
Hui Su ed54bf564a bpf: Fix BPF_F_CPU validation for sparse CPU IDs
BPF_F_CPU stores the target CPU ID in the upper 32 bits of the map
operation flags. bpf_map_check_op_flags() currently compares that ID
with num_possible_cpus(), which is the number of possible CPUs rather
than a bound on CPU IDs.

On an arm64 QEMU guest with a CPU device-tree hole, the possible CPU
mask was 0,2-3. A userspace program using raw bpf() syscalls creates
a BPF_MAP_TYPE_PERCPU_ARRAY and performs update and lookup operations
for each CPU by setting BPF_F_CPU and the CPU ID in the flags.

With the old check, CPU 1 is incorrectly accepted while valid CPU 3 is
rejected with -ERANGE. The CPU 1 update then reaches the per-CPU map
access path and triggers:

  Unable to handle kernel paging request at virtual address ...
  pc : __pi_memcpy_generic+0x5c/0x22c
  lr : bpf_percpu_array_update+0x2dc/0x2e8
  Call trace:
    __pi_memcpy_generic
    bpf_map_update_value
    map_update_elem
    __sys_bpf

Check the CPU ID against nr_cpu_ids and cpu_possible() instead. This
rejects CPU IDs outside the valid range and CPUs absent from the
possible mask, while allowing valid sparse CPU IDs.

Fixes: 2b421662c7 ("bpf: Introduce BPF_F_CPU and BPF_F_ALL_CPUS flags")
Signed-off-by: Hui Su <sh_def@163.com>
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Acked-by: Leon Hwang <leon.hwang@linux.dev>
Link: https://lore.kernel.org/bpf/20260813160858.1042834-3-sh_def@163.com
2026-08-21 10:41:11 -07:00
..
2026-07-23 10:24:12 -07:00
2026-08-07 14:18:13 -03:00
2026-04-02 15:52:49 +02:00
2026-05-21 13:04:42 +02:00
2026-03-19 23:55:27 +01:00
2026-05-28 21:24:54 -07:00
2026-08-10 18:00:47 +01:00
2026-07-29 17:54:58 -07:00
2026-04-03 16:53:50 -04:00
2026-06-29 10:31:53 +02:00
2026-08-15 23:36:18 +02:00
2026-06-07 10:03:01 -07:00
2026-07-27 16:25:34 +02:00
2026-06-30 10:56:52 +02:00
2026-07-07 15:10:48 -04:00
2026-05-28 17:45:46 -07:00
2026-07-09 15:48:53 -07:00
2026-06-05 00:34:55 -04:00
2026-05-18 11:16:29 +02:00
2026-05-19 17:26:07 +02:00
2026-05-28 11:36:59 -04:00
2026-04-07 17:38:07 +02:00
2026-02-27 16:40:16 +01:00
2026-06-05 17:46:17 -07:00
2026-05-28 21:24:43 -07:00
2026-06-10 10:42:55 -04:00
2026-04-05 13:53:28 -07:00
2026-04-01 10:19:41 +02:00
2026-07-31 10:09:12 +02:00
2026-04-03 16:53:50 -04:00
2026-03-18 09:59:57 +00:00
2026-04-05 13:53:00 -07:00
2026-03-08 11:06:53 +01:00
2026-07-23 15:42:48 +02:00
2026-08-12 16:24:26 +02:00
2026-06-26 22:18:34 -04:00
2026-03-27 07:35:05 -07:00
2026-04-05 13:53:10 -07:00
2026-02-10 11:39:31 +01:00
2026-04-20 11:35:17 -07:00
2026-02-27 16:40:16 +01:00
2026-07-23 19:21:13 +01:00
2026-03-08 11:06:53 +01:00
2026-03-31 07:04:00 -06:00
2026-08-15 23:36:18 +02:00
2026-07-27 17:18:00 +02:00
2026-03-13 08:22:54 +01:00
2026-05-11 16:59:43 +02:00
2026-03-12 15:05:34 +01:00
2026-06-06 15:22:44 +02:00