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
Copyright © 2010-2025 Platon Technologies, s.r.o.           Home | Man pages | tLDP | Documents | Utilities | About
Design by styleshout