| From 050cb475e19ff391832766814501862e46088481 Mon Sep 17 00:00:00 2001 |
| From: Eric Dumazet <edumazet@google.com> |
| Date: Wed, 12 Jun 2019 09:52:33 -0700 |
| Subject: [PATCH] net/packet: introduce packet_rcv_try_clear_pressure() helper |
| |
| commit 9bb6cd652454969fa0ae6c52c8ebd31472d0171c upstream. |
| |
| There are two places where we want to clear the pressure |
| if possible, add a helper to make it more obvious. |
| |
| Signed-off-by: Eric Dumazet <edumazet@google.com> |
| Suggested-by: Willem de Bruijn <willemb@google.com> |
| Acked-by: Vinicius Costa Gomes <vinicius.gomes@intel.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c |
| index d0ab6bbbb75c..bba78d238631 100644 |
| --- a/net/packet/af_packet.c |
| +++ b/net/packet/af_packet.c |
| @@ -1273,6 +1273,13 @@ static int packet_rcv_has_room(struct packet_sock *po, struct sk_buff *skb) |
| return ret; |
| } |
| |
| +static void packet_rcv_try_clear_pressure(struct packet_sock *po) |
| +{ |
| + if (READ_ONCE(po->pressure) && |
| + __packet_rcv_has_room(po, NULL) == ROOM_NORMAL) |
| + WRITE_ONCE(po->pressure, 0); |
| +} |
| + |
| static void packet_sock_destruct(struct sock *sk) |
| { |
| skb_queue_purge(&sk->sk_error_queue); |
| @@ -3349,8 +3356,7 @@ static int packet_recvmsg(struct socket *sock, struct msghdr *msg, size_t len, |
| if (skb == NULL) |
| goto out; |
| |
| - if (READ_ONCE(pkt_sk(sk)->pressure)) |
| - packet_rcv_has_room(pkt_sk(sk), NULL); |
| + packet_rcv_try_clear_pressure(pkt_sk(sk)); |
| |
| if (pkt_sk(sk)->has_vnet_hdr) { |
| err = packet_rcv_vnet(msg, skb, &len); |
| @@ -4168,8 +4174,7 @@ static __poll_t packet_poll(struct file *file, struct socket *sock, |
| TP_STATUS_KERNEL)) |
| mask |= EPOLLIN | EPOLLRDNORM; |
| } |
| - if (READ_ONCE(po->pressure) && __packet_rcv_has_room(po, NULL) == ROOM_NORMAL) |
| - WRITE_ONCE(po->pressure, 0); |
| + packet_rcv_try_clear_pressure(po); |
| spin_unlock_bh(&sk->sk_receive_queue.lock); |
| spin_lock_bh(&sk->sk_write_queue.lock); |
| if (po->tx_ring.pg_vec) { |
| -- |
| 2.27.0 |
| |