Commit 61edf479 authored by Eric Dumazet's avatar Eric Dumazet Committed by David S. Miller
Browse files

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



Instead of consuming 32 bits for po->running, use
one available bit in po->flags.

Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 50d935ea
Loading
Loading
Loading
Loading
+10 −10
Original line number Diff line number Diff line
@@ -340,14 +340,14 @@ static void __register_prot_hook(struct sock *sk)
{
	struct packet_sock *po = pkt_sk(sk);

	if (!po->running) {
	if (!packet_sock_flag(po, PACKET_SOCK_RUNNING)) {
		if (po->fanout)
			__fanout_link(sk, po);
		else
			dev_add_pack(&po->prot_hook);

		sock_hold(sk);
		po->running = 1;
		packet_sock_flag_set(po, PACKET_SOCK_RUNNING, 1);
	}
}

@@ -369,7 +369,7 @@ static void __unregister_prot_hook(struct sock *sk, bool sync)

	lockdep_assert_held_once(&po->bind_lock);

	po->running = 0;
	packet_sock_flag_set(po, PACKET_SOCK_RUNNING, 0);

	if (po->fanout)
		__fanout_unlink(sk, po);
@@ -389,7 +389,7 @@ static void unregister_prot_hook(struct sock *sk, bool sync)
{
	struct packet_sock *po = pkt_sk(sk);

	if (po->running)
	if (packet_sock_flag(po, PACKET_SOCK_RUNNING))
		__unregister_prot_hook(sk, sync);
}

@@ -1782,7 +1782,7 @@ static int fanout_add(struct sock *sk, struct fanout_args *args)
	err = -EINVAL;

	spin_lock(&po->bind_lock);
	if (po->running &&
	if (packet_sock_flag(po, PACKET_SOCK_RUNNING) &&
	    match->type == type &&
	    match->prot_hook.type == po->prot_hook.type &&
	    match->prot_hook.dev == po->prot_hook.dev) {
@@ -3222,7 +3222,7 @@ static int packet_do_bind(struct sock *sk, const char *name, int ifindex,

	if (need_rehook) {
		dev_hold(dev);
		if (po->running) {
		if (packet_sock_flag(po, PACKET_SOCK_RUNNING)) {
			rcu_read_unlock();
			/* prevents packet_notifier() from calling
			 * register_prot_hook()
@@ -3235,7 +3235,7 @@ static int packet_do_bind(struct sock *sk, const char *name, int ifindex,
								 dev->ifindex);
		}

		BUG_ON(po->running);
		BUG_ON(packet_sock_flag(po, PACKET_SOCK_RUNNING));
		WRITE_ONCE(po->num, proto);
		po->prot_hook.type = proto;

@@ -4159,7 +4159,7 @@ static int packet_notifier(struct notifier_block *this,
		case NETDEV_DOWN:
			if (dev->ifindex == po->ifindex) {
				spin_lock(&po->bind_lock);
				if (po->running) {
				if (packet_sock_flag(po, PACKET_SOCK_RUNNING)) {
					__unregister_prot_hook(sk, false);
					sk->sk_err = ENETDOWN;
					if (!sock_flag(sk, SOCK_DEAD))
@@ -4470,7 +4470,7 @@ static int packet_set_ring(struct sock *sk, union tpacket_req_u *req_u,

	/* Detach socket from network */
	spin_lock(&po->bind_lock);
	was_running = po->running;
	was_running = packet_sock_flag(po, PACKET_SOCK_RUNNING);
	num = po->num;
	if (was_running) {
		WRITE_ONCE(po->num, 0);
@@ -4681,7 +4681,7 @@ static int packet_seq_show(struct seq_file *seq, void *v)
			   s->sk_type,
			   ntohs(READ_ONCE(po->num)),
			   READ_ONCE(po->ifindex),
			   po->running,
			   packet_sock_flag(po, PACKET_SOCK_RUNNING),
			   atomic_read(&s->sk_rmem_alloc),
			   from_kuid_munged(seq_user_ns(seq), sock_i_uid(s)),
			   sock_i_ino(s));
+1 −1
Original line number Diff line number Diff line
@@ -21,7 +21,7 @@ static int pdiag_put_info(const struct packet_sock *po, struct sk_buff *nlskb)
	pinfo.pdi_tstamp = READ_ONCE(po->tp_tstamp);

	pinfo.pdi_flags = 0;
	if (po->running)
	if (packet_sock_flag(po, PACKET_SOCK_RUNNING))
		pinfo.pdi_flags |= PDI_RUNNING;
	if (packet_sock_flag(po, PACKET_SOCK_AUXDATA))
		pinfo.pdi_flags |= PDI_AUXDATA;
+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;
	unsigned int		running;	/* bind_lock must be held */
	int			pressure;
	int			ifindex;	/* bound device		*/
	__be16			num;
@@ -146,6 +145,7 @@ enum packet_sock_flags {
	PACKET_SOCK_TX_HAS_OFF,
	PACKET_SOCK_TP_LOSS,
	PACKET_SOCK_HAS_VNET_HDR,
	PACKET_SOCK_RUNNING,
};

static inline void packet_sock_flag_set(struct packet_sock *po,