teknoraver icon

napi_kfree_skb

teknoraver | PRO | 04/06/21 12:40:09 AM UTC | 0 ⭐ | 14391 👁️ | Never ⏰ | []
Diff |

2.05 KB

|

None

|

0 👍

/

0 👎

diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
index fffa6b399995..aa1685f72397 100644
--- a/include/linux/skbuff.h
+++ b/include/linux/skbuff.h
@@ -2932,6 +2932,7 @@ static inline struct sk_buff *napi_alloc_skb(struct napi_struct *napi,
    return __napi_alloc_skb(napi, length, GFP_ATOMIC);
 }
 void napi_consume_skb(struct sk_buff *skb, int budget);
+void napi_kfree_skb(struct sk_buff *skb, int budget);
 
 void napi_skb_free_stolen_head(struct sk_buff *skb);
 void __kfree_skb_defer(struct sk_buff *skb);
diff --git a/net/core/skbuff.c b/net/core/skbuff.c
index 7f5c02085438..294bf2068ab6 100644
--- a/net/core/skbuff.c
+++ b/net/core/skbuff.c
@@ -951,11 +951,14 @@ void napi_skb_free_stolen_head(struct sk_buff *skb)
    napi_skb_cache_put(skb);
 }
 
-void napi_consume_skb(struct sk_buff *skb, int budget)
+static void napi_release_skb(struct sk_buff *skb, int budget, bool consume)
 {
    /* Zero budget indicate non-NAPI context called us, like netpoll */
    if (unlikely(!budget)) {
-       dev_consume_skb_any(skb);
+       if (consume)
+           dev_consume_skb_any(skb);
+       else
+           dev_kfree_skb_any(skb);
        return;
    }
 
@@ -965,7 +968,10 @@ void napi_consume_skb(struct sk_buff *skb, int budget)
        return;
 
    /* if reaching here SKB is ready to free */
-   trace_consume_skb(skb);
+   if (consume)
+       trace_consume_skb(skb);
+   else
+       trace_kfree_skb(skb);
 
    /* if SKB is a clone, don't handle this case */
    if (skb->fclone != SKB_FCLONE_UNAVAILABLE) {
@@ -976,8 +982,20 @@ void napi_consume_skb(struct sk_buff *skb, int budget)
    skb_release_all(skb);
    napi_skb_cache_put(skb);
 }
+
+
+void napi_consume_skb(struct sk_buff *skb, int budget)
+{
+   napi_release_skb(skb, budget, true);
+}
 EXPORT_SYMBOL(napi_consume_skb);
 
+void napi_kfree_skb(struct sk_buff *skb, int budget)
+{
+   napi_release_skb(skb, budget, false);
+}
+EXPORT_SYMBOL(napi_kfree_skb);
+
 /* Make sure a field is enclosed inside headers_start/headers_end section */
 #define CHECK_SKB_FIELD(field) \
    BUILD_BUG_ON(offsetof(struct sk_buff, field) <      \
 

Comments

  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎

    
        
  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎

    
        
  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎