Skip to content

Commit

Permalink
packet: rollover prepare: per-socket state
Browse files Browse the repository at this point in the history
Replace rollover state per fanout group with state per socket. Future
patches will add fields to the new structure.

Signed-off-by: Willem de Bruijn <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
  • Loading branch information
wdebruij authored and davem330 committed May 13, 2015
1 parent ad377ca commit 0648ab7
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 4 deletions.
21 changes: 18 additions & 3 deletions net/packet/af_packet.c
Original file line number Diff line number Diff line change
Expand Up @@ -1321,16 +1321,18 @@ static unsigned int fanout_demux_rollover(struct packet_fanout *f,
unsigned int idx, bool try_self,
unsigned int num)
{
struct packet_sock *po;
unsigned int i, j;

if (try_self && packet_rcv_has_room(pkt_sk(f->arr[idx]), skb))
po = pkt_sk(f->arr[idx]);
if (try_self && packet_rcv_has_room(po, skb))
return idx;

i = j = min_t(int, f->next[idx], num - 1);
i = j = min_t(int, po->rollover->sock, num - 1);
do {
if (i != idx && packet_rcv_has_room(pkt_sk(f->arr[i]), skb)) {
if (i != j)
f->next[idx] = i;
po->rollover->sock = i;
return i;
}

Expand Down Expand Up @@ -1468,6 +1470,12 @@ static int fanout_add(struct sock *sk, u16 id, u16 type_flags)
if (po->fanout)
return -EALREADY;

if (type_flags & PACKET_FANOUT_FLAG_ROLLOVER) {
po->rollover = kzalloc(sizeof(*po->rollover), GFP_KERNEL);
if (!po->rollover)
return -ENOMEM;
}

mutex_lock(&fanout_mutex);
match = NULL;
list_for_each_entry(f, &fanout_list, list) {
Expand Down Expand Up @@ -1516,6 +1524,10 @@ static int fanout_add(struct sock *sk, u16 id, u16 type_flags)
}
out:
mutex_unlock(&fanout_mutex);
if (err) {
kfree(po->rollover);
po->rollover = NULL;
}
return err;
}

Expand All @@ -1537,6 +1549,8 @@ static void fanout_release(struct sock *sk)
kfree(f);
}
mutex_unlock(&fanout_mutex);

kfree(po->rollover);
}

static const struct proto_ops packet_ops;
Expand Down Expand Up @@ -2866,6 +2880,7 @@ static int packet_create(struct net *net, struct socket *sock, int protocol,

spin_lock_init(&po->bind_lock);
mutex_init(&po->pg_vec_lock);
po->rollover = NULL;
po->prot_hook.func = packet_rcv;

if (sock->type == SOCK_PACKET)
Expand Down
6 changes: 5 additions & 1 deletion net/packet/internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -82,12 +82,15 @@ struct packet_fanout {
atomic_t rr_cur;
struct list_head list;
struct sock *arr[PACKET_FANOUT_MAX];
int next[PACKET_FANOUT_MAX];
spinlock_t lock;
atomic_t sk_ref;
struct packet_type prot_hook ____cacheline_aligned_in_smp;
};

struct packet_rollover {
int sock;
} ____cacheline_aligned_in_smp;

struct packet_sock {
/* struct sock has to be the first member of packet_sock */
struct sock sk;
Expand All @@ -104,6 +107,7 @@ struct packet_sock {
has_vnet_hdr:1;
int ifindex; /* bound device */
__be16 num;
struct packet_rollover *rollover;
struct packet_mclist *mclist;
atomic_t mapped;
enum tpacket_versions tp_version;
Expand Down

0 comments on commit 0648ab7

Please sign in to comment.