packet: add a generic drop reason for receive
Subsystems (3)
PATCH v4 1/1 packet: add a generic drop reason for receive
Commit da37845fdce2 ("packet: uses kfree_skb() for errors.") switches from consume_skb to kfree_skb to improve error handling. However, this could bring a lot of noises when we monitor real packet drops in kfree_skb[1], because in tpacket_rcv or packet_rcv only packet clones can be freed, not actual packets.
Adding a generic drop reason to allow distinguish these "clone drops".
[1]: https://lore.kernel.org/netdev/CABWYdi00L+O30Q=Zah28QwZ_5RU-xcxLFUK2Zj08A8MrLk9jzg@mail.gmail.com/
---v3->v4: code style amend suggested by Willem de Bruijn v2->v3: removed an unused variablev1->v2: fixups suggested by Eric Dumazet
v3: https://lore.kernel.org/lkml/[email protected]/
v2: https://lore.kernel.org/netdev/[email protected]/
v1: https://lore.kernel.org/netdev/[email protected]/
--- include/net/dropreason-core.h | 6 ++++++ net/packet/af_packet.c | 20 +++++++------------- 2 files changed, 13 insertions(+), 13 deletions(-)
include/net/dropreason-core.h +6 -0
@@ -86,6 +86,7 @@ FN(IPV6_NDISC_NS_OTHERHOST) \ FN(QUEUE_PURGE) \ FN(TC_ERROR) \ + FN(PACKET_SOCK_ERROR) \ FNe(MAX)/**
@@ -378,6 +379,11 @@ enum skb_drop_reason {SKB_DROP_REASON_QUEUE_PURGE ,/** @SKB_DROP_REASON_TC_ERROR: generic internal tc error. */ SKB_DROP_REASON_TC_ERROR , +/** +* @SKB_DROP_REASON_PACKET_SOCK_ERROR: generic packet socket errors +* after its filter matches an incoming packet. +*/ + SKB_DROP_REASON_PACKET_SOCK_ERROR,/** * @SKB_DROP_REASON_MAX: the maximum of core drop reasons, which * shouldn't be used as a real 'reason' - only for tracing code gen
net/packet/af_packet.c +7 -13
@@ -2121,13 +2121,13 @@ static int packet_rcv_vnet(struct msghdr *msg, const struct sk_buff *skb,static int packet_rcv (struct sk_buff *skb,struct net_device *dev,struct packet_type *pt,struct net_device *orig_dev) { +enum skb_drop_reason drop_reason =SKB_CONSUMED ;struct sock *sk;struct sockaddr_ll *sll;struct packet_sock *po;u8 *skb_head = skb->data;int skb_len = skb->len;unsigned int snaplen, res; -bool is_drop_n_account = false;if (skb->pkt_type ==PACKET_LOOPBACK ) goto drop;
@@ -2217,9 +2217,9 @@ static int packet_rcv(struct sk_buff *skb, struct net_device *dev,return 0 ; drop_n_acct: - is_drop_n_account = true;atomic_inc (&po->tp_drops);atomic_inc (&sk->sk_drops); + drop_reason =SKB_DROP_REASON_PACKET_SOCK_ERROR ; drop_n_restore:if (skb_head != skb->data &&skb_shared (skb)) {
@@ -2227,16 +2227,14 @@ static int packet_rcv(struct sk_buff *skb, struct net_device *dev, skb->len = skb_len; } drop: -if (!is_drop_n_account) -consume_skb (skb); -else -kfree_skb (skb); +kfree_skb_reason (skb, drop_reason);return 0 ; }static int tpacket_rcv (struct sk_buff *skb,struct net_device *dev,struct packet_type *pt,struct net_device *orig_dev) { +enum skb_drop_reason drop_reason =SKB_CONSUMED ;struct sock *sk;struct packet_sock *po;struct sockaddr_ll *sll;
@@ -2250,7 +2248,6 @@ static int tpacket_rcv(struct sk_buff *skb, struct net_device *dev,struct sk_buff *copy_skb =NULL ;struct timespec64 ts;__u32 ts_status; -bool is_drop_n_account = false;unsigned int slot_id =0 ;int vnet_hdr_sz =0 ;
@@ -2498,19 +2495,16 @@ static int tpacket_rcv(struct sk_buff *skb, struct net_device *dev, skb->len = skb_len; } drop: -if (!is_drop_n_account) -consume_skb (skb); -else -kfree_skb (skb); +kfree_skb_reason (skb, drop_reason);return 0 ; drop_n_account:spin_unlock (&sk->sk_receive_queue.lock);atomic_inc (&po->tp_drops); - is_drop_n_account = true; + drop_reason =SKB_DROP_REASON_PACKET_SOCK_ERROR ; sk->sk_data_ready (sk); -kfree_skb (copy_skb); +kfree_skb_reason (copy_skb, drop_reason); goto drop_n_restore; }
Signature · 1 line
2.30.2
Quoted 7 lines · Yan Zhai
Commit
da37845fdce2("packet: useskfree_skb()for errors.") switches fromconsume_skbtokfree_skbto improve error handling. However, this could bring a lot of noises when we monitor real packet drops in kfree_skb[1], because intpacket_rcvorpacket_rcvonly packet clones can be freed, not actual packets.
Quoted 8 lines
Adding a generic drop reason to allow distinguish these "clone drops".
[1]: https://lore.kernel.org/netdev/CABWYdi00L+O30Q=Zah28QwZ_5RU-xcxLFUK2Zj08A8MrLk9jzg@mail.gmail.com/
Fixes da37845fdce2 ("packet: uses kfree_skb() for errors.")Suggested-by Eric Dumazet <[email protected]>Suggested-by Willem de Bruijn <[email protected]>Signed-off-by Yan Zhai <[email protected]>---
Quoted 10 lines · Eric Dumazet
Quoted 9 lines · Yan Zhai
Commit
da37845fdce2("packet: useskfree_skb()for errors.") switches fromconsume_skbtokfree_skbto improve error handling. However, this could bring a lot of noises when we monitor real packet drops in kfree_skb[1], because intpacket_rcvorpacket_rcvonly packet clones can be freed, not actual packets.Adding a generic drop reason to allow distinguish these "clone drops".
Quoted 8 lines
Quoted 6 lines
[1]: https://lore.kernel.org/netdev/CABWYdi00L+O30Q=Zah28QwZ_5RU-xcxLFUK2Zj08A8MrLk9jzg@mail.gmail.com/
Fixes da37845fdce2 ("packet: uses kfree_skb() for errors.")Suggested-by Eric Dumazet <[email protected]>Suggested-by Willem de Bruijn <[email protected]>Signed-off-by Yan Zhai <[email protected]>---
Reviewed-by Eric Dumazet <[email protected]>
This patch was applied to netdev/net-next.git (main) by Jakub Kicinski <[email protected]>:
Hello:
This patch was applied to netdev/net-next.git (main) by Jakub Kicinski <[email protected]>:
Quoted 9 lines · On Mon, 4 Dec 2023 11:33:28 -0800 you wrote:
Commit
da37845fdce2("packet: useskfree_skb()for errors.") switches fromconsume_skbtokfree_skbto improve error handling. However, this could bring a lot of noises when we monitor real packet drops in kfree_skb[1], because intpacket_rcvorpacket_rcvonly packet clones can be freed, not actual packets.Adding a generic drop reason to allow distinguish these "clone drops".
[...]
Here is the summary with links:
- [v4,net-next] packet: add a generic drop reason for receive
https://git.kernel.org/netdev/net-next/c/2f57dd94bdef
You are awesome, thank you!
Signature · 2 lines
Deet-doot-dot, I am a bot. https://korg.docs.kernel.org/patchwork/pwbot.html