Commit 574f7194f693cd80de96a39f0c43dbb346c38a15
Committed by
David S. Miller
1 parent
f91ca783f1
Exists in
master
and in
13 other branches
net: Add a test to see if a skb is freeable in irq context
Currently netpoll and skb_release_head_state assume that a skb is freeable in hard irq context except when skb->destructor is set. The reality is far from this. So add a function skb_irq_freeable to compute the full test and in the process be the living documentation of what the requirements are of actually freeing a skb in hard irq context. Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com> Acked-by: Eric Dumazet <edumazet@google.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Showing 1 changed file with 13 additions and 0 deletions Side-by-side Diff
include/linux/skbuff.h
... | ... | @@ -2831,6 +2831,19 @@ |
2831 | 2831 | { } |
2832 | 2832 | #endif |
2833 | 2833 | |
2834 | +static inline bool skb_irq_freeable(const struct sk_buff *skb) | |
2835 | +{ | |
2836 | + return !skb->destructor && | |
2837 | +#if IS_ENABLED(CONFIG_XFRM) | |
2838 | + !skb->sp && | |
2839 | +#endif | |
2840 | +#if IS_ENABLED(CONFIG_NF_CONNTRACK) | |
2841 | + !skb->nfct && | |
2842 | +#endif | |
2843 | + !skb->_skb_refdst && | |
2844 | + !skb_has_frag_list(skb); | |
2845 | +} | |
2846 | + | |
2834 | 2847 | static inline void skb_set_queue_mapping(struct sk_buff *skb, u16 queue_mapping) |
2835 | 2848 | { |
2836 | 2849 | skb->queue_mapping = queue_mapping; |