Commit 164bddac authored by Eric Dumazet's avatar Eric Dumazet Committed by David S. Miller
Browse files

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



tp_loss can be read locklessly.

Convert it to an atomic flag to avoid races.

Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 74383446
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -2843,7 +2843,7 @@ static int tpacket_snd(struct packet_sock *po, struct msghdr *msg)

		if (unlikely(tp_len < 0)) {
tpacket_error:
			if (po->tp_loss) {
			if (packet_sock_flag(po, PACKET_SOCK_TP_LOSS)) {
				__packet_set_status(po, ph,
						TP_STATUS_AVAILABLE);
				packet_increment_head(&po->tx_ring);
@@ -3886,7 +3886,7 @@ packet_setsockopt(struct socket *sock, int level, int optname, sockptr_t optval,
		if (po->rx_ring.pg_vec || po->tx_ring.pg_vec) {
			ret = -EBUSY;
		} else {
			po->tp_loss = !!val;
			packet_sock_flag_set(po, PACKET_SOCK_TP_LOSS, val);
			ret = 0;
		}
		release_sock(sk);
@@ -4095,7 +4095,7 @@ static int packet_getsockopt(struct socket *sock, int level, int optname,
		val = po->tp_reserve;
		break;
	case PACKET_LOSS:
		val = po->tp_loss;
		val = packet_sock_flag(po, PACKET_SOCK_TP_LOSS);
		break;
	case PACKET_TIMESTAMP:
		val = READ_ONCE(po->tp_tstamp);
+1 −1
Original line number Diff line number Diff line
@@ -29,7 +29,7 @@ static int pdiag_put_info(const struct packet_sock *po, struct sk_buff *nlskb)
		pinfo.pdi_flags |= PDI_ORIGDEV;
	if (po->has_vnet_hdr)
		pinfo.pdi_flags |= PDI_VNETHDR;
	if (po->tp_loss)
	if (packet_sock_flag(po, PACKET_SOCK_TP_LOSS))
		pinfo.pdi_flags |= PDI_LOSS;

	return nla_put(nlskb, PACKET_DIAG_INFO, sizeof(pinfo), &pinfo);
+2 −2
Original line number Diff line number Diff line
@@ -118,8 +118,7 @@ struct packet_sock {
	struct mutex		pg_vec_lock;
	unsigned long		flags;
	unsigned int		running;	/* bind_lock must be held */
	unsigned int		has_vnet_hdr:1, /* writer must hold sock lock */
				tp_loss:1;
	unsigned int		has_vnet_hdr:1; /* writer must hold sock lock */
	int			pressure;
	int			ifindex;	/* bound device		*/
	__be16			num;
@@ -146,6 +145,7 @@ enum packet_sock_flags {
	PACKET_SOCK_ORIGDEV,
	PACKET_SOCK_AUXDATA,
	PACKET_SOCK_TX_HAS_OFF,
	PACKET_SOCK_TP_LOSS,
};

static inline void packet_sock_flag_set(struct packet_sock *po,