| /************************************************************************** |
| * |
| * Copyright (c) 2007,2008 Kip Macy kmacy@freebsd.org |
| * All rights reserved. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions are met: |
| * |
| * 1. Redistributions of source code must retain the above copyright notice, |
| * this list of conditions and the following disclaimer. |
| * |
| * 2. The name of Kip Macy nor the names of other |
| * contributors may be used to endorse or promote products derived from |
| * this software without specific prior written permission. |
| * |
| * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
| * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
| * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
| * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE |
| * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
| * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
| * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
| * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
| * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
| * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
| * POSSIBILITY OF SUCH DAMAGE. |
| * |
| * |
| ***************************************************************************/ |
| #include <sys/bsd_cdefs.h> |
| //__FBSDID("$FreeBSD$"); |
| |
| |
| #include <sys/bsd_param.h> |
| #include <sys/bsd_systm.h> |
| #include <sys/bsd_kernel.h> |
| #include <sys/bsd_malloc.h> |
| #include <sys/bsd_ktr.h> |
| #include <sys/bsd_buf_ring.h> |
| |
| |
| struct buf_ring * |
| buf_ring_alloc(int count, struct malloc_type *type, int flags, struct mtx *lock) |
| { |
| struct buf_ring *br; |
| |
| KASSERT(powerof2(count), ("buf ring must be size power of 2")); |
| |
| br = bsd_malloc(sizeof(struct buf_ring) + count*sizeof(caddr_t), |
| type, flags|M_ZERO); |
| if (br == NULL) |
| return (NULL); |
| //#ifdef DEBUG_BUFRING |
| br->br_lock = lock; |
| //#endif |
| br->br_prod_size = br->br_cons_size = count; |
| br->br_prod_mask = br->br_cons_mask = count-1; |
| br->br_prod_head = br->br_cons_head = 0; |
| br->br_prod_tail = br->br_cons_tail = 0; |
| |
| return (br); |
| } |
| |
| void |
| buf_ring_free(struct buf_ring *br, struct malloc_type *type) |
| { |
| bsd_free(br, type); |
| } |