Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 54d7c01d authored by Willem de Bruijn's avatar Willem de Bruijn Committed by David S. Miller
Browse files

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: default avatarDavid S. Miller <davem@davemloft.net>
Signed-off-by: default avatarWillem de Bruijn <willemb@google.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 4ffd3c73
Loading
Loading
Loading
Loading
+5 −10
Original line number Diff line number Diff line
@@ -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 {
	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) {