* [syzbot] [bpf?] WARNING: locking bug in bpf_map_put
@ 2024-11-01 18:28 syzbot
2024-11-04 2:29 ` syzbot
0 siblings, 1 reply; 4+ messages in thread
From: syzbot @ 2024-11-01 18:28 UTC (permalink / raw)
To: andrii, ast, bpf, daniel, eddyz87, haoluo, john.fastabend, jolsa,
kpsingh, linux-kernel, martin.lau, sdf, song, syzkaller-bugs,
yonghong.song
Hello,
syzbot found the following issue on:
HEAD commit: f9f24ca362a4 Add linux-next specific files for 20241031
git tree: linux-next
console+strace: https://syzkaller.appspot.com/x/log.txt?x=14886630580000
kernel config: https://syzkaller.appspot.com/x/.config?x=328572ed4d152be9
dashboard link: https://syzkaller.appspot.com/bug?extid=d2adb332fe371b0595e3
compiler: Debian clang version 15.0.6, GNU ld (GNU Binutils for Debian) 2.40
syz repro: https://syzkaller.appspot.com/x/repro.syz?x=174432a7980000
C reproducer: https://syzkaller.appspot.com/x/repro.c?x=14ffe55f980000
Downloadable assets:
disk image: https://storage.googleapis.com/syzbot-assets/eb84549dd6b3/disk-f9f24ca3.raw.xz
vmlinux: https://storage.googleapis.com/syzbot-assets/beb29bdfa297/vmlinux-f9f24ca3.xz
kernel image: https://storage.googleapis.com/syzbot-assets/8881fe3245ad/bzImage-f9f24ca3.xz
IMPORTANT: if you fix the issue, please add the following tag to the commit:
Reported-by: syzbot+d2adb332fe371b0595e3@syzkaller.appspotmail.com
=============================
[ BUG: Invalid wait context ]
6.12.0-rc5-next-20241031-syzkaller #0 Not tainted
-----------------------------
syz-executor304/5844 is trying to lock:
ffffffff8e9ba4b8 (map_idr_lock){+...}-{3:3}, at: bpf_map_free_id kernel/bpf/syscall.c:468 [inline]
ffffffff8e9ba4b8 (map_idr_lock){+...}-{3:3}, at: bpf_map_put+0x9a/0x380 kernel/bpf/syscall.c:902
other info that might help us debug this:
context-{5:5}
2 locks held by syz-executor304/5844:
#0: ffffffff8e939f20 (rcu_read_lock){....}-{1:3}, at: rcu_lock_acquire include/linux/rcupdate.h:337 [inline]
#0: ffffffff8e939f20 (rcu_read_lock){....}-{1:3}, at: rcu_read_lock include/linux/rcupdate.h:849 [inline]
#0: ffffffff8e939f20 (rcu_read_lock){....}-{1:3}, at: map_delete_elem+0x338/0x5c0 kernel/bpf/syscall.c:1777
#1: ffff88807b870410 (&htab->lockdep_key){....}-{2:2}, at: htab_lock_bucket+0x1a4/0x370 kernel/bpf/hashtab.c:167
stack backtrace:
CPU: 1 UID: 0 PID: 5844 Comm: syz-executor304 Not tainted 6.12.0-rc5-next-20241031-syzkaller #0
Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 09/13/2024
Call Trace:
<TASK>
__dump_stack lib/dump_stack.c:94 [inline]
dump_stack_lvl+0x241/0x360 lib/dump_stack.c:120
print_lock_invalid_wait_context kernel/locking/lockdep.c:4826 [inline]
check_wait_context kernel/locking/lockdep.c:4898 [inline]
__lock_acquire+0x15a8/0x2100 kernel/locking/lockdep.c:5176
lock_acquire+0x1ed/0x550 kernel/locking/lockdep.c:5849
__raw_spin_lock_irqsave include/linux/spinlock_api_smp.h:110 [inline]
_raw_spin_lock_irqsave+0xd5/0x120 kernel/locking/spinlock.c:162
bpf_map_free_id kernel/bpf/syscall.c:468 [inline]
bpf_map_put+0x9a/0x380 kernel/bpf/syscall.c:902
htab_put_fd_value kernel/bpf/hashtab.c:911 [inline]
free_htab_elem+0xbb/0x460 kernel/bpf/hashtab.c:946
htab_map_delete_elem+0x576/0x6b0 kernel/bpf/hashtab.c:1438
map_delete_elem+0x431/0x5c0 kernel/bpf/syscall.c:1778
__sys_bpf+0x598/0x810 kernel/bpf/syscall.c:5745
__do_sys_bpf kernel/bpf/syscall.c:5861 [inline]
__se_sys_bpf kernel/bpf/syscall.c:5859 [inline]
__x64_sys_bpf+0x7c/0x90 kernel/bpf/syscall.c:5859
do_syscall_x64 arch/x86/entry/common.c:52 [inline]
do_syscall_64+0xf3/0x230 arch/x86/entry/common.c:83
entry_SYSCALL_64_after_hwframe+0x77/0x7f
RIP: 0033:0x7f9ad03385e9
Code: 48 83 c4 28 c3 e8 37 17 00 00 0f 1f 80 00 00 00 00 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 c7 c1 b8 ff ff ff f7 d8 64 89 01 48
RSP: 002b:00007ffd14d58828 EFLAGS: 00000246 ORIG_RAX: 0000000000000141
RAX: ffffffffffffffda RBX: 00007ffd14d589f8 RCX: 00007f9ad03385e9
RDX: 0000000000000020 RSI: 0000000020000300 RDI: 0000000000000003
R
---
This report is generated by a bot. It may contain errors.
See https://goo.gl/tpsmEJ for more information about syzbot.
syzbot engineers can be reached at syzkaller@googlegroups.com.
syzbot will keep track of this issue. See:
https://goo.gl/tpsmEJ#status for how to communicate with syzbot.
If the report is already addressed, let syzbot know by replying with:
#syz fix: exact-commit-title
If you want syzbot to run the reproducer, reply with:
#syz test: git://repo/address.git branch-or-commit-hash
If you attach or paste a git patch, syzbot will apply it before testing.
If you want to overwrite report's subsystems, reply with:
#syz set subsystems: new-subsystem
(See the list of subsystem names on the web dashboard)
If the report is a duplicate of another one, reply with:
#syz dup: exact-subject-of-another-report
If you want to undo deduplication, reply with:
#syz undup
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [syzbot] [bpf?] WARNING: locking bug in bpf_map_put
2024-11-01 18:28 [syzbot] [bpf?] WARNING: locking bug in bpf_map_put syzbot
@ 2024-11-04 2:29 ` syzbot
2024-11-04 16:28 ` Sebastian Andrzej Siewior
0 siblings, 1 reply; 4+ messages in thread
From: syzbot @ 2024-11-04 2:29 UTC (permalink / raw)
To: andrii, ast, bigeasy, boqun.feng, bpf, daniel, eadavis, eddyz87,
haoluo, john.fastabend, jolsa, kpsingh, linux-kernel, longman,
martin.lau, sdf, song, syzkaller-bugs, yonghong.song
syzbot has bisected this issue to:
commit 560af5dc839eef08a273908f390cfefefb82aa04
Author: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Date: Wed Oct 9 15:45:03 2024 +0000
lockdep: Enable PROVE_RAW_LOCK_NESTING with PROVE_LOCKING.
bisection log: https://syzkaller.appspot.com/x/bisect.txt?x=122a4740580000
start commit: f9f24ca362a4 Add linux-next specific files for 20241031
git tree: linux-next
final oops: https://syzkaller.appspot.com/x/report.txt?x=112a4740580000
console output: https://syzkaller.appspot.com/x/log.txt?x=162a4740580000
kernel config: https://syzkaller.appspot.com/x/.config?x=328572ed4d152be9
dashboard link: https://syzkaller.appspot.com/bug?extid=d2adb332fe371b0595e3
syz repro: https://syzkaller.appspot.com/x/repro.syz?x=174432a7980000
C reproducer: https://syzkaller.appspot.com/x/repro.c?x=14ffe55f980000
Reported-by: syzbot+d2adb332fe371b0595e3@syzkaller.appspotmail.com
Fixes: 560af5dc839e ("lockdep: Enable PROVE_RAW_LOCK_NESTING with PROVE_LOCKING.")
For information about bisection process see: https://goo.gl/tpsmEJ#bisection
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [syzbot] [bpf?] WARNING: locking bug in bpf_map_put
2024-11-04 2:29 ` syzbot
@ 2024-11-04 16:28 ` Sebastian Andrzej Siewior
2024-11-05 2:49 ` Hou Tao
0 siblings, 1 reply; 4+ messages in thread
From: Sebastian Andrzej Siewior @ 2024-11-04 16:28 UTC (permalink / raw)
To: syzbot
Cc: andrii, ast, boqun.feng, bpf, daniel, eadavis, eddyz87, haoluo,
john.fastabend, jolsa, kpsingh, linux-kernel, longman, martin.lau,
sdf, song, syzkaller-bugs, yonghong.song, tglx
On 2024-11-03 18:29:04 [-0800], syzbot wrote:
> syzbot has bisected this issue to:
>
> commit 560af5dc839eef08a273908f390cfefefb82aa04
> Author: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
> Date: Wed Oct 9 15:45:03 2024 +0000
>
> lockdep: Enable PROVE_RAW_LOCK_NESTING with PROVE_LOCKING.
>
> bisection log: https://syzkaller.appspot.com/x/bisect.txt?x=122a4740580000
> start commit: f9f24ca362a4 Add linux-next specific files for 20241031
> git tree: linux-next
> final oops: https://syzkaller.appspot.com/x/report.txt?x=112a4740580000
> console output: https://syzkaller.appspot.com/x/log.txt?x=162a4740580000
> kernel config: https://syzkaller.appspot.com/x/.config?x=328572ed4d152be9
> dashboard link: https://syzkaller.appspot.com/bug?extid=d2adb332fe371b0595e3
> syz repro: https://syzkaller.appspot.com/x/repro.syz?x=174432a7980000
> C reproducer: https://syzkaller.appspot.com/x/repro.c?x=14ffe55f980000
>
> Reported-by: syzbot+d2adb332fe371b0595e3@syzkaller.appspotmail.com
> Fixes: 560af5dc839e ("lockdep: Enable PROVE_RAW_LOCK_NESTING with PROVE_LOCKING.")
>
> For information about bisection process see: https://goo.gl/tpsmEJ#bisection
This is due to raw_spinlock_t in bucket::lock and the acquired
spinlock_t underneath. Would it would to move free part outside of the
locked section?
diff --git a/kernel/bpf/hashtab.c b/kernel/bpf/hashtab.c
index b14b87463ee04..1d8d09fdd2da5 100644
--- a/kernel/bpf/hashtab.c
+++ b/kernel/bpf/hashtab.c
@@ -824,13 +824,14 @@ static bool htab_lru_map_delete_node(void *arg, struct bpf_lru_node *node)
hlist_nulls_for_each_entry_rcu(l, n, head, hash_node)
if (l == tgt_l) {
hlist_nulls_del_rcu(&l->hash_node);
- check_and_free_fields(htab, l);
bpf_map_dec_elem_count(&htab->map);
break;
}
htab_unlock_bucket(htab, b, tgt_l->hash, flags);
+ if (l == tgt_l)
+ check_and_free_fields(htab, l);
return l == tgt_l;
}
@@ -1181,14 +1182,18 @@ static long htab_map_update_elem(struct bpf_map *map, void *key, void *value,
* concurrent search will find it before old elem
*/
hlist_nulls_add_head_rcu(&l_new->hash_node, head);
- if (l_old) {
+ if (l_old)
hlist_nulls_del_rcu(&l_old->hash_node);
+ htab_unlock_bucket(htab, b, hash, flags);
+
+ if (l_old) {
if (!htab_is_prealloc(htab))
free_htab_elem(htab, l_old);
else
check_and_free_fields(htab, l_old);
}
- ret = 0;
+ return 0;
+
err:
htab_unlock_bucket(htab, b, hash, flags);
return ret;
@@ -1433,14 +1438,15 @@ static long htab_map_delete_elem(struct bpf_map *map, void *key)
l = lookup_elem_raw(head, hash, key, key_size);
- if (l) {
+ if (l)
hlist_nulls_del_rcu(&l->hash_node);
- free_htab_elem(htab, l);
- } else {
+ else
ret = -ENOENT;
- }
htab_unlock_bucket(htab, b, hash, flags);
+
+ if (l)
+ free_htab_elem(htab, l);
return ret;
}
@@ -1647,14 +1653,16 @@ static int __htab_map_lookup_and_delete_elem(struct bpf_map *map, void *key,
}
hlist_nulls_del_rcu(&l->hash_node);
- if (!is_lru_map)
- free_htab_elem(htab, l);
}
htab_unlock_bucket(htab, b, hash, bflags);
- if (is_lru_map && l)
- htab_lru_push_free(htab, l);
+ if (l) {
+ if (is_lru_map)
+ htab_lru_push_free(htab, l);
+ else
+ free_htab_elem(htab, l);
+ }
return ret;
}
@@ -1851,15 +1859,12 @@ __htab_map_lookup_and_delete_batch(struct bpf_map *map,
/* bpf_lru_push_free() will acquire lru_lock, which
* may cause deadlock. See comments in function
- * prealloc_lru_pop(). Let us do bpf_lru_push_free()
- * after releasing the bucket lock.
+ * prealloc_lru_pop(). htab_lru_push_free() may allocate
+ * sleeping locks. Let us do bpf_lru_push_free() after
+ * releasing the bucket lock.
*/
- if (is_lru_map) {
- l->batch_flink = node_to_free;
- node_to_free = l;
- } else {
- free_htab_elem(htab, l);
- }
+ l->batch_flink = node_to_free;
+ node_to_free = l;
}
dst_key += key_size;
dst_val += value_size;
@@ -1871,7 +1876,10 @@ __htab_map_lookup_and_delete_batch(struct bpf_map *map,
while (node_to_free) {
l = node_to_free;
node_to_free = node_to_free->batch_flink;
- htab_lru_push_free(htab, l);
+ if (is_lru_map)
+ htab_lru_push_free(htab, l);
+ else
+ free_htab_elem(htab, l);
}
next_batch:
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [syzbot] [bpf?] WARNING: locking bug in bpf_map_put
2024-11-04 16:28 ` Sebastian Andrzej Siewior
@ 2024-11-05 2:49 ` Hou Tao
0 siblings, 0 replies; 4+ messages in thread
From: Hou Tao @ 2024-11-05 2:49 UTC (permalink / raw)
To: Sebastian Andrzej Siewior, syzbot
Cc: andrii, ast, boqun.feng, bpf, daniel, eadavis, eddyz87, haoluo,
john.fastabend, jolsa, kpsingh, linux-kernel, longman, martin.lau,
sdf, song, syzkaller-bugs, yonghong.song, tglx
Hi,
On 11/5/2024 12:28 AM, Sebastian Andrzej Siewior wrote:
> On 2024-11-03 18:29:04 [-0800], syzbot wrote:
>> syzbot has bisected this issue to:
>>
>> commit 560af5dc839eef08a273908f390cfefefb82aa04
>> Author: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
>> Date: Wed Oct 9 15:45:03 2024 +0000
>>
>> lockdep: Enable PROVE_RAW_LOCK_NESTING with PROVE_LOCKING.
>>
>> bisection log: https://syzkaller.appspot.com/x/bisect.txt?x=122a4740580000
>> start commit: f9f24ca362a4 Add linux-next specific files for 20241031
>> git tree: linux-next
>> final oops: https://syzkaller.appspot.com/x/report.txt?x=112a4740580000
>> console output: https://syzkaller.appspot.com/x/log.txt?x=162a4740580000
>> kernel config: https://syzkaller.appspot.com/x/.config?x=328572ed4d152be9
>> dashboard link: https://syzkaller.appspot.com/bug?extid=d2adb332fe371b0595e3
>> syz repro: https://syzkaller.appspot.com/x/repro.syz?x=174432a7980000
>> C reproducer: https://syzkaller.appspot.com/x/repro.c?x=14ffe55f980000
>>
>> Reported-by: syzbot+d2adb332fe371b0595e3@syzkaller.appspotmail.com
>> Fixes: 560af5dc839e ("lockdep: Enable PROVE_RAW_LOCK_NESTING with PROVE_LOCKING.")
>>
>> For information about bisection process see: https://goo.gl/tpsmEJ#bisection
> This is due to raw_spinlock_t in bucket::lock and the acquired
> spinlock_t underneath. Would it would to move free part outside of the
> locked section?
I think moving free_htab_elem() after htab_unlock_bucket() is OK. But
the fix below is not enough, and there is some corn cases for
pre-allocated element . I had written a patch for the problem a few day
ago because the problem can be easily reproduced by running test_maps. I
am also writing a selftest patch for it. I could post the patch and the
selftest patch if you are OK with it.
>
> diff --git a/kernel/bpf/hashtab.c b/kernel/bpf/hashtab.c
> index b14b87463ee04..1d8d09fdd2da5 100644
> --- a/kernel/bpf/hashtab.c
> +++ b/kernel/bpf/hashtab.c
> @@ -824,13 +824,14 @@ static bool htab_lru_map_delete_node(void *arg, struct bpf_lru_node *node)
> hlist_nulls_for_each_entry_rcu(l, n, head, hash_node)
> if (l == tgt_l) {
> hlist_nulls_del_rcu(&l->hash_node);
> - check_and_free_fields(htab, l);
> bpf_map_dec_elem_count(&htab->map);
> break;
> }
>
> htab_unlock_bucket(htab, b, tgt_l->hash, flags);
>
> + if (l == tgt_l)
> + check_and_free_fields(htab, l);
> return l == tgt_l;
> }
>
> @@ -1181,14 +1182,18 @@ static long htab_map_update_elem(struct bpf_map *map, void *key, void *value,
> * concurrent search will find it before old elem
> */
> hlist_nulls_add_head_rcu(&l_new->hash_node, head);
> - if (l_old) {
> + if (l_old)
> hlist_nulls_del_rcu(&l_old->hash_node);
> + htab_unlock_bucket(htab, b, hash, flags);
> +
> + if (l_old) {
> if (!htab_is_prealloc(htab))
> free_htab_elem(htab, l_old);
> else
> check_and_free_fields(htab, l_old);
> }
> - ret = 0;
> + return 0;
> +
> err:
> htab_unlock_bucket(htab, b, hash, flags);
> return ret;
> @@ -1433,14 +1438,15 @@ static long htab_map_delete_elem(struct bpf_map *map, void *key)
>
> l = lookup_elem_raw(head, hash, key, key_size);
>
> - if (l) {
> + if (l)
> hlist_nulls_del_rcu(&l->hash_node);
> - free_htab_elem(htab, l);
> - } else {
> + else
> ret = -ENOENT;
> - }
>
> htab_unlock_bucket(htab, b, hash, flags);
> +
> + if (l)
> + free_htab_elem(htab, l);
> return ret;
> }
>
> @@ -1647,14 +1653,16 @@ static int __htab_map_lookup_and_delete_elem(struct bpf_map *map, void *key,
> }
>
> hlist_nulls_del_rcu(&l->hash_node);
> - if (!is_lru_map)
> - free_htab_elem(htab, l);
> }
>
> htab_unlock_bucket(htab, b, hash, bflags);
>
> - if (is_lru_map && l)
> - htab_lru_push_free(htab, l);
> + if (l) {
> + if (is_lru_map)
> + htab_lru_push_free(htab, l);
> + else
> + free_htab_elem(htab, l);
> + }
>
> return ret;
> }
> @@ -1851,15 +1859,12 @@ __htab_map_lookup_and_delete_batch(struct bpf_map *map,
>
> /* bpf_lru_push_free() will acquire lru_lock, which
> * may cause deadlock. See comments in function
> - * prealloc_lru_pop(). Let us do bpf_lru_push_free()
> - * after releasing the bucket lock.
> + * prealloc_lru_pop(). htab_lru_push_free() may allocate
> + * sleeping locks. Let us do bpf_lru_push_free() after
> + * releasing the bucket lock.
> */
> - if (is_lru_map) {
> - l->batch_flink = node_to_free;
> - node_to_free = l;
> - } else {
> - free_htab_elem(htab, l);
> - }
> + l->batch_flink = node_to_free;
> + node_to_free = l;
> }
> dst_key += key_size;
> dst_val += value_size;
> @@ -1871,7 +1876,10 @@ __htab_map_lookup_and_delete_batch(struct bpf_map *map,
> while (node_to_free) {
> l = node_to_free;
> node_to_free = node_to_free->batch_flink;
> - htab_lru_push_free(htab, l);
> + if (is_lru_map)
> + htab_lru_push_free(htab, l);
> + else
> + free_htab_elem(htab, l);
> }
>
> next_batch:
>
> .
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2024-11-05 2:49 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-11-01 18:28 [syzbot] [bpf?] WARNING: locking bug in bpf_map_put syzbot
2024-11-04 2:29 ` syzbot
2024-11-04 16:28 ` Sebastian Andrzej Siewior
2024-11-05 2:49 ` Hou Tao
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox