[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-Id: <1431631502-19417-1-git-send-email-willemb@google.com>
Date: Thu, 14 May 2015 15:25:02 -0400
From: Willem de Bruijn <willemb@...gle.com>
To: netdev@...r.kernel.org
Cc: davem@...emloft.net, eric.dumazet@...il.com,
Willem de Bruijn <willemb@...gle.com>
Subject: [PATCH net-next v2] packet: fix warnings in rollover lock contention
From: Willem de Bruijn <willemb@...gle.com>
Avoid two xchg calls whose return values were unused, causing a
warning on some architectures.
The relevant variable is a hint and read without mutual exclusion.
This fix makes all writers hold the receive_queue lock.
Suggested-by: David S. Miller <davem@...emloft.net>
Signed-off-by: Willem de Bruijn <willemb@...gle.com>
---
net/packet/af_packet.c | 15 +++++----------
1 file changed, 5 insertions(+), 10 deletions(-)
diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c
index 31d5856..c30d147 100644
--- a/net/packet/af_packet.c
+++ b/net/packet/af_packet.c
@@ -1301,17 +1301,12 @@ static int packet_rcv_has_room(struct packet_sock *po, struct sk_buff *skb)
int ret;
bool has_room;
- if (po->prot_hook.func == tpacket_rcv) {
- spin_lock(&po->sk.sk_receive_queue.lock);
- ret = __packet_rcv_has_room(po, skb);
- spin_unlock(&po->sk.sk_receive_queue.lock);
- } else {
- ret = __packet_rcv_has_room(po, skb);
- }
-
+ spin_lock_bh(&po->sk.sk_receive_queue.lock);
+ ret = __packet_rcv_has_room(po, skb);
has_room = ret == ROOM_NORMAL;
if (po->pressure == has_room)
- xchg(&po->pressure, !has_room);
+ po->pressure = !has_room;
+ spin_unlock_bh(&po->sk.sk_receive_queue.lock);
return ret;
}
@@ -3814,7 +3809,7 @@ static unsigned int packet_poll(struct file *file, struct socket *sock,
mask |= POLLIN | POLLRDNORM;
}
if (po->pressure && __packet_rcv_has_room(po, NULL) == ROOM_NORMAL)
- xchg(&po->pressure, 0);
+ po->pressure = 0;
spin_unlock_bh(&sk->sk_receive_queue.lock);
spin_lock_bh(&sk->sk_write_queue.lock);
if (po->tx_ring.pg_vec) {
--
2.2.0.rc0.207.ga3a616c
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Powered by blists - more mailing lists