Hi Menglong, I am going to send another v5 soon which introduces kfree_skb_list_reason() as well. https://lore.kernel.org/all/20220226084929.6417-2-dongli.zhang@xxxxxxxxxx/ I will need to make it inline as suggested by Jakub. Not sure how to handle such scenario :) Thank you very much! Dongli Zhang On 3/3/22 9:47 AM, menglong8.dong@xxxxxxxxx wrote: > From: Menglong Dong <imagedong@xxxxxxxxxxx> > > To report reasons of skb drops, introduce the function > kfree_skb_list_reason() and make kfree_skb_list() an inline call to > it. This function will be used in the next commit in > __dev_xmit_skb(). > > Signed-off-by: Menglong Dong <imagedong@xxxxxxxxxxx> > --- > include/linux/skbuff.h | 8 +++++++- > net/core/skbuff.c | 7 ++++--- > 2 files changed, 11 insertions(+), 4 deletions(-) > > diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h > index ebd18850b63e..e344603aecc4 100644 > --- a/include/linux/skbuff.h > +++ b/include/linux/skbuff.h > @@ -1194,10 +1194,16 @@ static inline void kfree_skb(struct sk_buff *skb) > } > > void skb_release_head_state(struct sk_buff *skb); > -void kfree_skb_list(struct sk_buff *segs); > +void kfree_skb_list_reason(struct sk_buff *segs, > + enum skb_drop_reason reason); > void skb_dump(const char *level, const struct sk_buff *skb, bool full_pkt); > void skb_tx_error(struct sk_buff *skb); > > +static inline void kfree_skb_list(struct sk_buff *segs) > +{ > + kfree_skb_list_reason(segs, SKB_DROP_REASON_NOT_SPECIFIED); > +} > + > #ifdef CONFIG_TRACEPOINTS > void consume_skb(struct sk_buff *skb); > #else > diff --git a/net/core/skbuff.c b/net/core/skbuff.c > index b32c5d782fe1..46d7dea78011 100644 > --- a/net/core/skbuff.c > +++ b/net/core/skbuff.c > @@ -777,16 +777,17 @@ void kfree_skb_reason(struct sk_buff *skb, enum skb_drop_reason reason) > } > EXPORT_SYMBOL(kfree_skb_reason); > > -void kfree_skb_list(struct sk_buff *segs) > +void kfree_skb_list_reason(struct sk_buff *segs, > + enum skb_drop_reason reason) > { > while (segs) { > struct sk_buff *next = segs->next; > > - kfree_skb(segs); > + kfree_skb_reason(segs, reason); > segs = next; > } > } > -EXPORT_SYMBOL(kfree_skb_list); > +EXPORT_SYMBOL(kfree_skb_list_reason); > > /* Dump skb information and contents. > * >