Provided by: freebsd-manpages_12.2-1_all bug

NAME

     vmem — general purpose resource allocator

SYNOPSIS

     #include <sys/vmem.h>

     vmem_t *
     vmem_create(const char *name, vmem_addr_t base, vmem_size_t size, vmem_size_t quantum,
         vmem_size_t qcache_max, int flags);

     int
     vmem_add(vmem_t *vm, vmem_addr_t addr, vmem_size_t size, int flags);

     int
     vmem_xalloc(vmem_t *vm, const vmem_size_t size, vmem_size_t align, const vmem_size_t phase,
         const vmem_size_t nocross, const vmem_addr_t minaddr, const vmem_addr_t maxaddr,
         int flags, vmem_addr_t *addrp);

     void
     vmem_xfree(vmem_t *vm, vmem_addr_t addr, vmem_size_t size);

     int
     vmem_alloc(vmem_t *vm, vmem_size_t size, int flags, vmem_addr_t *addrp);

     void
     vmem_free(vmem_t *vm, vmem_addr_t addr, vmem_size_t size);

     void
     vmem_destroy(vmem_t *vm);

DESCRIPTION

     The vmem is a general purpose resource allocator.  Despite its name, it can be used for
     arbitrary resources other than virtual memory.

     vmem_create() creates a new vmem arena.

     name        The string to describe the vmem.

     base        The start address of the initial span.  Pass 0 if no initial span is required.

     size        The size of the initial span.  Pass 0 if no initial span is required.

     quantum     The smallest unit of allocation.

     qcache_max  The largest size of allocations which can be served by quantum cache.  It is
                 merely a hint and can be ignored.

     flags       malloc(9) wait flag.

     vmem_add() adds a span of size size starting at addr to the arena.  Returns 0 on success,
     ENOMEM on failure.  flags is malloc(9) wait flag.

     vmem_xalloc() allocates a resource from the arena.

     vm       The arena which we allocate from.

     size     Specify the size of the allocation.

     align    If zero, don't care about the alignment of the allocation.  Otherwise, request a
              resource segment starting at offset phase from an align aligned boundary.

     phase    See the above description of align.  If align is zero, phase should be zero.
              Otherwise, phase should be smaller than align.

     nocross  Request a resource which doesn't cross nocross aligned boundary.

     minaddr  Specify the minimum address which can be allocated, or VMEM_ADDR_MIN if the caller
              does not care.

     maxaddr  Specify the maximum address which can be allocated, or VMEM_ADDR_MAX if the caller
              does not care.

     flags    A bitwise OR of an allocation strategy and a malloc(9) wait flag.  The allocation
              strategy is one of:

              M_FIRSTFIT
                      Prefer allocation performance.

              M_BESTFIT
                      Prefer space efficiency.

              M_NEXTFIT
                      Perform an address-ordered search for free addresses, beginning where the
                      previous search ended.

     addrp    On success, if addrp is not NULL, vmem_xalloc() overwrites it with the start
              address of the allocated span.

     vmem_xfree() frees resource allocated by vmem_xalloc() to the arena.

     vm    The arena which we free to.

     addr  The resource being freed.  It must be the one returned by vmem_xalloc().  Notably, it
           must not be the one from vmem_alloc().  Otherwise, the behaviour is undefined.

     size  The size of the resource being freed.  It must be the same as the size argument used
           for vmem_xalloc().

     vmem_alloc() allocates a resource from the arena.

     vm     The arena which we allocate from.

     size   Specify the size of the allocation.

     flags  A bitwise OR of an vmem allocation strategy flag (see above) and a malloc(9) sleep
            flag.

     addrp  On success, if addrp is not NULL, vmem_alloc() overwrites it with the start address
            of the allocated span.

     vmem_free() frees resource allocated by vmem_alloc() to the arena.

     vm    The arena which we free to.

     addr  The resource being freed.  It must be the one returned by vmem_alloc().  Notably, it
           must not be the one from vmem_xalloc().  Otherwise, the behaviour is undefined.

     size  The size of the resource being freed.  It must be the same as the size argument used
           for vmem_alloc().

     vmem_destroy() destroys a vmem arena.

     vm  The vmem arena being destroyed.  The caller should ensure that no one will use it
         anymore.

RETURN VALUES

     vmem_create() returns a pointer to the newly allocated vmem_t.  Otherwise, it returns NULL.

     On success, vmem_xalloc() and vmem_alloc() return 0.  Otherwise, ENOMEM is returned.

CODE REFERENCES

     The vmem subsystem is implemented within the file sys/kern/subr_vmem.c.

SEE ALSO

     malloc(9)

     Jeff Bonwick and Jonathan Adams, “Magazines and Vmem: Extending the Slab Allocator to Many
     CPUs and Arbitrary Resources”, 2001 USENIX Annual Technical Conference, 2001.

HISTORY

     The vmem allocator was originally implemented in NetBSD.  It was introduced in FreeBSD 10.0.

AUTHORS

     Original implementation of vmem was written by YAMAMOTO Takashi.  The FreeBSD port was made
     by Jeff Roberson.

BUGS

     vmem relies on malloc(9), so it cannot be used as early during system bootstrap.