summaryrefslogtreecommitdiffstats
path: root/share
diff options
context:
space:
mode:
authorjamie <jamie@FreeBSD.org>2016-04-30 04:01:22 +0000
committerjamie <jamie@FreeBSD.org>2016-04-30 04:01:22 +0000
commit8f241805478ee6cea6271b7f9181a35941763fbe (patch)
tree3df4f9011facd5dafe99231c9e4821c6a23c302b /share
parent0621c28d20a2e195bbf63594bb3b732d498fe738 (diff)
downloadFreeBSD-src-8f241805478ee6cea6271b7f9181a35941763fbe.zip
FreeBSD-src-8f241805478ee6cea6271b7f9181a35941763fbe.tar.gz
MFC r297367:
Move the various per-type arrays of OSD data into a single structure array. MFC r297422: Add osd_reserve() and osd_set_reserved(), which allow M_WAITOK allocation of an OSD array.
Diffstat (limited to 'share')
-rw-r--r--share/man/man9/osd.964
1 files changed, 61 insertions, 3 deletions
diff --git a/share/man/man9/osd.9 b/share/man/man9/osd.9
index ba9c632..8353b18 100644
--- a/share/man/man9/osd.9
+++ b/share/man/man9/osd.9
@@ -25,7 +25,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd January 5, 2011
+.Dd March 30, 2016
.Dt OSD 9
.Os
.Sh NAME
@@ -33,6 +33,9 @@
.Nm osd_register ,
.Nm osd_deregister ,
.Nm osd_set ,
+.Nm osd_reserve ,
+.Nm osd_set_reserved ,
+.Nm osd_free_reserved ,
.Nm osd_get ,
.Nm osd_del ,
.Nm osd_call ,
@@ -63,6 +66,22 @@
.Fa "void *value"
.Fc
.Ft void *
+.Fo osd_reserve
+.Fa "u_int slot"
+.Fc
+.Ft int
+.Fo osd_set_reserved
+.Fa "u_int type"
+.Fa "struct osd *osd"
+.Fa "u_int slot"
+.Fa "void *rsv"
+.Fa "void *value"
+.Fc
+.Ft void
+.Fo osd_free_reserved
+.Fa "void *rsv"
+.Fc
+.Ft void *
.Fo osd_get
.Fa "u_int type"
.Fa "struct osd *osd"
@@ -198,6 +217,15 @@ argument points to a data object to associate with
.Fa osd .
.Pp
The
+.Fn osd_set_reserved
+function does the same as
+.Fn osd_set ,
+but with an extra argument
+.Fa rsv
+that is internal-use memory previously allocated via
+.Fn osd_reserve .
+.Pp
+The
.Fn osd_get
function returns the data pointer associated with a kernel data structure's
.Vt struct osd
@@ -324,6 +352,24 @@ will proceed without any
.Xr realloc 9
calls.
.Pp
+It is possible for
+.Fn osd_set
+to fail to allocate this array. To ensure that such allocation succeeds,
+.Fn osd_reserve
+may be called (in a non-blocking context), and it will pre-allocate the
+memory via
+.Xr malloc 9
+with M_WAITOK.
+Then this pre-allocated memory is passed to
+.Fn osd_set_reserved ,
+which will use it if necessary or otherwise discard it.
+The memory may also be explicitly discarded by calling
+.Fn osd_free_reserved .
+As this method always allocates memory whether or not it is ultimately needed,
+it should be used only rarely, such as in the unlikely event that
+.Fn osd_set
+fails.
+.Pp
The
.Nm
API is geared towards slot identifiers storing pointers to the same underlying
@@ -359,15 +405,27 @@ the kernel including most fast paths.
returns the slot identifier for the newly registered data type.
.Pp
.Fn osd_set
-returns zero on success or ENOMEM if the specified type/slot identifier pair
+and
+.Fn osd_set_reserved
+return zero on success or ENOMEM if the specified type/slot identifier pair
triggered an internal
.Xr realloc 9
-which failed.
+which failed
+.Fn ( osd_set_reserved
+will always succeed when
+.Fa rsv
+is non-NULL).
.Pp
.Fn osd_get
returns the data pointer for the specified type/slot identifier pair, or NULL if
the slot has not been initialised yet.
.Pp
+.Fn osd_reserve
+returns a pointer suitable for passing to
+.Fn osd_set_reserved
+or
+.Fn osd_free_reserved .
+.Pp
.Fn osd_call
returns zero if no method is run or the method for each slot runs successfully.
If a method for a slot returns non-zero,
OpenPOWER on IntegriCloud