---
name: "realloc"
section: "9"
platform: "linux"
package: "freebsd-manpages"
version: "6.0-5"
release: "Debian 4.0 (Etch)"
platforms: ["linux", "freebsd"]
url: "https://new.carta.tech/realloc/9"
---

# realloc(9)

kernel memory management routines

## 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 kernel 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 memory cannot be allocated, NULL is returned and the memory referenced by *addr* is valid and unchanged. If *addr* is NULL, the **realloc**() function behaves 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)](/malloc/3.md)), the kernel version takes two more arguments. The *flags* argument further qualifies **malloc**(*Ns*, *'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 resource 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 obvious. This option has been deprecated and is slowly being removed from the kernel, and so should not be used with any new programming.

Exactly one of either M\_WAITOK or M\_NOWAIT must be specified.

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**() and **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 ⟨sys/param.h⟩ (instead of ⟨sys/types.h⟩) and ⟨sys/kernel.h⟩.

## 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 efficiency of memory use.

Programmers should be careful not to confuse the malloc flags M\_NOWAIT and M\_WAITOK with the [mbuf(9)](/mbuf/9.md) flags M\_DONTWAIT and M\_TRYWAIT.

## 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)](/vnode/9.md) 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)](/vmstat/8.md), [contigmalloc(9)](/contigmalloc/9.md), [memguard(9)](/memguard/9.md), [vnode(9)](/vnode/9.md)
