* [PATCH bpf-next v2 0/2] bpf: cpumap: improve error propagation in cpu_map_update_elem()
@ 2025-12-08 13:14 Kohei Enju
2025-12-08 13:14 ` [PATCH bpf-next v2 1/2] bpf: cpumap: propagate underlying error " Kohei Enju
` (2 more replies)
0 siblings, 3 replies; 6+ messages in thread
From: Kohei Enju @ 2025-12-08 13:14 UTC (permalink / raw)
To: netdev, bpf, linux-kselftest
Cc: Alexei Starovoitov, Daniel Borkmann, David S. Miller,
Jakub Kicinski, Jesper Dangaard Brouer, John Fastabend,
Stanislav Fomichev, Andrii Nakryiko, Martin KaFai Lau,
Eduard Zingerman, Song Liu, Yonghong Song, KP Singh, Hao Luo,
Jiri Olsa, Shuah Khan, Toke Høiland-Jørgensen,
kohei.enju, Kohei Enju
This series improves error propagation in cpumap and adds selftests that
cover the failure cases.
Currently, failures returned from __cpu_map_entry_alloc() are ignored
and always converted to -ENOMEM by cpu_map_update_elem(). This series
ensures the correct error propagation and adds selftests.
Changes:
v2:
- send to bpf-next, not to bpf
- drop Fixes: tag
v1: https://lore.kernel.org/bpf/20251128160504.57844-1-enjuk@amazon.com/
Kohei Enju (2):
bpf: cpumap: propagate underlying error in cpu_map_update_elem()
selftests/bpf: add tests for attaching invalid fd
kernel/bpf/cpumap.c | 21 ++++++++++++-------
.../bpf/prog_tests/xdp_cpumap_attach.c | 19 +++++++++++++++--
2 files changed, 30 insertions(+), 10 deletions(-)
--
2.51.0
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH bpf-next v2 1/2] bpf: cpumap: propagate underlying error in cpu_map_update_elem()
2025-12-08 13:14 [PATCH bpf-next v2 0/2] bpf: cpumap: improve error propagation in cpu_map_update_elem() Kohei Enju
@ 2025-12-08 13:14 ` Kohei Enju
2025-12-08 14:19 ` Toke Høiland-Jørgensen
2025-12-08 13:14 ` [PATCH bpf-next v2 2/2] selftests/bpf: add tests for attaching invalid fd Kohei Enju
2025-12-10 8:00 ` [PATCH bpf-next v2 0/2] bpf: cpumap: improve error propagation in cpu_map_update_elem() patchwork-bot+netdevbpf
2 siblings, 1 reply; 6+ messages in thread
From: Kohei Enju @ 2025-12-08 13:14 UTC (permalink / raw)
To: netdev, bpf, linux-kselftest
Cc: Alexei Starovoitov, Daniel Borkmann, David S. Miller,
Jakub Kicinski, Jesper Dangaard Brouer, John Fastabend,
Stanislav Fomichev, Andrii Nakryiko, Martin KaFai Lau,
Eduard Zingerman, Song Liu, Yonghong Song, KP Singh, Hao Luo,
Jiri Olsa, Shuah Khan, Toke Høiland-Jørgensen,
kohei.enju, Kohei Enju
After commit 9216477449f3 ("bpf: cpumap: Add the possibility to attach
an eBPF program to cpumap"), __cpu_map_entry_alloc() may fail with
errors other than -ENOMEM, such as -EBADF or -EINVAL.
However, __cpu_map_entry_alloc() returns NULL on all failures, and
cpu_map_update_elem() unconditionally converts this NULL into -ENOMEM.
As a result, user space always receives -ENOMEM regardless of the actual
underlying error.
Examples of unexpected behavior:
- Nonexistent fd : -ENOMEM (should be -EBADF)
- Non-BPF fd : -ENOMEM (should be -EINVAL)
- Bad attach type : -ENOMEM (should be -EINVAL)
Change __cpu_map_entry_alloc() to return ERR_PTR(err) instead of NULL
and have cpu_map_update_elem() propagate this error.
Signed-off-by: Kohei Enju <enjuk@amazon.com>
---
kernel/bpf/cpumap.c | 21 +++++++++++++--------
1 file changed, 13 insertions(+), 8 deletions(-)
diff --git a/kernel/bpf/cpumap.c b/kernel/bpf/cpumap.c
index 703e5df1f4ef..04171fbc39cb 100644
--- a/kernel/bpf/cpumap.c
+++ b/kernel/bpf/cpumap.c
@@ -430,7 +430,7 @@ static struct bpf_cpu_map_entry *
__cpu_map_entry_alloc(struct bpf_map *map, struct bpf_cpumap_val *value,
u32 cpu)
{
- int numa, err, i, fd = value->bpf_prog.fd;
+ int numa, err = -ENOMEM, i, fd = value->bpf_prog.fd;
gfp_t gfp = GFP_KERNEL | __GFP_NOWARN;
struct bpf_cpu_map_entry *rcpu;
struct xdp_bulk_queue *bq;
@@ -440,7 +440,7 @@ __cpu_map_entry_alloc(struct bpf_map *map, struct bpf_cpumap_val *value,
rcpu = bpf_map_kmalloc_node(map, sizeof(*rcpu), gfp | __GFP_ZERO, numa);
if (!rcpu)
- return NULL;
+ return ERR_PTR(err);
/* Alloc percpu bulkq */
rcpu->bulkq = bpf_map_alloc_percpu(map, sizeof(*rcpu->bulkq),
@@ -468,16 +468,21 @@ __cpu_map_entry_alloc(struct bpf_map *map, struct bpf_cpumap_val *value,
rcpu->value.qsize = value->qsize;
gro_init(&rcpu->gro);
- if (fd > 0 && __cpu_map_load_bpf_program(rcpu, map, fd))
- goto free_ptr_ring;
+ if (fd > 0) {
+ err = __cpu_map_load_bpf_program(rcpu, map, fd);
+ if (err)
+ goto free_ptr_ring;
+ }
/* Setup kthread */
init_completion(&rcpu->kthread_running);
rcpu->kthread = kthread_create_on_node(cpu_map_kthread_run, rcpu, numa,
"cpumap/%d/map:%d", cpu,
map->id);
- if (IS_ERR(rcpu->kthread))
+ if (IS_ERR(rcpu->kthread)) {
+ err = PTR_ERR(rcpu->kthread);
goto free_prog;
+ }
/* Make sure kthread runs on a single CPU */
kthread_bind(rcpu->kthread, cpu);
@@ -503,7 +508,7 @@ __cpu_map_entry_alloc(struct bpf_map *map, struct bpf_cpumap_val *value,
free_percpu(rcpu->bulkq);
free_rcu:
kfree(rcpu);
- return NULL;
+ return ERR_PTR(err);
}
static void __cpu_map_entry_free(struct work_struct *work)
@@ -596,8 +601,8 @@ static long cpu_map_update_elem(struct bpf_map *map, void *key, void *value,
} else {
/* Updating qsize cause re-allocation of bpf_cpu_map_entry */
rcpu = __cpu_map_entry_alloc(map, &cpumap_value, key_cpu);
- if (!rcpu)
- return -ENOMEM;
+ if (IS_ERR(rcpu))
+ return PTR_ERR(rcpu);
}
rcu_read_lock();
__cpu_map_entry_replace(cmap, key_cpu, rcpu);
--
2.51.0
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH bpf-next v2 2/2] selftests/bpf: add tests for attaching invalid fd
2025-12-08 13:14 [PATCH bpf-next v2 0/2] bpf: cpumap: improve error propagation in cpu_map_update_elem() Kohei Enju
2025-12-08 13:14 ` [PATCH bpf-next v2 1/2] bpf: cpumap: propagate underlying error " Kohei Enju
@ 2025-12-08 13:14 ` Kohei Enju
2025-12-08 14:20 ` Toke Høiland-Jørgensen
2025-12-10 8:00 ` [PATCH bpf-next v2 0/2] bpf: cpumap: improve error propagation in cpu_map_update_elem() patchwork-bot+netdevbpf
2 siblings, 1 reply; 6+ messages in thread
From: Kohei Enju @ 2025-12-08 13:14 UTC (permalink / raw)
To: netdev, bpf, linux-kselftest
Cc: Alexei Starovoitov, Daniel Borkmann, David S. Miller,
Jakub Kicinski, Jesper Dangaard Brouer, John Fastabend,
Stanislav Fomichev, Andrii Nakryiko, Martin KaFai Lau,
Eduard Zingerman, Song Liu, Yonghong Song, KP Singh, Hao Luo,
Jiri Olsa, Shuah Khan, Toke Høiland-Jørgensen,
kohei.enju, Kohei Enju
Add test cases for situations where adding the following types of file
descriptors to a cpumap entry should fail:
- Non-BPF file descriptor (expect -EINVAL)
- Nonexistent file descriptor (expect -EBADF)
Also tighten the assertion for the expected error when adding a
non-BPF_XDP_CPUMAP program to a cpumap entry.
Signed-off-by: Kohei Enju <enjuk@amazon.com>
---
.../bpf/prog_tests/xdp_cpumap_attach.c | 19 +++++++++++++++++--
1 file changed, 17 insertions(+), 2 deletions(-)
diff --git a/tools/testing/selftests/bpf/prog_tests/xdp_cpumap_attach.c b/tools/testing/selftests/bpf/prog_tests/xdp_cpumap_attach.c
index df27535995af..ad56e4370ce3 100644
--- a/tools/testing/selftests/bpf/prog_tests/xdp_cpumap_attach.c
+++ b/tools/testing/selftests/bpf/prog_tests/xdp_cpumap_attach.c
@@ -18,7 +18,7 @@ static void test_xdp_with_cpumap_helpers(void)
struct bpf_cpumap_val val = {
.qsize = 192,
};
- int err, prog_fd, prog_redir_fd, map_fd;
+ int err, prog_fd, prog_redir_fd, map_fd, bad_fd;
struct nstoken *nstoken = NULL;
__u32 idx = 0;
@@ -79,7 +79,22 @@ static void test_xdp_with_cpumap_helpers(void)
val.qsize = 192;
val.bpf_prog.fd = bpf_program__fd(skel->progs.xdp_dummy_prog);
err = bpf_map_update_elem(map_fd, &idx, &val, 0);
- ASSERT_NEQ(err, 0, "Add non-BPF_XDP_CPUMAP program to cpumap entry");
+ ASSERT_EQ(err, -EINVAL, "Add non-BPF_XDP_CPUMAP program to cpumap entry");
+
+ /* Try to attach non-BPF file descriptor */
+ bad_fd = open("/dev/null", O_RDONLY);
+ ASSERT_GE(bad_fd, 0, "Open /dev/null for non-BPF fd");
+
+ val.bpf_prog.fd = bad_fd;
+ err = bpf_map_update_elem(map_fd, &idx, &val, 0);
+ ASSERT_EQ(err, -EINVAL, "Add non-BPF fd to cpumap entry");
+
+ /* Try to attach nonexistent file descriptor */
+ err = close(bad_fd);
+ ASSERT_EQ(err, 0, "Close non-BPF fd for nonexistent fd");
+
+ err = bpf_map_update_elem(map_fd, &idx, &val, 0);
+ ASSERT_EQ(err, -EBADF, "Add nonexistent fd to cpumap entry");
/* Try to attach BPF_XDP program with frags to cpumap when we have
* already loaded a BPF_XDP program on the map
--
2.51.0
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH bpf-next v2 1/2] bpf: cpumap: propagate underlying error in cpu_map_update_elem()
2025-12-08 13:14 ` [PATCH bpf-next v2 1/2] bpf: cpumap: propagate underlying error " Kohei Enju
@ 2025-12-08 14:19 ` Toke Høiland-Jørgensen
0 siblings, 0 replies; 6+ messages in thread
From: Toke Høiland-Jørgensen @ 2025-12-08 14:19 UTC (permalink / raw)
To: Kohei Enju, netdev, bpf, linux-kselftest
Cc: Alexei Starovoitov, Daniel Borkmann, David S. Miller,
Jakub Kicinski, Jesper Dangaard Brouer, John Fastabend,
Stanislav Fomichev, Andrii Nakryiko, Martin KaFai Lau,
Eduard Zingerman, Song Liu, Yonghong Song, KP Singh, Hao Luo,
Jiri Olsa, Shuah Khan, kohei.enju, Kohei Enju
Kohei Enju <enjuk@amazon.com> writes:
> After commit 9216477449f3 ("bpf: cpumap: Add the possibility to attach
> an eBPF program to cpumap"), __cpu_map_entry_alloc() may fail with
> errors other than -ENOMEM, such as -EBADF or -EINVAL.
>
> However, __cpu_map_entry_alloc() returns NULL on all failures, and
> cpu_map_update_elem() unconditionally converts this NULL into -ENOMEM.
> As a result, user space always receives -ENOMEM regardless of the actual
> underlying error.
>
> Examples of unexpected behavior:
> - Nonexistent fd : -ENOMEM (should be -EBADF)
> - Non-BPF fd : -ENOMEM (should be -EINVAL)
> - Bad attach type : -ENOMEM (should be -EINVAL)
>
> Change __cpu_map_entry_alloc() to return ERR_PTR(err) instead of NULL
> and have cpu_map_update_elem() propagate this error.
>
> Signed-off-by: Kohei Enju <enjuk@amazon.com>
Reviewed-by: Toke Høiland-Jørgensen <toke@redhat.com>
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH bpf-next v2 2/2] selftests/bpf: add tests for attaching invalid fd
2025-12-08 13:14 ` [PATCH bpf-next v2 2/2] selftests/bpf: add tests for attaching invalid fd Kohei Enju
@ 2025-12-08 14:20 ` Toke Høiland-Jørgensen
0 siblings, 0 replies; 6+ messages in thread
From: Toke Høiland-Jørgensen @ 2025-12-08 14:20 UTC (permalink / raw)
To: Kohei Enju, netdev, bpf, linux-kselftest
Cc: Alexei Starovoitov, Daniel Borkmann, David S. Miller,
Jakub Kicinski, Jesper Dangaard Brouer, John Fastabend,
Stanislav Fomichev, Andrii Nakryiko, Martin KaFai Lau,
Eduard Zingerman, Song Liu, Yonghong Song, KP Singh, Hao Luo,
Jiri Olsa, Shuah Khan, kohei.enju, Kohei Enju
Kohei Enju <enjuk@amazon.com> writes:
> Add test cases for situations where adding the following types of file
> descriptors to a cpumap entry should fail:
> - Non-BPF file descriptor (expect -EINVAL)
> - Nonexistent file descriptor (expect -EBADF)
>
> Also tighten the assertion for the expected error when adding a
> non-BPF_XDP_CPUMAP program to a cpumap entry.
>
> Signed-off-by: Kohei Enju <enjuk@amazon.com>
Reviewed-by: Toke Høiland-Jørgensen <toke@redhat.com>
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH bpf-next v2 0/2] bpf: cpumap: improve error propagation in cpu_map_update_elem()
2025-12-08 13:14 [PATCH bpf-next v2 0/2] bpf: cpumap: improve error propagation in cpu_map_update_elem() Kohei Enju
2025-12-08 13:14 ` [PATCH bpf-next v2 1/2] bpf: cpumap: propagate underlying error " Kohei Enju
2025-12-08 13:14 ` [PATCH bpf-next v2 2/2] selftests/bpf: add tests for attaching invalid fd Kohei Enju
@ 2025-12-10 8:00 ` patchwork-bot+netdevbpf
2 siblings, 0 replies; 6+ messages in thread
From: patchwork-bot+netdevbpf @ 2025-12-10 8:00 UTC (permalink / raw)
To: Kohei Enju
Cc: netdev, bpf, linux-kselftest, ast, daniel, davem, kuba, hawk,
john.fastabend, sdf, andrii, martin.lau, eddyz87, song,
yonghong.song, kpsingh, haoluo, jolsa, shuah, toke, kohei.enju
Hello:
This series was applied to bpf/bpf-next.git (master)
by Alexei Starovoitov <ast@kernel.org>:
On Mon, 8 Dec 2025 22:14:30 +0900 you wrote:
> This series improves error propagation in cpumap and adds selftests that
> cover the failure cases.
>
> Currently, failures returned from __cpu_map_entry_alloc() are ignored
> and always converted to -ENOMEM by cpu_map_update_elem(). This series
> ensures the correct error propagation and adds selftests.
>
> [...]
Here is the summary with links:
- [bpf-next,v2,1/2] bpf: cpumap: propagate underlying error in cpu_map_update_elem()
https://git.kernel.org/bpf/bpf-next/c/48e11bad9a1f
- [bpf-next,v2,2/2] selftests/bpf: add tests for attaching invalid fd
https://git.kernel.org/bpf/bpf-next/c/18352f8fae91
You are awesome, thank you!
--
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2025-12-10 8:03 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-12-08 13:14 [PATCH bpf-next v2 0/2] bpf: cpumap: improve error propagation in cpu_map_update_elem() Kohei Enju
2025-12-08 13:14 ` [PATCH bpf-next v2 1/2] bpf: cpumap: propagate underlying error " Kohei Enju
2025-12-08 14:19 ` Toke Høiland-Jørgensen
2025-12-08 13:14 ` [PATCH bpf-next v2 2/2] selftests/bpf: add tests for attaching invalid fd Kohei Enju
2025-12-08 14:20 ` Toke Høiland-Jørgensen
2025-12-10 8:00 ` [PATCH bpf-next v2 0/2] bpf: cpumap: improve error propagation in cpu_map_update_elem() patchwork-bot+netdevbpf
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).