net/packet: convert po->running to an atomic flag
authorEric Dumazet <edumazet@google.com>
Thu, 16 Mar 2023 01:10:13 +0000 (01:10 +0000)
committerDavid S. Miller <davem@davemloft.net>
Fri, 17 Mar 2023 08:52:06 +0000 (08:52 +0000)
Instead of consuming 32 bits for po->running, use
one available bit in po->flags.

Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/packet/af_packet.c
net/packet/diag.c
net/packet/internal.h

index 5a6b05e..ec44645 100644 (file)
@@ -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));
index 56240aa..de4ced5 100644 (file)
@@ -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;
index 2521176..58f042c 100644 (file)
@@ -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,