From: syzbot <syzbot+1f1fbecb9413cdbfbef8@syzkaller.appspotmail.com>
To: linux-kernel@vger.kernel.org
Subject: Forwarded: [PATCH] bpf: avoid sleeping in invalid context during sock_map_delete_elem path
Date: Mon, 13 Oct 2025 09:29:22 -0700 [thread overview]
Message-ID: <68ed28e1.050a0220.ac43.003a.GAE@google.com> (raw)
In-Reply-To: <68af9b2b.a00a0220.2929dc.0008.GAE@google.com>
For archival purposes, forwarding an incoming command email to
linux-kernel@vger.kernel.org.
***
Subject: [PATCH] bpf: avoid sleeping in invalid context during sock_map_delete_elem path
Author: listout@listout.xyz
#syz test
The syzkaller report exposed a BUG: “sleeping function called from
invalid context” in sock_map_delete_elem, which happens when
`bpf_test_timer_enter()` disables preemption but the delete path later
invokes a sleeping function while still in that context. Specifically:
- The crash trace shows `bpf_test_timer_enter()` acquiring a
preempt_disable path (via t->mode == NO_PREEMPT), but the symmetric
release path always calls migrate_enable(), mismatching the earlier
disable.
- As a result, preemption remains disabled across the
sock_map_delete_elem path, leading to a sleeping call under an invalid
context. :contentReference[oaicite:0]{index=0}
To fix this, normalize the disable/enable pairing: always use
migrate_disable()/migrate_enable() regardless of t->mode. This ensures
that we never remain with preemption disabled unintentionally when
entering the delete path, and avoids invalid-context sleeping.
Reported-by: syzbot+1f1fbecb9413cdbfbef8@syzkaller.appspotmail.com
Signed-off-by: Brahmajit Das <listout@listout.xyz>
---
net/bpf/test_run.c | 22 +++++++++-------------
1 file changed, 9 insertions(+), 13 deletions(-)
diff --git a/net/bpf/test_run.c b/net/bpf/test_run.c
index dfb03ee0bb62..92ff05821003 100644
--- a/net/bpf/test_run.c
+++ b/net/bpf/test_run.c
@@ -1,6 +1,7 @@
// SPDX-License-Identifier: GPL-2.0-only
/* Copyright (c) 2017 Facebook
*/
+#include "linux/rcupdate.h"
#include <linux/bpf.h>
#include <linux/btf.h>
#include <linux/btf_ids.h>
@@ -29,7 +30,6 @@
#include <trace/events/bpf_test_run.h>
struct bpf_test_timer {
- enum { NO_PREEMPT, NO_MIGRATE } mode;
u32 i;
u64 time_start, time_spent;
};
@@ -38,10 +38,8 @@ static void bpf_test_timer_enter(struct bpf_test_timer *t)
__acquires(rcu)
{
rcu_read_lock();
- if (t->mode == NO_PREEMPT)
- preempt_disable();
- else
- migrate_disable();
+ /*migrate_disable();*/
+ rcu_read_lock_dont_migrate();
t->time_start = ktime_get_ns();
}
@@ -51,10 +49,8 @@ static void bpf_test_timer_leave(struct bpf_test_timer *t)
{
t->time_start = 0;
- if (t->mode == NO_PREEMPT)
- preempt_enable();
- else
- migrate_enable();
+ /*migrate_enable();*/
+ rcu_read_unlock_migrate();
rcu_read_unlock();
}
@@ -374,7 +370,7 @@ static int bpf_test_run_xdp_live(struct bpf_prog *prog, struct xdp_buff *ctx,
{
struct xdp_test_data xdp = { .batch_size = batch_size };
- struct bpf_test_timer t = { .mode = NO_MIGRATE };
+ struct bpf_test_timer t = {};
int ret;
if (!repeat)
@@ -404,7 +400,7 @@ static int bpf_test_run(struct bpf_prog *prog, void *ctx, u32 repeat,
struct bpf_prog_array_item item = {.prog = prog};
struct bpf_run_ctx *old_ctx;
struct bpf_cg_run_ctx run_ctx;
- struct bpf_test_timer t = { NO_MIGRATE };
+ struct bpf_test_timer t = {};
enum bpf_cgroup_storage_type stype;
int ret;
@@ -1377,7 +1373,7 @@ int bpf_prog_test_run_flow_dissector(struct bpf_prog *prog,
const union bpf_attr *kattr,
union bpf_attr __user *uattr)
{
- struct bpf_test_timer t = { NO_PREEMPT };
+ struct bpf_test_timer t = {};
u32 size = kattr->test.data_size_in;
struct bpf_flow_dissector ctx = {};
u32 repeat = kattr->test.repeat;
@@ -1445,7 +1441,7 @@ int bpf_prog_test_run_flow_dissector(struct bpf_prog *prog,
int bpf_prog_test_run_sk_lookup(struct bpf_prog *prog, const union bpf_attr *kattr,
union bpf_attr __user *uattr)
{
- struct bpf_test_timer t = { NO_PREEMPT };
+ struct bpf_test_timer t = {};
struct bpf_prog_array *progs = NULL;
struct bpf_sk_lookup_kern ctx = {};
u32 repeat = kattr->test.repeat;
--
2.51.0
next prev parent reply other threads:[~2025-10-13 16:29 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-08-27 23:56 [syzbot] [bpf?] [net?] BUG: sleeping function called from invalid context in sock_map_delete_elem syzbot
2025-10-01 18:26 ` Forwarded: " syzbot
2025-10-09 21:26 ` Forwarded: " syzbot
2025-10-09 22:28 ` [PATCH] bpf: avoid sleeping in invalid context during sock_map_delete_elem path Brahmajit Das
2025-10-09 22:38 ` Alexei Starovoitov
2025-10-09 23:29 ` [syzbot] [bpf?] [net?] BUG: sleeping function called from invalid context in sock_map_delete_elem syzbot
2025-10-13 16:29 ` syzbot [this message]
2025-10-13 17:11 ` [PATCH v2] bpf: avoid sleeping in invalid context during sock_map_delete_elem path Brahmajit Das
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=68ed28e1.050a0220.ac43.003a.GAE@google.com \
--to=syzbot+1f1fbecb9413cdbfbef8@syzkaller.appspotmail.com \
--cc=linux-kernel@vger.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