diff options
author | Jakub Kicinski <kuba@kernel.org> | 2020-11-25 15:08:39 -0800 |
---|---|---|
committer | Jakub Kicinski <kuba@kernel.org> | 2020-11-25 15:08:39 -0800 |
commit | 0e1f1cc89a77e8ca63e4c2490e1facdca52f9b04 (patch) | |
tree | 7e7ba80fe4b8140a2871e460c39ec9d01a6e6299 | |
parent | b5094a3b535b5a258ab49ed9614948df63bc3557 (diff) | |
parent | 6454eca81eae5fd046906ea9af3afc019a9639b0 (diff) |
Merge branch 'add-an-assert-in-napi_consume_skb'
Yunsheng Lin says:
====================
Add an assert in napi_consume_skb()
This patch introduces a lockdep_assert_in_softirq() interface and
uses it to assert the case when napi_consume_skb() is not called in
the softirq context.
====================
Link: https://lore.kernel.org/r/1606214969-97849-1-git-send-email-linyunsheng@huawei.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
-rw-r--r-- | include/linux/lockdep.h | 11 | ||||
-rw-r--r-- | net/core/skbuff.c | 2 |
2 files changed, 13 insertions, 0 deletions
diff --git a/include/linux/lockdep.h b/include/linux/lockdep.h index f5594879175a..92771bc1791f 100644 --- a/include/linux/lockdep.h +++ b/include/linux/lockdep.h @@ -594,6 +594,16 @@ do { \ this_cpu_read(hardirqs_enabled))); \ } while (0) +/* + * Acceptable for protecting per-CPU resources accessed from BH. + * Much like in_softirq() - semantics are ambiguous, use carefully. + */ +#define lockdep_assert_in_softirq() \ +do { \ + WARN_ON_ONCE(__lockdep_enabled && \ + (!in_softirq() || in_irq() || in_nmi())); \ +} while (0) + #else # define might_lock(lock) do { } while (0) # define might_lock_read(lock) do { } while (0) @@ -605,6 +615,7 @@ do { \ # define lockdep_assert_preemption_enabled() do { } while (0) # define lockdep_assert_preemption_disabled() do { } while (0) +# define lockdep_assert_in_softirq() do { } while (0) #endif #ifdef CONFIG_PROVE_RAW_LOCK_NESTING diff --git a/net/core/skbuff.c b/net/core/skbuff.c index ffe3dcc0ebea..effa19da8681 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c @@ -902,6 +902,8 @@ void napi_consume_skb(struct sk_buff *skb, int budget) return; } + lockdep_assert_in_softirq(); + if (!skb_unref(skb)) return; |