On Fri, Mar 4, 2022 at 1:59 AM Eric Dumazet <edumazet@xxxxxxxxxx> wrote: > > 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; > Yeah, this 'else' can be omitted :) Thanks! > > > + 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 > >