malloc(9)
NAME
malloc, MALLOC, free, FREE, realloc, reallocf,
MALLOC_DEFINE
MALLOC_DECLARE - kernel memory management routines
SYNOPSIS
#include <sys/types.h> #include <sys/malloc.h> void * malloc(unsigned long size, struct malloc_type *type, int flags); MALLOC(space, cast, unsigned long size, struct malloc_type *type, int flags); void free(void *addr, struct malloc_type *type); FREE(void *addr, struct malloc_type *type); void * realloc(void *addr, unsigned long size, struct malloc_type *type, int flags); void * reallocf(void *addr, unsigned long size, struct malloc_type *type, int flags); MALLOC_DECLARE(type); #include <sys/param.h> #include <sys/malloc.h> #include <sys/kernel.h> MALLOC_DEFINE(type, shortdesc, longdesc);
DESCRIPTION
- The malloc() function allocates uninitialized memory in ker
- nel address
space for an object whose size is specified by size. - The free() function releases memory at address addr that was
- previously
allocated by malloc() for re-use. The memory is not zeroed. - If addr is
NULL, then free() does nothing. - The realloc() function changes the size of the previously
- allocated memory referenced by addr to size bytes. The contents of the
- memory are
unchanged up to the lesser of the new and old sizes. Note - that the
returned value may differ from addr. If the requested memo - ry cannot be
allocated, NULL is returned and the memory referenced by - addr is valid
and unchanged. If addr is NULL, the realloc() function be - haves identically to malloc() for the specified size.
- The reallocf() function is identical to realloc() except
- that it will
free the passed pointer when the requested memory cannot be - allocated.
- The MALLOC() macro variant is functionally equivalent to
(space) = (cast)malloc((u_long)(size), type, flags)- and the FREE() macro variant is equivalent to
free((addr), type)- Unlike its standard C library counterpart (malloc(3)), the
- kernel version
takes two more arguments. The flags argument further quali - fies
malloc()'s operational characteristics as follows: - M_ZERO Causes the allocated memory to be set to all zeros.
- M_NOWAIT
- Causes malloc(), realloc(), and reallocf() to return
- NULL if the
request cannot be immediately fulfilled due to re - source shortage.
Note that M_NOWAIT is required when running in an - interrupt context.
- M_WAITOK
- Indicates that it is OK to wait for resources. If
- the request
cannot be immediately fulfilled, the current process - is put to
sleep to wait for resources to be released by other - processes.
The malloc(), realloc(), and reallocf() functions - cannot return
NULL if M_WAITOK is specified. - M_USE_RESERVE
- Indicates that the system can dig into its reserve
- in order to
obtain the requested memory. This option used to be - called
M_KERNEL but has been renamed to something more ob - vious. This
option has been deprecated and is slowly being re - moved from the
kernel, and so should not be used with any new pro - gramming.
- Exactly one of either M_WAITOK or M_NOWAIT must be speci
- fied.
- The type argument is used to perform statistics on memory
- usage, and for
basic sanity checks. It can be used to identify multiple - allocations.
The statistics can be examined by `vmstat -m'. - A type is defined using struct malloc_type via the
MALLOC_DECLARE
- MALLOC_DEFINE() macros.
- /* sys/something/foo_extern.h */
- MALLOC_DECLARE(M_FOOBUF);
- /* sys/something/foo_main.c */
- MALLOC_DEFINE(M_FOOBUF, "foobuffers", "Buffers to foo
- data into the ether");
- /* sys/something/foo_subr.c */
- ...
MALLOC(buf, struct foo_buf *, sizeof *buf, M_FOOBUF, - M_NOWAIT);
- In order to use MALLOC_DEFINE(), one must include #include
- <sys/param.h>
(instead of and
IMPLEMENTATION NOTES
- The memory allocator allocates memory in chunks that have
- size a power of
two for requests up to the size of a page of memory. For - larger
requests, one or more pages is allocated. While it should - not be relied
upon, this information may be useful for optimizing the ef - ficiency of
memory use. - Programmers should be careful not to confuse the malloc
- flags M_NOWAIT
and M_WAITOK with the mbuf(9) flags M_DONTWAIT and M_TRY - WAIT.
CONTEXT
- malloc(), realloc() and reallocf() may not be called from
- fast interrupts
handlers. When called from threaded interrupts, flags must - contain
M_NOWAIT. - malloc(), realloc() and reallocf() may sleep when called
- with M_WAITOK.
free() never sleeps. - Any calls to malloc() (even with M_NOWAIT) or free() when
- holding a
vnode(9) interlock, will cause a LOR (Lock Order Reversal) - due to the
intertwining of VM Objects and Vnodes.
RETURN VALUES
- The malloc(), realloc(), and reallocf() functions return a
- kernel virtual
address that is suitably aligned for storage of any type of - object, or
NULL if the request could not be satisfied (implying that - M_NOWAIT was
set).
DIAGNOSTICS
- A kernel compiled with the INVARIANTS configuration option
- attempts to
detect memory corruption caused by such things as writing - outside the
allocated area and imbalanced calls to the malloc() and - free() functions.
Failing consistency checks will cause a panic or a system - console message.
SEE ALSO
- vmstat(8), contigmalloc(9), memguard(9), vnode(9)
- BSD June 12, 2003