Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
VMEM(9)			   Kernel Developer's Manual		       VMEM(9)

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 ig-
			 nored.

	     flags	 malloc(9) wait	flag.

       vmem_add() adds a span of size size starting at addr to the arena.  Re-
       turns 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 allo-
			 cation.  Otherwise, request a resource	segment	start-
			 ing 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  pre-
				     vious search ended.

	     addrp	 On success, if	addrp is not NULL, vmem_xalloc() over-
			 writes	 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  re-
			 turned	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()	 over-
			 writes	 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  re-
			 turned	 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.	Other-
       wise, 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	intro-
       duced 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.

FreeBSD	15.0			 May 17, 2019			       VMEM(9)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=vmem&sektion=9&manpath=FreeBSD+15.0-RELEASE+and+Ports>

home | help