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

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
...@@ -340,14 +340,14 @@ static void __register_prot_hook(struct sock *sk) ...@@ -340,14 +340,14 @@ static void __register_prot_hook(struct sock *sk)
{ {
struct packet_sock *po = pkt_sk(sk); struct packet_sock *po = pkt_sk(sk);
if (!po->running) { if (!packet_sock_flag(po, PACKET_SOCK_RUNNING)) {
if (po->fanout) if (po->fanout)
__fanout_link(sk, po); __fanout_link(sk, po);
else else
dev_add_pack(&po->prot_hook); dev_add_pack(&po->prot_hook);
sock_hold(sk); 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) ...@@ -369,7 +369,7 @@ static void __unregister_prot_hook(struct sock *sk, bool sync)
lockdep_assert_held_once(&po->bind_lock); lockdep_assert_held_once(&po->bind_lock);
po->running = 0; packet_sock_flag_set(po, PACKET_SOCK_RUNNING, 0);
if (po->fanout) if (po->fanout)
__fanout_unlink(sk, po); __fanout_unlink(sk, po);
...@@ -389,7 +389,7 @@ static void unregister_prot_hook(struct sock *sk, bool sync) ...@@ -389,7 +389,7 @@ static void unregister_prot_hook(struct sock *sk, bool sync)
{ {
struct packet_sock *po = pkt_sk(sk); struct packet_sock *po = pkt_sk(sk);
if (po->running) if (packet_sock_flag(po, PACKET_SOCK_RUNNING))
__unregister_prot_hook(sk, sync); __unregister_prot_hook(sk, sync);
} }
...@@ -1782,7 +1782,7 @@ static int fanout_add(struct sock *sk, struct fanout_args *args) ...@@ -1782,7 +1782,7 @@ static int fanout_add(struct sock *sk, struct fanout_args *args)
err = -EINVAL; err = -EINVAL;
spin_lock(&po->bind_lock); spin_lock(&po->bind_lock);
if (po->running && if (packet_sock_flag(po, PACKET_SOCK_RUNNING) &&
match->type == type && match->type == type &&
match->prot_hook.type == po->prot_hook.type && match->prot_hook.type == po->prot_hook.type &&
match->prot_hook.dev == po->prot_hook.dev) { 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, ...@@ -3222,7 +3222,7 @@ static int packet_do_bind(struct sock *sk, const char *name, int ifindex,
if (need_rehook) { if (need_rehook) {
dev_hold(dev); dev_hold(dev);
if (po->running) { if (packet_sock_flag(po, PACKET_SOCK_RUNNING)) {
rcu_read_unlock(); rcu_read_unlock();
/* prevents packet_notifier() from calling /* prevents packet_notifier() from calling
* register_prot_hook() * register_prot_hook()
...@@ -3235,7 +3235,7 @@ static int packet_do_bind(struct sock *sk, const char *name, int ifindex, ...@@ -3235,7 +3235,7 @@ static int packet_do_bind(struct sock *sk, const char *name, int ifindex,
dev->ifindex); dev->ifindex);
} }
BUG_ON(po->running); BUG_ON(packet_sock_flag(po, PACKET_SOCK_RUNNING));
WRITE_ONCE(po->num, proto); WRITE_ONCE(po->num, proto);
po->prot_hook.type = proto; po->prot_hook.type = proto;
...@@ -4159,7 +4159,7 @@ static int packet_notifier(struct notifier_block *this, ...@@ -4159,7 +4159,7 @@ static int packet_notifier(struct notifier_block *this,
case NETDEV_DOWN: case NETDEV_DOWN:
if (dev->ifindex == po->ifindex) { if (dev->ifindex == po->ifindex) {
spin_lock(&po->bind_lock); spin_lock(&po->bind_lock);
if (po->running) { if (packet_sock_flag(po, PACKET_SOCK_RUNNING)) {
__unregister_prot_hook(sk, false); __unregister_prot_hook(sk, false);
sk->sk_err = ENETDOWN; sk->sk_err = ENETDOWN;
if (!sock_flag(sk, SOCK_DEAD)) if (!sock_flag(sk, SOCK_DEAD))
...@@ -4470,7 +4470,7 @@ static int packet_set_ring(struct sock *sk, union tpacket_req_u *req_u, ...@@ -4470,7 +4470,7 @@ static int packet_set_ring(struct sock *sk, union tpacket_req_u *req_u,
/* Detach socket from network */ /* Detach socket from network */
spin_lock(&po->bind_lock); spin_lock(&po->bind_lock);
was_running = po->running; was_running = packet_sock_flag(po, PACKET_SOCK_RUNNING);
num = po->num; num = po->num;
if (was_running) { if (was_running) {
WRITE_ONCE(po->num, 0); WRITE_ONCE(po->num, 0);
...@@ -4681,7 +4681,7 @@ static int packet_seq_show(struct seq_file *seq, void *v) ...@@ -4681,7 +4681,7 @@ static int packet_seq_show(struct seq_file *seq, void *v)
s->sk_type, s->sk_type,
ntohs(READ_ONCE(po->num)), ntohs(READ_ONCE(po->num)),
READ_ONCE(po->ifindex), READ_ONCE(po->ifindex),
po->running, packet_sock_flag(po, PACKET_SOCK_RUNNING),
atomic_read(&s->sk_rmem_alloc), atomic_read(&s->sk_rmem_alloc),
from_kuid_munged(seq_user_ns(seq), sock_i_uid(s)), from_kuid_munged(seq_user_ns(seq), sock_i_uid(s)),
sock_i_ino(s)); sock_i_ino(s));
......
...@@ -21,7 +21,7 @@ static int pdiag_put_info(const struct packet_sock *po, struct sk_buff *nlskb) ...@@ -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_tstamp = READ_ONCE(po->tp_tstamp);
pinfo.pdi_flags = 0; pinfo.pdi_flags = 0;
if (po->running) if (packet_sock_flag(po, PACKET_SOCK_RUNNING))
pinfo.pdi_flags |= PDI_RUNNING; pinfo.pdi_flags |= PDI_RUNNING;
if (packet_sock_flag(po, PACKET_SOCK_AUXDATA)) if (packet_sock_flag(po, PACKET_SOCK_AUXDATA))
pinfo.pdi_flags |= PDI_AUXDATA; pinfo.pdi_flags |= PDI_AUXDATA;
......
...@@ -117,7 +117,6 @@ struct packet_sock { ...@@ -117,7 +117,6 @@ struct packet_sock {
spinlock_t bind_lock; spinlock_t bind_lock;
struct mutex pg_vec_lock; struct mutex pg_vec_lock;
unsigned long flags; unsigned long flags;
unsigned int running; /* bind_lock must be held */
int pressure; int pressure;
int ifindex; /* bound device */ int ifindex; /* bound device */
__be16 num; __be16 num;
...@@ -146,6 +145,7 @@ enum packet_sock_flags { ...@@ -146,6 +145,7 @@ enum packet_sock_flags {
PACKET_SOCK_TX_HAS_OFF, PACKET_SOCK_TX_HAS_OFF,
PACKET_SOCK_TP_LOSS, PACKET_SOCK_TP_LOSS,
PACKET_SOCK_HAS_VNET_HDR, PACKET_SOCK_HAS_VNET_HDR,
PACKET_SOCK_RUNNING,
}; };
static inline void packet_sock_flag_set(struct packet_sock *po, static inline void packet_sock_flag_set(struct packet_sock *po,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment