summaryrefslogtreecommitdiff
path: root/static/openbsd/man9/task_add.9
diff options
context:
space:
mode:
Diffstat (limited to 'static/openbsd/man9/task_add.9')
-rw-r--r--static/openbsd/man9/task_add.9237
1 files changed, 237 insertions, 0 deletions
diff --git a/static/openbsd/man9/task_add.9 b/static/openbsd/man9/task_add.9
new file mode 100644
index 00000000..1d27044b
--- /dev/null
+++ b/static/openbsd/man9/task_add.9
@@ -0,0 +1,237 @@
+.\" $OpenBSD: task_add.9,v 1.23 2022/06/22 14:10:49 visa Exp $
+.\"
+.\" Copyright (c) 2013 David Gwynne <dlg@openbsd.org>
+.\"
+.\" Permission to use, copy, modify, and distribute this software for any
+.\" purpose with or without fee is hereby granted, provided that the above
+.\" copyright notice and this permission notice appear in all copies.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+.\"
+.Dd $Mdocdate: June 22 2022 $
+.Dt TASK_ADD 9
+.Os
+.Sh NAME
+.Nm taskq_create ,
+.Nm taskq_destroy ,
+.Nm taskq_barrier ,
+.Nm taskq_del_barrier ,
+.Nm task_set ,
+.Nm task_add ,
+.Nm task_del ,
+.Nm task_pending ,
+.Nm TASK_INITIALIZER
+.Nd task queues
+.Sh SYNOPSIS
+.In sys/task.h
+.Ft struct taskq *
+.Fo taskq_create
+.Fa "const char *name"
+.Fa "unsigned int nthreads"
+.Fa "int ipl"
+.Fa "unsigned int flags"
+.Fc
+.Ft void
+.Fn taskq_destroy "struct taskq *tq"
+.Ft void
+.Fn taskq_barrier "struct taskq *tq"
+.Ft void
+.Fn taskq_del_barrier "struct taskq *tq" "struct task *t"
+.Ft void
+.Fn task_set "struct task *t" "void (*fn)(void *)" "void *arg"
+.Ft int
+.Fn task_add "struct taskq *tq" "struct task *t"
+.Ft int
+.Fn task_del "struct taskq *tq" "struct task *t"
+.Ft int
+.Fn task_pending "struct task *t"
+.Vt extern struct taskq *const systq;
+.Vt extern struct taskq *const systqmp;
+.Fn TASK_INITIALIZER "void (*fn)(void *)" "void *arg"
+.Sh DESCRIPTION
+The
+taskq
+API provides a mechanism to defer work to a process context.
+.Pp
+.Fn taskq_create
+allocates a taskq and a set of threads to be used to complete work
+that would be inappropriate for the shared system taskq.
+The
+.Fa name
+argument specifies the name of the kernel threads that are created
+to service the work on the taskq.
+.Fa nthreads
+specifies the number of threads that will be created to handle the work.
+.Fa ipl
+specifies the highest interrupt protection level at which
+.Fn task_add
+and
+.Fn task_del
+will be called against the created taskq.
+See
+.Xr spl 9
+for a list of the IPLs.
+The operational characteristics of the taskq
+can be altered by OR'ing the following defines into the
+.Fa flags
+argument:
+.Bl -tag -width xxx -offset indent
+.It Dv TASKQ_MPSAFE
+The threads servicing the taskq will be run without the kernel big lock.
+.El
+.Pp
+.Fn taskq_destroy
+causes the resources associated with a previously created taskq to be freed.
+It will wait till all the tasks in the work queue are completed before
+returning.
+Calling
+.Fn taskq_destroy
+against the system taskq is an error and will lead to undefined
+behaviour or a system fault.
+.Pp
+.Fn taskq_barrier
+guarantees that any task that was running on the
+.Fa tq
+taskq when the barrier was called has finished by the time the barrier
+returns.
+.Pp
+.Fn taskq_del_barrier
+either removes
+.Fa t
+from the list of pending tasks on the
+.Fa tq
+taskq, or waits until any running task has completed.
+.Pp
+The caller of
+.Fn taskq_barrier
+or
+.Fn taskq_del_barrier
+must not hold locks that can block the taskq.
+Otherwise, the system will deadlock.
+.Pp
+It is the responsibility of the caller to provide the
+.Fn task_set ,
+.Fn task_add ,
+and
+.Fn task_del
+functions with pre-allocated task structures.
+.Pp
+.Fn task_set
+prepares the task structure
+.Fa t
+to be used in future calls to
+.Fn task_add
+and
+.Fn task_del .
+.Fa t
+will be prepared to call the function
+.Fa fn
+with the argument specified by
+.Fa arg .
+Once initialised, the
+.Fa t
+structure can be used repeatedly in calls to
+.Fn task_add
+and
+.Fn task_del
+and does not need to be reinitialised unless the function called
+and/or its argument must change.
+.Pp
+.Fn task_add
+schedules the execution of the work specified by the
+task structure
+.Fa t
+on the
+.Fa tq
+taskq.
+The task structure must already be initialised by
+.Fn task_set .
+.Pp
+.Fn task_del
+will remove the task structure
+.Fa t
+from the taskq
+.Fa tq .
+If the work was already executed or has not been added to the taskq,
+the call will have no effect.
+Calling
+.Fn task_del
+against a different taskq than the one given in a previous call to
+.Fn task_add
+is an error and will lead to undefined behaviour.
+.Pp
+The kernel provides two system taskqs:
+.Va systq ,
+which executes while holding the kernel lock, and
+.Va systqmp ,
+which does not hold the kernel lock during execution.
+They can both be used by any subsystem for short lived tasks.
+They are serviced by a single thread and can therefore provide predictable
+ordering of work.
+Work can be scheduled on the system taskqs from callers at or below IPL_HIGH.
+.Pp
+The
+.Fn task_pending
+macro can be used to check if a task is scheduled to run.
+.Pp
+A task declaration can be initialised with the
+.Fn TASK_INITIALIZER
+macro.
+The task will be prepared to call the function specified by the
+.Fa fn
+argument with the
+.Fa void *
+argument given in
+.Fa arg .
+.Sh CONTEXT
+.Fn taskq_create
+and
+.Fn taskq_destroy
+can be called during autoconf, or from process context.
+.Fn taskq_barrier
+and
+.Fn taskq_del_barrier
+can be called from process context.
+.Fn task_set ,
+.Fn task_add ,
+.Fn task_del ,
+and
+.Fn task_pending
+can be called during autoconf, from process context, or from interrupt context.
+.Sh RETURN VALUES
+.Fn taskq_create
+returns a pointer to a taskq structure on success or
+.Dv NULL
+on failure.
+.Pp
+.Fn task_add
+will return 1 if the task
+.Fa t
+was added to the taskq
+.Fa tq
+or 0 if the task was already queued.
+.Pp
+.Fn task_del
+will return 1 if the task
+.Fa t
+was removed from the taskq
+.Fa tq
+or 0 if the task was not already on the queue.
+.Pp
+.Fn task_pending
+will return non-zero if the task is queued to run, or 0 if the task
+is not queued.
+.Sh SEE ALSO
+.Xr autoconf 9 ,
+.Xr spl 9
+.Sh HISTORY
+The task API was originally written by
+.An David Gwynne Aq Mt dlg@openbsd.org .
+The task API first appeared in
+.Ox 5.5 .