net: dev: use kfree_skb_reason() for enqueue_to_backlog()
authorMenglong Dong <imagedong@tencent.com>
Fri, 4 Mar 2022 06:00:43 +0000 (14:00 +0800)
committerDavid S. Miller <davem@davemloft.net>
Fri, 4 Mar 2022 12:17:11 +0000 (12:17 +0000)
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 needn't to make further distinctions.

Signed-off-by: Menglong Dong <imagedong@tencent.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/linux/skbuff.h
include/trace/events/skb.h
net/core/dev.c

index 769d54ba2f3b4fabf50984a8933c7c7c2ce886d0..44ecbfff2b6938a6f584051bcdf6394a704eb9be 100644 (file)
@@ -399,6 +399,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,
 };
 
index dbf3e2e3c1b44d016b42d6e8e248058b9b074404..3bb90ca893ae0d34a7263856aaf27690e0dade37 100644 (file)
@@ -47,6 +47,7 @@
        EM(SKB_DROP_REASON_NEIGH_DEAD, NEIGH_DEAD)              \
        EM(SKB_DROP_REASON_TC_EGRESS, TC_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
index e2c107643ee5545c67ed6c14eedecd01864f87e1..460ac941a63188160f820f43b50cc5ad8aa2457d 100644 (file)
@@ -4570,10 +4570,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);
@@ -4596,13 +4598,14 @@ enqueue:
                        napi_schedule_rps(sd);
                goto enqueue;
        }
+       reason = SKB_DROP_REASON_CPU_BACKLOG;
 
 drop:
        sd->dropped++;
        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;
 }