table of contents
RMAN(9) | Kernel Developer's Manual | RMAN(9) |
NAME¶
rman, rman_activate_resource, rman_await_resource, rman_deactivate_resource, rman_fini, rman_init, rman_manage_region, rman_release_resource, rman_reserve_resource, rman_reserve_resource_bound, rman_make_alignment_flags, rman_get_start, rman_get_end, rman_get_device, rman_get_size, rman_get_flags, rman_set_virtual, rman_get_virtual, rman_set_bustag, rman_get_bustag, rman_set_bushandle, rman_get_bushandle, rman_set_rid, rman_get_rid — resource management functionsSYNOPSIS¶
#include <sys/rman.h> intrman_activate_resource(struct resource *r); int
rman_await_resource(struct resource *r, int pri2, int timo); int
rman_deactivate_resource(struct resource *r); int
rman_fini(struct rman *rm); int
rman_init(struct rman *rm); int
rman_manage_region(struct rman *rm, u_long start, u_long end); int
rman_release_resource(struct resource *r); struct resource *
rman_reserve_resource(struct rman *rm, u_long start, u_long end, u_long count, u_int flags, struct device *dev); struct resource *
rman_reserve_resource_bound(struct rman *rm, u_long start, u_long end, u_long count, u_long bound, u_int flags, struct device *dev); uint32_t
rman_make_alignment_flags(uint32_t size); u_long
rman_get_start(struct resource *r); u_long
rman_get_end(struct resource *r); struct device *
rman_get_device(struct resource *r); u_long
rman_get_size(struct resource *r); u_int
rman_get_flags(struct resource *r); void
rman_set_virtual(struct resource *r, void *v); void *
rman_get_virtual(struct resource *r); void
rman_set_bustag(struct resource *r, bus_space_tag_t t); bus_space_tag_t
rman_get_bustag(struct resource *r); void
rman_set_bushandle(struct resource *r, bus_space_handle_t h); bus_space_handle_t
rman_get_bushandle(struct resource *r); void
rman_set_rid(struct resource *r, int rid); int
rman_get_rid(struct resource *r);
DESCRIPTION¶
The rman set of functions provides a flexible resource management abstraction. It is used extensively by the bus management code. It implements the abstractions of region and resource. A region descriptor is used to manage a region; this could be memory or some other form of bus space. Each region has a set of bounds. Within these bounds, allocated segments may reside. Each segment, termed a resource, has several properties which are represented by a 16-bit flag register, as follows.#define RF_ALLOCATED 0x0001 /* resource has been reserved */ #define RF_ACTIVE 0x0002 /* resource allocation has been activated */ #define RF_SHAREABLE 0x0004 /* resource permits contemporaneous sharing */ #define RF_TIMESHARE 0x0008 /* resource permits time-division sharing */ #define RF_WANTED 0x0010 /* somebody is waiting for this resource */ #define RF_FIRSTSHARE 0x0020 /* first in sharing list */ #define RF_PREFETCHABLE 0x0040 /* resource is prefetchable */
RMAN_ARRAY
. The field
rm_descr shall be set to a string that describes the
resource to be managed. It also initializes any mutexes associated with the
structure. If rman_init() fails to initalize the mutex, it
will return ENOMEM
; otherwise it will
return 0 and
rm will be initalized.
The rman_fini() function frees any structures associated with
the structure pointed to by the rm argument. If any of
the resources within the managed region have the
RF_ALLOCATED
flag set, it will return
EBUSY
; otherwise, any mutexes associated with the
structure will be released and destroyed, and the function will return 0.
The rman_manage_region() function establishes the concept of a
region which is under rman control. The
rman argument points to the region descriptor. The
start and end arguments specify
the bounds of the region. If successful,
rman_manage_region() will return 0. If the region overlaps
with an existing region, it will return EBUSY
.
ENOMEM
will be return when
rman_manage_region() failed to allocate memory for the
region.
The rman_reserve_resource_bound() function is where the bulk
of the rman logic is located. It attempts to reserve a
contiguous range in the specified region rm for the use
of the device dev. The caller can specify the
start and end of an acceptable
range, as well as alignment, and the code will attempt to find a free segment
which fits. The start argument is the lowest acceptable
starting value of the resource. The end argument is the
highest acceptable ending value of the resource. Therefore,
start +
count - 1 must be ≤
end for any allocation to happen. The default behavior
is to allocate an exclusive segment, unless the
RF_SHAREABLE
or RF_TIMESHARE
flags are set, in which case a shared segment will be allocated. If this
shared segment already exists, the caller has its device added to the list of
consumers.
The rman_reserve_resource() function is used to reserve
resources within a previously established region. It is a simplified interface
to rman_reserve_resource_bound() which passes 0 for the
flags argument.
The rman_make_alignment_flags() function returns the flag mask
corresponding to the desired alignment size. This should
be used when calling rman_reserve_resource_bound().
The rman_release_resource() function releases the reserved
resource r. It may attempt to merge adjacent free
resources.
The rman_activate_resource() function marks a resource as
active, by setting the RF_ACTIVE
flag. If this is a
time shared resource, and the caller has not yet acquired the resource, the
function returns EBUSY
.
The rman_deactivate_resource() function marks a resource
r as inactive, by clearing the
RF_ACTIVE
flag. If other consumers are waiting for
this range, it will wakeup their threads.
The rman_await_resource() function performs an asynchronous
wait for a resource r to become inactive, that is, for
the RF_ACTIVE
flag to be cleared. It is used to enable
cooperative sharing of a resource which can only be safely used by one thread
at a time. The arguments pri and
timo are passed to the
rman_await_resource() function.
The rman_get_start(), rman_get_end(),
rman_get_size(), and rman_get_flags()
functions return the bounds, size and flags of the previously reserved
resource r.
The rman_set_bustag() function associates a
bus_space_tag_t t with the
resource r. The rman_get_bustag()
function is used to retrieve this tag once set.
The rman_set_bushandle() function associates a
bus_space_handle_t h with the
resource r. The rman_get_bushandle()
function is used to retrieve this handle once set.
The rman_set_virtual() function is used to associate a kernel
virtual address with a resource r. The
rman_get_virtual() function can be used to retrieve the KVA
once set.
The rman_set_rid() function associates a resource identifier
with a resource r. The rman_get_rid()
function retrieves this RID.
The rman_get_device() function returns a pointer to the device
which reserved the resource r.
SEE ALSO¶
bus_activate_resource(9), bus_alloc_resource(9), bus_release_resource(9), bus_set_resource(9), mutex(9)AUTHORS¶
This manual page was written by Bruce M Simpson ⟨bms@spc.org⟩.April 29, 2007 | Debian |