mp_ring
struct mp_ring;
struct mp_ring *r; /* tx software ring */
increment_idx(struct mp_ring *r, uint16_t idx, uint16_t n)
drain_ring(struct mp_ring *r, int budget)
drain_txpkts(struct mp_ring *r, union ring_state os, int budget)
mp_ring_alloc(struct mp_ring **pr, int size, void *cookie, ring_drain_t drain,
struct mp_ring *r;
r = malloc(__offsetof(struct mp_ring, items[size]), mt, flags | M_ZERO);
mp_ring_free(struct mp_ring *r)
mp_ring_enqueue(struct mp_ring *r, void **items, int n, int budget)
mp_ring_enqueue_only(struct mp_ring *r, void **items, int n)
mp_ring_check_drainage(struct mp_ring *r, int budget)
mp_ring_reset_stats(struct mp_ring *r)
mp_ring_is_idle(struct mp_ring *r)
mp_ring_sysctls(struct mp_ring *r, struct sysctl_ctx_list *ctx,
space_available(struct mp_ring *r, union ring_state s)
struct mp_ring;
typedef u_int (*ring_drain_t)(struct mp_ring *, u_int, u_int, bool *);
typedef u_int (*ring_can_drain_t)(struct mp_ring *);
int mp_ring_alloc(struct mp_ring **, int, void *, ring_drain_t,
void mp_ring_free(struct mp_ring *);
int mp_ring_enqueue(struct mp_ring *, void **, int, int);
int mp_ring_enqueue_only(struct mp_ring *, void **, int);
void mp_ring_check_drainage(struct mp_ring *, int);
void mp_ring_reset_stats(struct mp_ring *);
bool mp_ring_is_idle(struct mp_ring *);
void mp_ring_sysctls(struct mp_ring *, struct sysctl_ctx_list *,
can_resume_eth_tx(struct mp_ring *r)
eth_tx(struct mp_ring *r, u_int cidx, u_int pidx, bool *coalescing)