Commit 31f23a6a authored by Muchun Song's avatar Muchun Song Committed by Daniel Borkmann

bpf: Fix potential call bpf_link_free() in atomic context

The in_atomic() macro cannot always detect atomic context, in particular,
it cannot know about held spinlocks in non-preemptible kernels. Although,
there is no user call bpf_link_put() with holding spinlock now, be on the
safe side, so we can avoid this in the future.
Signed-off-by: default avatarMuchun Song <songmuchun@bytedance.com>
Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
Acked-by: default avatarSong Liu <songliubraving@fb.com>
Acked-by: default avatarAndrii Nakryiko <andriin@fb.com>
Link: https://lore.kernel.org/bpf/20200917074453.20621-1-songmuchun@bytedance.com
parent 70b97111
...@@ -2345,12 +2345,8 @@ void bpf_link_put(struct bpf_link *link) ...@@ -2345,12 +2345,8 @@ void bpf_link_put(struct bpf_link *link)
if (!atomic64_dec_and_test(&link->refcnt)) if (!atomic64_dec_and_test(&link->refcnt))
return; return;
if (in_atomic()) {
INIT_WORK(&link->work, bpf_link_put_deferred); INIT_WORK(&link->work, bpf_link_put_deferred);
schedule_work(&link->work); schedule_work(&link->work);
} else {
bpf_link_free(link);
}
} }
static int bpf_link_release(struct inode *inode, struct file *filp) static int bpf_link_release(struct inode *inode, struct file *filp)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment