static int rtentry_zinit(void *mem, int size, int how) { struct rtentry *rt = mem; rt->rt_pksent = counter_u64_alloc(how); if (rt->rt_pksent == NULL) return (ENOMEM); RT_LOCK_INIT(rt); return (0); }
int mp_ring_alloc(struct mp_ring **pr, int size, void *cookie, ring_drain_t drain, ring_can_drain_t can_drain, struct malloc_type *mt, int flags) { struct mp_ring *r; /* All idx are 16b so size can be 65536 at most */ if (pr == NULL || size < 2 || size > 65536 || drain == NULL || can_drain == NULL) return (EINVAL); *pr = NULL; flags &= M_NOWAIT | M_WAITOK; MPASS(flags != 0); r = malloc(__offsetof(struct mp_ring, items[size]), mt, flags | M_ZERO); if (r == NULL) return (ENOMEM); r->size = size; r->cookie = cookie; r->mt = mt; r->drain = drain; r->can_drain = can_drain; r->enqueues = counter_u64_alloc(flags); r->drops = counter_u64_alloc(flags); r->starts = counter_u64_alloc(flags); r->stalls = counter_u64_alloc(flags); r->restarts = counter_u64_alloc(flags); r->abdications = counter_u64_alloc(flags); if (r->enqueues == NULL || r->drops == NULL || r->starts == NULL || r->stalls == NULL || r->restarts == NULL || r->abdications == NULL) { mp_ring_free(r); return (ENOMEM); } *pr = r; return (0); }