DDI_UMEM_LOCK(9F) Kernel Functions for Drivers DDI_UMEM_LOCK(9F)
NAME
ddi_umem_lock, ddi_umem_unlock - lock and unlock memory pages
SYNOPSIS
#include <sys/ddi.h>
#include <sys/sunddi.h>
int ddi_umem_lock(
caddr_t addr,
size_t len,
int flags,
ddi_umem_cookie_t *
cookiep);
void ddi_umem_unlock(
ddi_umem_cookie_t cookie);
INTERFACE LEVEL
illumos DDI specific (illumos DDI)
PARAMETERS
ddi_umem_lock addr Virtual address of memory object
len Length of memory object in bytes
flags Valid flags include:
DDI_UMEMLOCK_READ Memory pages are locked to be read
from. (Disk write or a network send.)
DDI_UMEMLOCK_WRITE Memory pages are locked to be
written to. (Disk read or a network
receive.)
cookiep Pointer to a kernel memory cookie.
ddi_umem_unlock cookie Kernel memory cookie allocated by
ddi_umem_lock().
DESCRIPTION
The
ddi_umem_lock() function locks down the physical pages (including
I/O pages) that correspond to the current process' virtual address
range [
addr,
addr +
size) and fills in a cookie representing the
locked pages. This cookie can be used to create a
buf(9S) structure
that can be used to perform I/O (see
ddi_umem_iosetup(9F) and
ddi_dma_buf_bind_handle(9F), or it can be used with
devmap_umem_setup(9F) to export the memory to an application.
The virtual address and length specified must be at a page boundary
and the mapping performed in terms of the system page size. See
pagesize(1).
The flags argument indicates the intended use of the locked memory.
Set flags to
DDI_UMEMLOCK_READ if the memory pages will be read (for
example, in a disk write or a network send.) Set flags to
DDI_UMEMLOCK_WRITE if the memory pages will be written (for example,
in a disk read or a network receive). You must choose one (and only
one) of these values.
To unlock the locked pages, the drivers call
ddi_umem_unlock(9F) with
the cookie obtained from
ddi_umem_lock().
The process is not allowed to
exec(2) or
fork(2) while its physical
pages are locked down by the device driver.
The device driver must ensure that the physical pages have been
unlocked after the application has called
close(2).
RETURN VALUES
On success, a
0 is returned. Otherwise, one of the following
errno values is returned.
EFAULT User process has no mapping at that address range or does
not support locking
EACCES User process does not have the required permission.
ENOMEM The system does not have sufficient resources to lock
memory, or locking
len memory would exceed a limit or
resource control on locked memory.
EAGAIN Could not allocate system resources required to lock the
pages. The
ddi_umem_lock() could succeed at a later time.
EINVAL Requested memory is not aligned on a system page boundary.
CONTEXT
The
ddi_umem_lock() function can only be called from user context;
ddi_umem_unlock() from user, kernel, and interrupt contexts.
SEE ALSO
ddi_dma_buf_bind_handle(9F),
ddi_umem_alloc(9F),
ddi_umem_iosetup(9F),
devmap_umem_setup(9F)NOTES
The
ddi_umem_unlock() function consumes physical memory. The driver
is responsible for a speedy unlock to free up the resources.
The
ddi_umem_unlock() function can defer unlocking of the pages to a
later time depending on the implementation.
April 10, 2007 DDI_UMEM_LOCK(9F)