Commit 44f0bd40 authored by Menglong Dong's avatar Menglong Dong Committed by David S. Miller

net: dev: use kfree_skb_reason() for enqueue_to_backlog()

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: default avatarMenglong Dong <imagedong@tencent.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 7faef054
...@@ -399,6 +399,12 @@ enum skb_drop_reason { ...@@ -399,6 +399,12 @@ enum skb_drop_reason {
* outputting (failed to enqueue to * outputting (failed to enqueue to
* current qdisc) * 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, SKB_DROP_REASON_MAX,
}; };
......
...@@ -47,6 +47,7 @@ ...@@ -47,6 +47,7 @@
EM(SKB_DROP_REASON_NEIGH_DEAD, NEIGH_DEAD) \ EM(SKB_DROP_REASON_NEIGH_DEAD, NEIGH_DEAD) \
EM(SKB_DROP_REASON_TC_EGRESS, TC_EGRESS) \ EM(SKB_DROP_REASON_TC_EGRESS, TC_EGRESS) \
EM(SKB_DROP_REASON_QDISC_DROP, QDISC_DROP) \ EM(SKB_DROP_REASON_QDISC_DROP, QDISC_DROP) \
EM(SKB_DROP_REASON_CPU_BACKLOG, CPU_BACKLOG) \
EMe(SKB_DROP_REASON_MAX, MAX) EMe(SKB_DROP_REASON_MAX, MAX)
#undef EM #undef EM
......
...@@ -4570,10 +4570,12 @@ static bool skb_flow_limit(struct sk_buff *skb, unsigned int qlen) ...@@ -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, static int enqueue_to_backlog(struct sk_buff *skb, int cpu,
unsigned int *qtail) unsigned int *qtail)
{ {
enum skb_drop_reason reason;
struct softnet_data *sd; struct softnet_data *sd;
unsigned long flags; unsigned long flags;
unsigned int qlen; unsigned int qlen;
reason = SKB_DROP_REASON_NOT_SPECIFIED;
sd = &per_cpu(softnet_data, cpu); sd = &per_cpu(softnet_data, cpu);
rps_lock_irqsave(sd, &flags); rps_lock_irqsave(sd, &flags);
...@@ -4596,13 +4598,14 @@ static int enqueue_to_backlog(struct sk_buff *skb, int cpu, ...@@ -4596,13 +4598,14 @@ static int enqueue_to_backlog(struct sk_buff *skb, int cpu,
napi_schedule_rps(sd); napi_schedule_rps(sd);
goto enqueue; goto enqueue;
} }
reason = SKB_DROP_REASON_CPU_BACKLOG;
drop: drop:
sd->dropped++; sd->dropped++;
rps_unlock_irq_restore(sd, &flags); rps_unlock_irq_restore(sd, &flags);
atomic_long_inc(&skb->dev->rx_dropped); atomic_long_inc(&skb->dev->rx_dropped);
kfree_skb(skb); kfree_skb_reason(skb, reason);
return NET_RX_DROP; return NET_RX_DROP;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment