xref: /freebsd/sys/dev/cxgbe/t4_mp_ring.h (revision 95ee2897e98f5d444f26ed2334cc7c439f9c16c6)
17951040fSNavdeep Parhar /*-
27951040fSNavdeep Parhar  * Copyright (c) 2014 Chelsio Communications, Inc.
37951040fSNavdeep Parhar  * All rights reserved.
47951040fSNavdeep Parhar  * Written by: Navdeep Parhar <np@FreeBSD.org>
57951040fSNavdeep Parhar  *
67951040fSNavdeep Parhar  * Redistribution and use in source and binary forms, with or without
77951040fSNavdeep Parhar  * modification, are permitted provided that the following conditions
87951040fSNavdeep Parhar  * are met:
97951040fSNavdeep Parhar  * 1. Redistributions of source code must retain the above copyright
107951040fSNavdeep Parhar  *    notice, this list of conditions and the following disclaimer.
117951040fSNavdeep Parhar  * 2. Redistributions in binary form must reproduce the above copyright
127951040fSNavdeep Parhar  *    notice, this list of conditions and the following disclaimer in the
137951040fSNavdeep Parhar  *    documentation and/or other materials provided with the distribution.
147951040fSNavdeep Parhar  *
157951040fSNavdeep Parhar  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
167951040fSNavdeep Parhar  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
177951040fSNavdeep Parhar  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
187951040fSNavdeep Parhar  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
197951040fSNavdeep Parhar  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
207951040fSNavdeep Parhar  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
217951040fSNavdeep Parhar  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
227951040fSNavdeep Parhar  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
237951040fSNavdeep Parhar  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
247951040fSNavdeep Parhar  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
257951040fSNavdeep Parhar  * SUCH DAMAGE.
267951040fSNavdeep Parhar  *
277951040fSNavdeep Parhar  */
287951040fSNavdeep Parhar 
297951040fSNavdeep Parhar #ifndef __CXGBE_MP_RING_H
307951040fSNavdeep Parhar #define __CXGBE_MP_RING_H
317951040fSNavdeep Parhar 
327951040fSNavdeep Parhar #ifndef _KERNEL
337951040fSNavdeep Parhar #error "no user-serviceable parts inside"
347951040fSNavdeep Parhar #endif
357951040fSNavdeep Parhar 
367951040fSNavdeep Parhar struct mp_ring;
37*d735920dSNavdeep Parhar typedef u_int (*ring_drain_t)(struct mp_ring *, u_int, u_int, bool *);
387951040fSNavdeep Parhar typedef u_int (*ring_can_drain_t)(struct mp_ring *);
397951040fSNavdeep Parhar 
407951040fSNavdeep Parhar struct mp_ring {
417951040fSNavdeep Parhar 	volatile uint64_t	state __aligned(CACHE_LINE_SIZE);
42*d735920dSNavdeep Parhar 	struct malloc_type *	mt;
437951040fSNavdeep Parhar 
447951040fSNavdeep Parhar 	int			size __aligned(CACHE_LINE_SIZE);
457951040fSNavdeep Parhar 	void *			cookie;
467951040fSNavdeep Parhar 	ring_drain_t		drain;
477951040fSNavdeep Parhar 	ring_can_drain_t	can_drain;	/* cheap, may be unreliable */
48*d735920dSNavdeep Parhar 	struct mtx *		cons_lock;
49*d735920dSNavdeep Parhar 	counter_u64_t		dropped;
50*d735920dSNavdeep Parhar 	counter_u64_t		consumer[4];
51*d735920dSNavdeep Parhar 	counter_u64_t		not_consumer;
527951040fSNavdeep Parhar 	counter_u64_t		abdications;
53*d735920dSNavdeep Parhar 	counter_u64_t		consumed;
54*d735920dSNavdeep Parhar 	counter_u64_t		cons_idle;
55*d735920dSNavdeep Parhar 	counter_u64_t		cons_idle2;
56*d735920dSNavdeep Parhar 	counter_u64_t		stalls;
577951040fSNavdeep Parhar 
587951040fSNavdeep Parhar 	void * volatile		items[] __aligned(CACHE_LINE_SIZE);
597951040fSNavdeep Parhar };
607951040fSNavdeep Parhar 
617951040fSNavdeep Parhar int mp_ring_alloc(struct mp_ring **, int, void *, ring_drain_t,
62*d735920dSNavdeep Parhar     ring_can_drain_t, struct malloc_type *, struct mtx *, int);
637951040fSNavdeep Parhar void mp_ring_free(struct mp_ring *);
647951040fSNavdeep Parhar int mp_ring_enqueue(struct mp_ring *, void **, int, int);
657951040fSNavdeep Parhar void mp_ring_check_drainage(struct mp_ring *, int);
667951040fSNavdeep Parhar void mp_ring_reset_stats(struct mp_ring *);
67*d735920dSNavdeep Parhar bool mp_ring_is_idle(struct mp_ring *);
68*d735920dSNavdeep Parhar void mp_ring_sysctls(struct mp_ring *, struct sysctl_ctx_list *,
69*d735920dSNavdeep Parhar     struct sysctl_oid_list *);
707951040fSNavdeep Parhar 
717951040fSNavdeep Parhar #endif
72