On Thu, Mar 3, 2022 at 9:48 AM <menglong8.dong@xxxxxxxxx> wrote: > > From: Menglong Dong <imagedong@xxxxxxxxxxx> > > Replace kfree_skb() used in enqueue_to_backlog() with > kfree_skb_reason(). The skb rop reason SKB_DROP_REASON_CPU_BACKLOG is > introduced for the case of failing to enqueue the skb to the per CPU > backlog queue. The further reason can be backlog queue full or RPS > flow limition, and I think we meedn't to make further distinctions. > > Signed-off-by: Menglong Dong <imagedong@xxxxxxxxxxx> > --- > include/linux/skbuff.h | 6 ++++++ > include/trace/events/skb.h | 1 + > net/core/dev.c | 6 +++++- > 3 files changed, 12 insertions(+), 1 deletion(-) > > diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h > index 62f9d15ec6ec..d2cf87ff84c2 100644 > --- a/include/linux/skbuff.h > +++ b/include/linux/skbuff.h > @@ -402,6 +402,12 @@ enum skb_drop_reason { > * outputting (failed to enqueue to > * current qdisc) > */ > + SKB_DROP_REASON_CPU_BACKLOG, /* failed to enqueue the skb to > + * the per CPU backlog queue. This > + * can be caused by backlog queue > + * full (see netdev_max_backlog in > + * net.rst) or RPS flow limit > + */ > SKB_DROP_REASON_MAX, > }; > > diff --git a/include/trace/events/skb.h b/include/trace/events/skb.h > index 80fe15d175e3..29c360b5e114 100644 > --- a/include/trace/events/skb.h > +++ b/include/trace/events/skb.h > @@ -47,6 +47,7 @@ > EM(SKB_DROP_REASON_NEIGH_DEAD, NEIGH_DEAD) \ > EM(SKB_DROP_REASON_QDISC_EGRESS, QDISC_EGRESS) \ > EM(SKB_DROP_REASON_QDISC_DROP, QDISC_DROP) \ > + EM(SKB_DROP_REASON_CPU_BACKLOG, CPU_BACKLOG) \ > EMe(SKB_DROP_REASON_MAX, MAX) > > #undef EM > diff --git a/net/core/dev.c b/net/core/dev.c > index 3280ba2502cd..373fa7a33ffa 100644 > --- a/net/core/dev.c > +++ b/net/core/dev.c > @@ -4541,10 +4541,12 @@ static bool skb_flow_limit(struct sk_buff *skb, unsigned int qlen) > static int enqueue_to_backlog(struct sk_buff *skb, int cpu, > unsigned int *qtail) > { > + enum skb_drop_reason reason; > struct softnet_data *sd; > unsigned long flags; > unsigned int qlen; > > + reason = SKB_DROP_REASON_NOT_SPECIFIED; > sd = &per_cpu(softnet_data, cpu); > > rps_lock_irqsave(sd, &flags); > @@ -4566,6 +4568,8 @@ static int enqueue_to_backlog(struct sk_buff *skb, int cpu, > if (!__test_and_set_bit(NAPI_STATE_SCHED, &sd->backlog.state)) > napi_schedule_rps(sd); > goto enqueue; > + } else { No need for an else {} after a goto xxx; > + reason = SKB_DROP_REASON_CPU_BACKLOG; > } > > drop: > @@ -4573,7 +4577,7 @@ static int enqueue_to_backlog(struct sk_buff *skb, int cpu, > rps_unlock_irq_restore(sd, &flags); > > atomic_long_inc(&skb->dev->rx_dropped); > - kfree_skb(skb); > + kfree_skb_reason(skb, reason); > return NET_RX_DROP; > } > > -- > 2.35.1 >