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