From 54d7c01d3ed699cfc213115eaecfe1175cfaff8f Mon Sep 17 00:00:00 2001 From: Willem de Bruijn Date: Thu, 14 May 2015 15:25:02 -0400 Subject: [PATCH] packet: fix warnings in rollover lock contention 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 Signed-off-by: Willem de Bruijn Signed-off-by: David S. Miller --- 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 31d58565726c..c30d14781576 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) { -- GitLab