Commit 791a3e9f authored by Eric Dumazet's avatar Eric Dumazet Committed by David S. Miller
Browse files

net/packet: convert po->pressure to an atomic flag



Not only this removes some READ_ONCE()/WRITE_ONCE(),
this also removes one integer.

Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 61edf479
Loading
Loading
Loading
Loading
+8 −6
Original line number Diff line number Diff line
@@ -1307,22 +1307,23 @@ static int __packet_rcv_has_room(const struct packet_sock *po,

static int packet_rcv_has_room(struct packet_sock *po, struct sk_buff *skb)
{
	int pressure, ret;
	bool pressure;
	int ret;

	ret = __packet_rcv_has_room(po, skb);
	pressure = ret != ROOM_NORMAL;

	if (READ_ONCE(po->pressure) != pressure)
		WRITE_ONCE(po->pressure, pressure);
	if (packet_sock_flag(po, PACKET_SOCK_PRESSURE) != pressure)
		packet_sock_flag_set(po, PACKET_SOCK_PRESSURE, pressure);

	return ret;
}

static void packet_rcv_try_clear_pressure(struct packet_sock *po)
{
	if (READ_ONCE(po->pressure) &&
	if (packet_sock_flag(po, PACKET_SOCK_PRESSURE) &&
	    __packet_rcv_has_room(po, NULL) == ROOM_NORMAL)
		WRITE_ONCE(po->pressure,  0);
		packet_sock_flag_set(po, PACKET_SOCK_PRESSURE, false);
}

static void packet_sock_destruct(struct sock *sk)
@@ -1409,7 +1410,8 @@ static unsigned int fanout_demux_rollover(struct packet_fanout *f,
	i = j = min_t(int, po->rollover->sock, num - 1);
	do {
		po_next = pkt_sk(rcu_dereference(f->arr[i]));
		if (po_next != po_skip && !READ_ONCE(po_next->pressure) &&
		if (po_next != po_skip &&
		    !packet_sock_flag(po_next, PACKET_SOCK_PRESSURE) &&
		    packet_rcv_has_room(po_next, skb) == ROOM_NORMAL) {
			if (i != j)
				po->rollover->sock = i;
+1 −1
Original line number Diff line number Diff line
@@ -117,7 +117,6 @@ struct packet_sock {
	spinlock_t		bind_lock;
	struct mutex		pg_vec_lock;
	unsigned long		flags;
	int			pressure;
	int			ifindex;	/* bound device		*/
	__be16			num;
	struct packet_rollover	*rollover;
@@ -146,6 +145,7 @@ enum packet_sock_flags {
	PACKET_SOCK_TP_LOSS,
	PACKET_SOCK_HAS_VNET_HDR,
	PACKET_SOCK_RUNNING,
	PACKET_SOCK_PRESSURE,
};

static inline void packet_sock_flag_set(struct packet_sock *po,