diff options
author | hmp <hmp@FreeBSD.org> | 2003-05-16 19:22:27 +0000 |
---|---|---|
committer | hmp <hmp@FreeBSD.org> | 2003-05-16 19:22:27 +0000 |
commit | c2a920683cbc3535c29dd87abea005f24d433681 (patch) | |
tree | a79db16920fd9c95d4b20c9871ce24287f1f59cb | |
parent | 15ba1fce6fb3bfeb0574fa854d8ea47dada7e85b (diff) | |
download | FreeBSD-src-c2a920683cbc3535c29dd87abea005f24d433681.zip FreeBSD-src-c2a920683cbc3535c29dd87abea005f24d433681.tar.gz |
Document the ``resource management'' routines in rman(9).
Submitted by: Bruce M. Simpson <bms@spc.org>
Reviewed by: mdodd
Approved by: des (mentor), re (scottl)
-rw-r--r-- | share/man/man9/Makefile | 1 | ||||
-rw-r--r-- | share/man/man9/rman.9 | 294 |
2 files changed, 295 insertions, 0 deletions
diff --git a/share/man/man9/Makefile b/share/man/man9/Makefile index c748bef..29a2241 100644 --- a/share/man/man9/Makefile +++ b/share/man/man9/Makefile @@ -60,6 +60,7 @@ MAN= BUF_LOCK.9 BUF_LOCKFREE.9 BUF_LOCKINIT.9 BUF_REFCNT.9 \ physio.9 printf.9 pseudofs.9 psignal.9 \ random.9 resettodr.9 resource_int_value.9 resource_query_string.9 \ rtalloc.9 rtentry.9 runqueue.9 random_harvest.9 rijndael.9 \ + rman.9 \ sbuf.9 scheduler.9 selrecord.9 sema.9 signal.9 sleep.9 sleepqueue.9 \ spl.9 store.9 style.9 suser.9 swi.9 sx.9 \ sysctl_add_oid.9 sysctl_ctx_init.9 \ diff --git a/share/man/man9/rman.9 b/share/man/man9/rman.9 new file mode 100644 index 0000000..31c9bcf --- /dev/null +++ b/share/man/man9/rman.9 @@ -0,0 +1,294 @@ +.\" +.\" Copyright (c) 2003 Bruce M Simpson <bms@spc.org> +.\" All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" $FreeBSD$ +.\" +.Dd May 12, 2003 +.Dt RMAN 9 +.Os +.Sh NAME +.Nm rman , +.Nm rman_activate_resource , +.Nm rman_await_resource , +.Nm rman_deactivate_resource , +.Nm rman_fini , +.Nm rman_init , +.Nm rman_manage_region , +.Nm rman_release_resource , +.Nm rman_reserve_resource , +.Nm rman_reserve_resource_bound , +.Nm rman_make_alignment_flags , +.Nm rman_get_start , +.Nm rman_get_end , +.Nm rman_get_size , +.Nm rman_get_flags , +.Nm rman_set_virtual , +.Nm rman_get_virtual , +.Nm rman_set_bustag , +.Nm rman_get_bustag , +.Nm rman_set_bushandle , +.Nm rman_get_bushandle , +.Nm rman_set_rid , +.Nm rman_get_rid +.Nd resource management functions +.Sh SYNOPSIS +.In sys/rman.h +.Ft int +.Fn rman_activate_resource "struct resource *r" +.Ft int +.Fn rman_await_resource "struct resource *r" "int pri2" "int timo" +.Ft int +.Fn rman_deactivate_resource "struct resource *r" +.Ft int +.Fn rman_fini "struct rman *rm" +.Ft int +.Fn rman_init "struct rman *rm" +.Ft int +.Fn rman_manage_region "struct rman *rm" "u_long start" "u_long end" +.Ft int +.Fn rman_release_resource "struct resource *r" +.Ft struct resource * +.Fn rman_reserve_resource "struct rman *rm" "u_long start" "u_long end" "u_long count" "u_int flags" "struct device *dev" +.Ft struct resource * +.Fn 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" +.Ft uint32_t +.Fn rman_make_alignment_flags "uint32_t size" +.Ft u_long +.Fn rman_get_start "struct resource *_r" +.Ft u_long +.Fn rman_get_end "struct resource *_r" +.Ft u_long +.Fn rman_get_size "struct resource *_r" +.Ft u_int +.Fn rman_get_flags "struct resource *_r" +.Ft void +.Fn rman_set_virtual "struct resource *_r" "void *_v" +.Ft void * +.Fn rman_get_virtual "struct resource *_r" +.Ft void +.Fn rman_set_bustag "struct resource *_r" "bus_space_tag_t _t" +.Ft bus_space_tag_t +.Fn rman_get_bustag "struct resource *_r" +.Ft void +.Fn rman_set_bushandle "struct resource *_r" "bus_space_handle_t _h" +.Ft bus_space_handle_t +.Fn rman_get_bushandle "struct resource *_r" +.Ft void +.Fn rman_set_rid "struct resource *_r" "int _rid" +.Ft int +.Fn rman_get_rid "struct resource *_r" +.Sh DESCRIPTION +The +.Nm +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. +.Pp +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. +.Bd -literal +#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 */ +.Ed +.Pp +The remainder of the flag bits are used to represent the desired alignment +of the resource within the region. +.Pp +The +.Fn rman_init +function initializes the region descriptor, pointed to by the +.Fa rm +argument, for use with the resource management functions. +It also initializes any mutexes associated with the structure. +.Pp +The +.Fn rman_fini +function frees any structures associated with the structure +pointed to by the +.Fa rm +argument. If any of the resources within the managed +region have the +.Dv RF_ALLOCATED +flag set, it will return +.Er EBUSY ; +otherwise, any mutexes associated with the structure will be released +and destroyed, and the function will return 0. +.Pp +The +.Fn rman_manage_region +function establishes the concept of a region which is under +.Nm +control. +The +.Fa rman +argument points to the region descriptor. +The start and end arguments specify the bounds of the region. +.Pp +.Em NOTE : +This interface is not robust against programming errors which +add multiple copies of the same region. +.Pp +The +.Fn rman_reserve_resource_bound +function is where the bulk of the +.Nm logic is located. +It attempts to reserve a contiguous range in the specified region +.Fa rm +for the use of the device +.Fa 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 default behavior is to allocate an exclusive segment, unless the +.Dv RF_SHAREABLE +or +.Dv 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. +.Pp +The +.Fn rman_reserve_resource +function is used to reserve resources within a previously established region. +It is a simplified interface to +.Fn rman_reserve_resource_bound +which passes 0 for the +.Fa flags +argument. +.Pp +The +.Fn rman_make_alignment_flags +function returns the flag mask corresponding to the desired alignment +.Fa size . +This should be used when calling +.Fn rman_reserve_resource_bound . +.Pp +The +.Fn rman_release_resource +function releases the reserved resource +.Fa r . +It may attempt to merge adjacent free resources. +.Pp +The +.Fn rman_activate_resource +function marks a resource as active, by setting the +.Dv RF_ACTIVE +flag. +If this is a time shared resource, and the caller has not yet acquired +the resource, the function returns +.Er EBUSY. +.Pp +The +.Fn rman_deactivate_resource +function marks a resource +.Fa r +as inactive, by clearing the +.Dv RF_ACTIVE +flag. +If other consumers are waiting for this range, it will wakeup their threads. +.Pp +The +.Fn rman_await_resource +function performs an asynchronous wait for a resource +.Fa r +to become inactive, that is, for the +.Dv 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 +.Fa pri +and +.Fa timo +are passed to the +.Fn rman_await_resource +function. +.Pp +The +.Fn rman_get_start , +.Fn rman_get_end , +.Fn rman_get_size , and +.Fn rman_get_flags +functions return the bounds, size and flags of the previously reserved +resource +.Fa r . +.Pp +The +.Fn rman_set_bustag +function associates a bus_space_tag_t +.Fa t +with the resource +.Fa r . +The +.Fn rman_get_bustag +function is used to retrieve this tag once set. +.Pp +The +.Fn rman_set_bushandle +function associates a bus_space_handle_t +.Fa h +with the resource +.Fa r . +The +.Fn rman_get_bushandle +function is used to retrieve this handle once set. +.Pp +The +.Fn rman_set_virtual +function is used to associate a kernel virtual address with a resource +.Fa r . +The +.Fn rman_get_virtual +function can be used to retrieve the KVA once set. +.Pp +The +.Fn rman_set_rid +function associates a resource identifier with a resource +.Fa r . +The rman_get_rid function retrieves this RID. +.Pp +The +.Fn rman_get_device +function returns a pointer to the device which reserved the resource +.Fa r . +.Pp +.Sh SEE ALSO +.Xr bus_activate_resource 9 , +.Xr bus_alloc_resource 9 , +.Xr bus_release_resource 9 , +.Xr bus_set_resource 9 , +.Xr mutex 9 +.Sh AUTHORS +This man page was written by +.An Bruce M Simpson Aq bms@spc.org . |