2017-11-03 5:16 GMT+01:00 Willem de Bruijn <willemdebruijn.ker...@gmail.com>: >> +/** >> + * tp4q_enqueue_from_array - Enqueue entries from packet array to tp4 queue >> + * >> + * @a: Pointer to the packet array to enqueue from >> + * @dcnt: Max number of entries to enqueue >> + * >> + * Returns 0 for success or an errno at failure >> + **/ >> +static inline int tp4q_enqueue_from_array(struct tp4_packet_array *a, >> + u32 dcnt) >> +{ >> + struct tp4_queue *q = a->tp4q; >> + unsigned int used_idx = q->used_idx; >> + struct tpacket4_desc *d = a->items; >> + int i; >> + >> + if (q->num_free < dcnt) >> + return -ENOSPC; >> + >> + q->num_free -= dcnt; > > perhaps annotate with a lockdep_is_held to document which lock > ensures mutual exclusion on the ring. Different for tx and rx? >
Good idea. I'll give that a try! >> diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c >> index b39be424ec0e..190598eb3461 100644 >> --- a/net/packet/af_packet.c >> +++ b/net/packet/af_packet.c >> @@ -189,6 +189,9 @@ static int packet_set_ring(struct sock *sk, union >> tpacket_req_u *req_u, >> #define BLOCK_O2PRIV(x) ((x)->offset_to_priv) >> #define BLOCK_PRIV(x) ((void *)((char *)(x) + BLOCK_O2PRIV(x))) >> >> +#define RX_RING 0 >> +#define TX_RING 1 >> + > > Not needed if using bool for tx_ring below. The test effectively already > treats it as bool: does not explicitly test these constants. > >> +static void packet_clear_ring(struct sock *sk, int tx_ring) >> +{ >> + struct packet_sock *po = pkt_sk(sk); >> + struct packet_ring_buffer *rb; >> + union tpacket_req_u req_u; >> + >> + rb = tx_ring ? &po->tx_ring : &po->rx_ring; > > > I meant here. Yup, I'll remove/clean this up. Björn