DDI_UMEM_ALLOC(9F) Kernel Functions for Drivers DDI_UMEM_ALLOC(9F)
NAME
ddi_umem_alloc, ddi_umem_free - allocate and free page-aligned kernel
memory
SYNOPSIS
#include <sys/types.h>
#include <sys/sunddi.h>
void *ddi_umem_alloc(
size_t size,
int flag,
ddi_umem_cookie_t *cookiep);
void ddi_umem_free(
ddi_umem_cookie_t cookie);
INTERFACE LEVEL
illumos DDI specific (illumos DDI).
PARAMETERS
ddi_umem_alloc() size Number of bytes to allocate.
flag Used to determine the sleep and pageable conditions.
Possible sleep flags are
DDI_UMEM_SLEEP, which allows
sleeping until memory is available, and
DDI_UMEM_NOSLEEP,
which returns
NULL immediately if memory is not available.
The default condition is to allocate locked memory; this
can be changed to allocate pageable memory using the
DDI_UMEM_PAGEABLE flag.
cookiep Pointer to a kernel memory cookie.
ddi_umem_free() cookie A kernel memory cookie allocated in
ddi_umem_alloc().
DESCRIPTION
ddi_umem_alloc() allocates page-aligned kernel memory and returns a
pointer to the allocated memory. The number of bytes allocated is a
multiple of the system page size (roundup of
size). The allocated
memory can be used in the kernel and can be exported to user space.
See
devmap(9E) and
devmap_umem_setup(9F) for further information.
flag determines whether the caller can sleep for memory and whether
the allocated memory is locked or not.
DDI_UMEM_SLEEP allocations may
sleep but are guaranteed to succeed.
DDI_UMEM_NOSLEEP allocations do
not sleep but may fail (return
NULL) if memory is currently
unavailable. If
DDI_UMEM_PAGEABLE is set, pageable memory will be
allocated. These pages can be swapped out to secondary memory
devices. The initial contents of memory allocated using
ddi_umem_alloc() is zero-filled.
*cookiep is a pointer to the kernel memory cookie that describes the
kernel memory being allocated. A typical use of
cookiep is in
devmap_umem_setup(9F) when the drivers want to export the kernel
memory to a user application.
To free the allocated memory, a driver calls
ddi_umem_free() with the
cookie obtained from
ddi_umem_alloc().
ddi_umem_free() releases the
entire buffer.
RETURN VALUES
Non-null Successful completion.
ddi_umem_alloc() returns a pointer
to the allocated memory.
NULL Memory cannot be allocated by
ddi_umem_alloc() because
DDI_UMEM_NOSLEEP is set and the system is out of
resources.
CONTEXT
ddi_umem_alloc() can be called from any context if
flag is set to
DDI_UMEM_NOSLEEP. If
DDI_UMEM_SLEEP is set,
ddi_umem_alloc() can be
called from user and kernel context only.
ddi_umem_free() can be
called from any context.
SEE ALSO
devmap(9E),
condvar(9F),
devmap_umem_setup(9F),
kmem_alloc(9F),
mutex(9F),
rwlock(9F),
semaphore(9F) Writing Device DriversWARNINGS
Setting the
DDI_UMEM_PAGEABLE flag in
ddi_umem_alloc() will result in
an allocation of pageable memory. Because these pages can be swapped
out to secondary memory devices, drivers should use this flag with
care. This memory must not be used for the following purposes:
o For synchronization objects such as locks and condition
variables. See
mutex(9F),
semaphore(9F),
rwlock(9F), and
condvar(9F).
o For driver interrupt routines.
Memory allocated using
ddi_umem_alloc() without setting
DDI_UMEM_PAGEABLE flag cannot be paged. Available memory is therefore
limited by the total physical memory on the system. It is also
limited by the available kernel virtual address space, which is often
the more restrictive constraint on large-memory configurations.
Excessive use of kernel memory is likely to effect overall system
performance. Over-commitment of kernel memory may cause
unpredictable consequences.
Misuse of the kernel memory allocator, such as writing past the end
of a buffer, using a buffer after freeing it, freeing a buffer twice,
or freeing an invalid pointer, will cause the system to corrupt data
or panic.
Do not call
ddi_umem_alloc() within
DDI_SUSPEND and
DDI_RESUME operations. Memory acquired at these times is not reliable. In some
cases, such a call can cause a system to hang.
NOTES
ddi_umem_alloc(0, flag,
cookiep) always returns
NULL. ddi_umem_free(NULL) has no effects on system.
March 19, 2002 DDI_UMEM_ALLOC(9F)