summaryrefslogtreecommitdiffstats
path: root/share/man/man9/mbpool.9
diff options
context:
space:
mode:
Diffstat (limited to 'share/man/man9/mbpool.9')
-rw-r--r--share/man/man9/mbpool.9264
1 files changed, 264 insertions, 0 deletions
diff --git a/share/man/man9/mbpool.9 b/share/man/man9/mbpool.9
new file mode 100644
index 0000000..e9cd7a2
--- /dev/null
+++ b/share/man/man9/mbpool.9
@@ -0,0 +1,264 @@
+.\" Copyright (c) 2003
+.\" Fraunhofer Institute for Open Communication Systems (FhG Fokus).
+.\" 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. Redistributions in binary form must reproduce the above copyright
+.\" notice, this list of conditions and the following disclaimer in the
+.\" documentation and/or other materials provided with the distribution.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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.
+.\"
+.\" Author: Hartmut Brandt <harti@FreeBSD.org>
+.\"
+.\" $FreeBSD$
+.\"
+.Dd July 15, 2003
+.Dt MBPOOL 9
+.Os
+.Sh NAME
+.Nm mbpool
+.Nd "buffer pools for network interfaces"
+.Sh SYNOPSIS
+.In sys/types.h
+.In machine/bus.h
+.In sys/mbpool.h
+.Vt struct mbpool ;
+.Ft int
+.Fo mbp_create
+.Fa "struct mbpool **mbp" "const char *name" "bus_dma_tag_t dmat"
+.Fa "u_int max_pages" "size_t page_size" "size_t chunk_size"
+.Fc
+.Ft void
+.Fn mbp_destroy "struct mbpool *mbp"
+.Ft "void *"
+.Fn mbp_alloc "struct mbpool *mbp" "bus_addr_t *pa" "uint32_t *hp"
+.Ft void
+.Fn mbp_free "struct mbpool *mbp" "void *p"
+.Ft void
+.Fn mbp_ext_free "void *" "void *"
+.Ft void
+.Fn mbp_card_free "struct mbpool *mbp"
+.Ft void
+.Fn mbp_count "struct mbpool *mbp" "u_int *used" "u_int *card" "u_int *free"
+.Ft "void *"
+.Fn mbp_get "struct mbpool *mbp" "uint32_t h"
+.Ft "void *"
+.Fn mbp_get_keep "struct mbpool *mbp" "uint32_t h"
+.Ft void
+.Fo mbp_sync
+.Fa "struct mbpool *mbp" "uint32_t h" "bus_addr_t off" "bus_size_t len"
+.Fa "u_int op"
+.Fc
+.Pp
+.Fn MODULE_DEPEND "your_module" "libmbpool" 1 1 1
+.Pp
+.Cd "options LIBMBPOOL"
+.Sh DESCRIPTION
+Mbuf pools are intended to help drivers for interface cards that need huge
+amounts of receive buffers, and additionally provides a mapping between these
+buffers and 32-bit handles.
+.Pp
+An example of these cards are the Fore/Marconi ForeRunnerHE cards.
+These
+employ up to 8 receive groups, each with two buffer pools, each of which
+can contain up to 8192.
+This gives a total maximum number of more than
+100000 buffers.
+Even with a more moderate configuration the card eats several
+thousand buffers.
+Each of these buffers must be mapped for DMA.
+While for
+machines without an IOMMU and with lesser than 4GByte memory this is not
+a problem, for other machines this may quickly eat up all available IOMMU
+address space and/or bounce buffers.
+On sparc64, the default I/O page size
+is 16k, so mapping a simple mbuf wastes 31/32 of the address space.
+.Pp
+Another problem with most of these cards is that they support putting a 32-bit
+handle into the buffer descriptor together with the physical address.
+This handle is reflected back to the driver when the buffer is filled, and
+assists the driver in finding the buffer in host memory.
+For 32-bit machines,
+the virtual address of the buffer is usually used as the handle.
+This does not
+work for 64-bit machines for obvious reasons, so a mapping is needed between
+these handles and the buffers.
+This mapping should be possible without
+searching lists and the like.
+.Pp
+An mbuf pool overcomes both problems by allocating DMA-able memory page wise
+with a per-pool configurable page size.
+Each page is divided into a number of
+equally-sized chunks, the last
+.Dv MBPOOL_TRAILER_SIZE
+of which are used by the pool code (4 bytes).
+The rest of each chunk is
+usable as a buffer.
+There is a per-pool limit on pages that will be allocated.
+.Pp
+Additionally, the code manages two flags for each buffer:
+.Dq on-card
+and
+.Dq used .
+A buffer may be in one of three states:
+.Bl -tag -width "on-card"
+.It free
+None of the flags is set.
+.It on-card
+Both flags are set.
+The buffer is assumed to be handed over to the card and
+waiting to be filled.
+.It used
+The buffer was returned by the card and is now travelling through the system.
+.El
+.Pp
+A pool is created with
+.Fn mbp_create .
+This call specifies a DMA tag
+.Fa dmat
+to be used to create and map the memory pages via
+.Xr bus_dmamem_alloc 9 .
+The
+.Fa chunk_size
+includes the pool overhead.
+It means that to get buffers for 5 ATM cells
+(240 bytes), a chunk size of 256 should be specified.
+This results in 12 unused
+bytes between the buffer, and the pool overhead of four byte.
+The total
+maximum number of buffers in a pool is
+.Fa max_pages
+*
+.Fa ( page_size
+/
+.Fa chunk_size ) .
+The maximum value for
+.Fa max_pages
+is 2^14-1 (16383) and the maximum of
+.Fa page_size
+/
+.Fa chunk_size
+is 2^9 (512).
+If the call is successful, a pointer to a newly allocated
+.Vt "struct mbpool"
+is set into the variable pointed to by
+.Fa mpb .
+.Pp
+A pool is destroyed with
+.Fn mbp_destroy .
+This frees all pages and the pool structure itself.
+If compiled with
+.Dv DIAGNOSTICS ,
+the code checks that all buffers are free.
+If not, a warning message is issued
+to the console.
+.Pp
+A buffer is allocated with
+.Fn mbp_alloc .
+This returns the virtual address of the buffer and stores the physical
+address into the variable pointed to by
+.Fa pa .
+The handle is stored into the variable pointed to by
+.Fa hp .
+The two most significant bits and the 7 least significant bits of the handle
+are unused by the pool code and may be used by the caller.
+These are
+automatically stripped when passing a handle to one of the other functions.
+If a buffer cannot be allocated (either because the maximum number of pages
+is reached, no memory is available or the memory cannot be mapped),
+.Dv NULL
+is returned.
+If a buffer could be allocated, it is in the
+.Dq on-card
+state.
+.Pp
+When the buffer is returned by the card, the driver calls
+.Fn mbp_get
+with the handle.
+This function returns the virtual address of the buffer
+and clears the
+.Dq on-card
+bit.
+The buffer is now in the
+.Dq used
+state.
+The function
+.Fn mbp_get_keep
+differs from
+.Fn mbp_get
+in that it does not clear the
+.Dq on-card
+bit.
+This can be used for buffers
+that are returned
+.Dq partially
+by the card.
+.Pp
+A buffer is freed by calling
+.Fn mbp_free
+with the virtual address of the buffer.
+This clears the
+.Dq used
+bit, and
+puts the buffer on the free list of the pool.
+Note that free buffers
+are NOT returned to the system.
+The function
+.Fn mbp_ext_free
+can be given to
+.Fn m_extadd
+as the free function.
+The user argument must be the pointer to
+the pool.
+.Pp
+Before using the contents of a buffer returned by the card, the driver
+must call
+.Fn mbp_sync
+with the appropriate parameters.
+This results in a call to
+.Xr bus_dmamap_sync 9
+for the buffer.
+.Pp
+All buffers in the pool that are currently in the
+.Dq on-card
+state can be freed
+with a call to
+.Fn mbp_card_free .
+This may be called by the driver when it stops the interface.
+Buffers in the
+.Dq used
+state are not freed by this call.
+.Pp
+For debugging it is possible to call
+.Fn mbp_count .
+This returns the number of buffers in the
+.Dq used
+and
+.Dq on-card
+states and
+the number of buffers on the free list.
+.Sh SEE ALSO
+.Xr mbuf 9
+.Sh AUTHORS
+.An Harti Brandt Aq Mt harti@FreeBSD.org
+.Sh CAVEATS
+The function
+.Fn mbp_sync
+is currently a no-op because
+.Xr bus_dmamap_sync 9
+is missing the offset and length parameters.
OpenPOWER on IntegriCloud