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: Eric Dumazet <edumazet@google.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
50d935eafe
commit
61edf47981
@ -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)
|
|||||||
|
|
||||||
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)
|
|||||||
{
|
{
|
||||||
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)
|
|||||||
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,
|
|||||||
|
|
||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
|
|
||||||
/* 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)
|
|||||||
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)
|
|||||||
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 {
|
|||||||
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 {
|
|||||||
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,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user