xref: /freebsd/sys/kern/subr_bufring.c (revision db7f0b974f2ab273540a458ab50929ccbb1aa581)
1db7f0b97SKip Macy /**************************************************************************
2db7f0b97SKip Macy  *
3db7f0b97SKip Macy  * Copyright (c) 2007,2008 Kip Macy kmacy@freebsd.org
4db7f0b97SKip Macy  * All rights reserved.
5db7f0b97SKip Macy  *
6db7f0b97SKip Macy  * Redistribution and use in source and binary forms, with or without
7db7f0b97SKip Macy  * modification, are permitted provided that the following conditions are met:
8db7f0b97SKip Macy  *
9db7f0b97SKip Macy  * 1. Redistributions of source code must retain the above copyright notice,
10db7f0b97SKip Macy  *    this list of conditions and the following disclaimer.
11db7f0b97SKip Macy  *
12db7f0b97SKip Macy  * 2. The name of Kip Macy nor the names of other
13db7f0b97SKip Macy  *    contributors may be used to endorse or promote products derived from
14db7f0b97SKip Macy  *    this software without specific prior written permission.
15db7f0b97SKip Macy  *
16db7f0b97SKip Macy  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17db7f0b97SKip Macy  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18db7f0b97SKip Macy  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19db7f0b97SKip Macy  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
20db7f0b97SKip Macy  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21db7f0b97SKip Macy  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22db7f0b97SKip Macy  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23db7f0b97SKip Macy  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24db7f0b97SKip Macy  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25db7f0b97SKip Macy  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26db7f0b97SKip Macy  * POSSIBILITY OF SUCH DAMAGE.
27db7f0b97SKip Macy  *
28db7f0b97SKip Macy  *
29db7f0b97SKip Macy  ***************************************************************************/
30db7f0b97SKip Macy #include <sys/cdefs.h>
31db7f0b97SKip Macy __FBSDID("$FreeBSD$");
32db7f0b97SKip Macy 
33db7f0b97SKip Macy 
34db7f0b97SKip Macy #include <sys/param.h>
35db7f0b97SKip Macy #include <sys/systm.h>
36db7f0b97SKip Macy #include <sys/kernel.h>
37db7f0b97SKip Macy #include <sys/malloc.h>
38db7f0b97SKip Macy #include <sys/ktr.h>
39db7f0b97SKip Macy #include <sys/buf_ring.h>
40db7f0b97SKip Macy 
41db7f0b97SKip Macy 
42db7f0b97SKip Macy struct buf_ring *
43db7f0b97SKip Macy buf_ring_alloc(int count, struct malloc_type *type, int flags, struct mtx *lock)
44db7f0b97SKip Macy {
45db7f0b97SKip Macy 	struct buf_ring *br;
46db7f0b97SKip Macy 
47db7f0b97SKip Macy 	KASSERT(powerof2(count), ("buf ring must be size power of 2"));
48db7f0b97SKip Macy 
49db7f0b97SKip Macy 	br = malloc(sizeof(struct buf_ring) + count*sizeof(caddr_t),
50db7f0b97SKip Macy 	    type, flags|M_ZERO);
51db7f0b97SKip Macy 	if (br == NULL)
52db7f0b97SKip Macy 		return (NULL);
53db7f0b97SKip Macy #ifdef DEBUG_BUFRING
54db7f0b97SKip Macy 	br->br_lock = lock;
55db7f0b97SKip Macy #endif
56db7f0b97SKip Macy 	br->br_prod_size = br->br_cons_size = count;
57db7f0b97SKip Macy 	br->br_prod_mask = br->br_cons_mask = count-1;
58db7f0b97SKip Macy 	br->br_prod_head = br->br_cons_head = 0;
59db7f0b97SKip Macy 	br->br_prod_tail = br->br_cons_tail = 0;
60db7f0b97SKip Macy 
61db7f0b97SKip Macy 	return (br);
62db7f0b97SKip Macy }
63db7f0b97SKip Macy 
64db7f0b97SKip Macy void
65db7f0b97SKip Macy buf_ring_free(struct buf_ring *br, struct malloc_type *type)
66db7f0b97SKip Macy {
67db7f0b97SKip Macy 	free(br, type);
68db7f0b97SKip Macy }
69