summaryrefslogtreecommitdiff
path: root/static/openbsd/man9/extent.9
diff options
context:
space:
mode:
Diffstat (limited to 'static/openbsd/man9/extent.9')
-rw-r--r--static/openbsd/man9/extent.9425
1 files changed, 425 insertions, 0 deletions
diff --git a/static/openbsd/man9/extent.9 b/static/openbsd/man9/extent.9
new file mode 100644
index 00000000..734afa53
--- /dev/null
+++ b/static/openbsd/man9/extent.9
@@ -0,0 +1,425 @@
+.\" $OpenBSD: extent.9,v 1.20 2024/01/19 22:12:24 kettenis Exp $
+.\" $NetBSD: extent.9,v 1.15 1999/03/16 00:40:47 garbled Exp $
+.\"
+.\" Copyright (c) 1996, 1998 The NetBSD Foundation, Inc.
+.\" All rights reserved.
+.\"
+.\" This code is derived from software contributed to The NetBSD Foundation
+.\" by Jason R. Thorpe and Greg Hudson.
+.\"
+.\" 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 NETBSD FOUNDATION, INC. 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 FOUNDATION 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.
+.\"
+.Dd $Mdocdate: January 19 2024 $
+.Dt EXTENT 9
+.Os
+.Sh NAME
+.Nm extent_create ,
+.Nm extent_destroy ,
+.Nm extent_alloc ,
+.Nm extent_alloc_with_descr ,
+.Nm extent_alloc_subregion ,
+.Nm extent_alloc_subregion_with_descr ,
+.Nm extent_alloc_region ,
+.Nm extent_alloc_region_with_descr ,
+.Nm extent_free ,
+.Nm extent_print
+.Nd general purpose extent manager
+.Sh SYNOPSIS
+.In sys/malloc.h
+.In sys/extent.h
+.Ft struct extent *
+.Fn extent_create "char *name" "u_long start" "u_long end" "int mtype" "caddr_t storage" "size_t storagesize" "int flags"
+.Ft void
+.Fn extent_destroy "struct extent *ex"
+.Ft int
+.Fn extent_alloc "struct extent *ex" "u_long size" "u_long alignment" "u_long skew" "u_long boundary" "int flags" "u_long *result"
+.Ft int
+.Fn extent_alloc_with_descr "struct extent *ex" "u_long size" "u_long alignment" "u_long skew" "u_long boundary" "int flags" "struct extent_region *rp" "u_long *result"
+.Ft int
+.\" too many arguments for a single .Fn
+.Fo extent_alloc_subregion
+.Fa "struct extent *ex"
+.Fa "u_long substart"
+.Fa "u_long subend"
+.Fa "u_long size"
+.Fa "u_long alignment"
+.Fa "u_long skew"
+.Fa "u_long boundary"
+.Fa "int flags"
+.Fa "u_long *result"
+.Fc
+.Ft int
+.\" way too many arguments for a single .Fn
+.Fo extent_alloc_subregion_with_descr
+.Fa "struct extent *ex"
+.Fa "u_long substart"
+.Fa "u_long subend"
+.Fa "u_long size"
+.Fa "u_long alignment"
+.Fa "u_long skew"
+.Fa "u_long boundary"
+.Fa "int flags"
+.Fa "struct extent_region *rp"
+.Fa "u_long *result"
+.Fc
+.Ft int
+.Fn extent_alloc_region "struct extent *ex" "u_long start" "u_long size" "int flags"
+.Ft int
+.Fn extent_alloc_region_with_descr "struct extent *ex" "u_long start" "u_long size" "int flags" "struct extent_region *rp"
+.Ft int
+.Fn extent_free "struct extent *ex" "u_long start" "u_long size" "int flags"
+.Ft void
+.Fn extent_print "struct extent *ex"
+.Sh DESCRIPTION
+The extent manager provides management of areas of memory or
+other enumerable spaces (such as I/O ports).
+An opaque structure called an
+.Nm extent map
+keeps track of allocated regions within the enumerable space.
+.Pp
+.Fn extent_create
+creates an extent map managing the space from
+.Fa start
+to
+.Fa end
+inclusive.
+All memory allocation will use the memory type
+.Fa mtype
+.Po
+see
+.Xr malloc 9
+.Pc .
+The extent map will have the name
+.Fa name ,
+used for identification in case of errors or in
+.Xr ddb 4
+.Ic show extents .
+If the flag
+.Dv EX_NOCOALESCE
+is set, internal coalescing of regions is disabled,
+and only entire regions may be freed within the extent map, so that
+.Fn extent_free
+will never have to allocate a region descriptor.
+If the flag
+.Dv EX_FILLED
+is set, the entire space managed by the extent map will be allocated
+upon creation of the extent map, such that selected regions may be
+made available through calls to
+.Fn extent_free .
+.Pp
+Some applications may want to use an extent map but
+can't use
+.Fn malloc
+and
+.Fn free .
+These applications may provide pre-allocated storage for
+all descriptor overhead with the arguments
+.Fa storage
+and
+.Fa storagesize .
+An extent of this type is called a
+.Nm fixed extent .
+If the application can safely use
+.Fn malloc
+and
+.Fn free ,
+.Fa storage
+should be
+.Dv NULL .
+A fixed extent has a fixed number of region descriptors, so care
+should be taken to provide enough storage for them; alternatively, the
+flag
+.Dv EX_MALLOCOK
+may be passed to extent requests to indicate that a fixed extent
+map may be extended using a call to
+.Fn malloc .
+Note that passing the flag
+.Dv EX_FILLED
+to
+.Fn extent_create
+will consume a region descriptor upon creation of the extent map.
+.Pp
+The caller should pass the flag
+.Dv EX_WAITOK
+or
+.Dv EX_NOWAIT
+to extent functions that have a memory overhead, to specify whether
+it is okay to wait.
+These functions are
+.Fn extent_create
+(non fixed extents),
+.Fn extent_free
+(unless
+.Dv EX_NOCOALESCE
+is set),
+.Fn extent_alloc ,
+.Fn extent_alloc_subregion
+and
+.Fn extent_alloc_region .
+.Pp
+.Fn extent_destroy
+destroys the extent map
+.Fa ex ,
+freeing all allocated regions.
+If the extent is not a fixed extent,
+the region and internal extent descriptors themselves are freed.
+This function always succeeds.
+.Pp
+.Fn extent_alloc
+allocates a region in the extent map
+.Fa ex
+of size
+.Fa size
+that fits the provided parameters.
+There are two distinct allocation policies, which are selected by the
+.Fa flags
+argument:
+.Bl -tag -offset indent -width "XXXXXXXXX"
+.It Dv EX_FAST
+Allocate the first region that fits the provided parameters, regardless
+of resulting extent fragmentation.
+.It default
+Allocate the smallest region that is capable of holding the request,
+thus minimizing fragmentation of the extent.
+.El
+.Pp
+The caller may specify that it is okay to wait for space to become free in the
+extent by setting the flag
+.Dv EX_WAITSPACE .
+If
+.Dv EX_WAITSPACE
+is not set, the allocation will fail if the request cannot be
+satisfied without sleeping.
+.Pp
+The request will be aligned to a multiple of
+.Fa alignment .
+That value must be a power of 2.
+If no alignment is necessary, the value
+.Dv EX_NOALIGN
+should be specified.
+If
+.Fa skew
+is non-zero, it modifies the requested alignment result in the following way:
+the value
+.Pq Fa result No - Fa skew
+is aligned to
+.Fa alignment
+boundaries.
+.Fa skew
+must be a smaller number than
+.Fa alignment .
+If
+.Fa boundary
+is not
+.Dv EX_NOBOUNDARY ,
+the allocated region will not cross any boundary lines, spaced
+.Fa boundary
+apart.
+If the caller specifies the
+.Dv EX_BOUNDZERO
+flag, boundary lines begin at zero.
+Otherwise, boundary lines begin at the beginning of the extent.
+The allocated region may begin on a
+boundary line, but the end of the region will not touch nor cross a
+boundary line.
+A
+.Fa boundary
+argument smaller than the sum of the requested skew and the size of
+the request is invalid.
+Upon successful completion,
+.Fa *result
+will contain the start of the allocated region.
+.Pp
+.Fn extent_alloc_with_descr
+is similar to
+.Fn extent_alloc
+but allows the caller to provide a pre-allocated region descriptor instead
+of having the function allocate one.
+This function can only be used with extents that have the
+.Dv EX_NOCOALESCE
+property.
+.Pp
+.Fn extent_alloc_subregion
+and
+.Fn extent_alloc_subregion_with_descr
+are generalized versions of
+.Fn extent_alloc
+and
+.Fn extent_alloc_with_descr
+that allow the caller to specify that the allocated region must fall
+within the subregion from
+.Fa substart
+to
+.Fa subend
+inclusive.
+.Pp
+.Fn extent_alloc_region
+allocates the specific region in the extent map
+.Fa ex
+beginning at
+.Fa start
+with the size
+.Fa size .
+If the caller specifies the
+.Dv EX_CONFLICTOK
+flag, the allocation will succeed even if part of the requested region
+has already been allocated.
+The caller may specify that it is okay to wait for the indicated
+region to be free by setting the flag
+.Dv EX_WAITSPACE .
+If neither
+.Dv EX_WAITSPACE
+nor
+.Dv EX_CONFLICTOK
+is set, the allocation will fail if the request cannot be
+satisfied without sleeping.
+.Pp
+.Fn extent_alloc_region_with_descr
+is similar to
+.Fn extent_alloc_region
+but allows the caller to provide a pre-allocated region descriptor instead
+of having the function allocate one.
+This function can only be used with extents that have the
+.Dv EX_NOCOALESCE
+property.
+.Pp
+.Fn extent_free
+frees a region of
+.Fa size
+bytes starting at
+.Fa start
+in the extent map
+.Fa ex .
+If the extent has the
+.Dv EX_NOCOALESCE
+property, only entire regions may be freed.
+If the extent has the
+.Dv EX_NOCOALESCE
+property and the caller attempts to free a partial region, behavior is
+undefined.
+If called on an extent without the
+.Dv EX_NOCOALESCE
+property, this function can fail with error codes listed below, otherwise
+this function will always succeed.
+.Pp
+.Fn extent_print
+Prints out information about extent
+.Fa ex .
+This function always succeeds.
+.Sh RETURN VALUES
+The behavior of all extent manager functions is undefined if given
+invalid arguments.
+.Fn extent_create
+returns the extent map on success, or
+.Dv NULL
+if it fails to allocate storage for the extent map.
+It always succeeds when creating a fixed extent or when given the flag
+.Dv EX_WAITOK .
+.Fn extent_alloc ,
+.Fn extent_alloc_region ,
+.Fn extent_alloc_subregion ,
+and
+.Fn extent_free
+return one of the following values:
+.Bl -tag -offset indent -width "XXXXXXXX"
+.It Dv 0
+Operation was successful.
+.It Dv ENOMEM
+If
+.Dv EX_NOWAIT
+is specified, the extent manager was not able to allocate a region
+descriptor for the new region or to split a region when freeing a
+partial region.
+.It Dv EAGAIN
+Requested region is not available and
+.Dv EX_WAITSPACE
+was not specified.
+.It Dv EINTR
+Process received a signal while waiting for the requested region to
+become available in the extent.
+.El
+.Sh EXAMPLES
+Here is an example of a (useless) function that uses several of the
+extent manager routines.
+.Bd -literal
+void
+func()
+{
+ struct extent *foo_ex;
+ u_long region_start;
+ int error;
+
+ /*
+ * Extent "foo" manages a 256k region starting at 0x0 and
+ * only allows complete regions to be freed so that
+ * extent_free() never needs to allocate memory.
+ */
+ foo_ex = extent_create("foo", 0x0, 0x3ffff, M_DEVBUF,
+ NULL, 0, EX_WAITOK | EX_NOCOALESCE);
+
+ /*
+ * Allocate an 8k region, aligned to a 4k boundary, which
+ * does not cross any of the 3 64k boundaries (at 64k,
+ * 128k, and 192k) within the extent.
+ */
+ error = extent_alloc(foo_ex, 0x2000, 0x1000, 0x10000,
+ EX_NOWAIT, &region_start);
+ if (error)
+ panic("you lose");
+
+ /*
+ * Give up the extent.
+ */
+ extent_destroy(foo_ex);
+}
+.Ed
+.\"
+.\" Yeah, right... document EX_CATCH first...
+.\"
+.\" .Sh LIMITATIONS
+.\" The flag
+.\" .Dv EX_CATCH
+.\" cannot be used to catch signals in all circumstances since
+.\" .Xr malloc 9
+.\" does not provide such a functionality.
+.Sh CODE REFERENCES
+The extent manager itself is implemented within the file
+.Pa sys/kern/subr_extent.c .
+.Pp
+The i386 bus management code uses the extent manager for managing I/O
+ports and I/O memory.
+See
+.Pa sys/arch/i386/i386/machdep.c .
+.Sh SEE ALSO
+.Xr ddb 4 ,
+.Xr malloc 9
+.Sh HISTORY
+The extent manager appeared in
+.Nx 1.3 .
+.Sh AUTHORS
+.An -nosplit
+The extent manager was designed and implemented by
+.An Jason R. Thorpe Aq Mt thorpej@NetBSD.ORG .
+.An Matthias Drochner Aq Mt drochner@zelux6.zel.kfa-juelich.de
+contributed to the initial testing and optimization of the implementation.
+.An Chris Demetriou Aq Mt cgd@NetBSD.ORG
+contributed many architectural suggestions.