| TASKQ(9F) | Kernel Functions for Drivers | TASKQ(9F) | 
taskq,
    ddi_taskq_create,
    ddi_taskq_destroy,
    ddi_taskq_dispatch,
    ddi_taskq_wait,
    ddi_taskq_suspend,
    ddi_taskq_suspended,
    ddi_taskq_resume — Kernel
    task queue operations
#include
    <sys/sunddi.h>
ddi_taskq_t *
  
  ddi_taskq_create(dev_info_t
    *dip, const char *name, int
    nthreads, pri_t pri, uint_t
    cflags);
void
  
  ddi_taskq_destroy(ddi_taskq_t
    *tq);
int
  
  ddi_taskq_dispatch(ddi_taskq_t
    *tq, void (*func)(void *), void
    *arg, uint_t dflags);
void
  
  ddi_taskq_wait(ddi_taskq_t
  *tq);
void
  
  ddi_taskq_suspend(ddi_taskq_t
    *tq);
boolean_t
  
  ddi_taskq_suspended(ddi_taskq_t
    *tq);
void
  
  ddi_taskq_resume(ddi_taskq_t
    *tq);
illumos DDI specific (illumos DDI)
NULL for kernel modules that do not have an
      associated dev_info_t structure.TASKQ_DEFAULTPRI.DDI_SLEEPDDI_NOSLEEPDDI_FAILURE immediately if memory is
          not available.A kernel task queue is a mechanism for general-purpose asynchronous task scheduling that enables tasks to be performed at a later time by another thread. There are several reasons why you may utilize asynchronous task scheduling:
A task queue consists of a list of tasks, together with one or more threads to service the list. If a task queue has a single service thread, all tasks are guaranteed to execute in the order they were dispatched. Otherwise they can be executed in any order. Note that since tasks are placed on a list, execution of one task should not depend on the execution of another task or a deadlock may occur.
The
    ddi_taskq_create()
    function creates a task queue instance.
The
    ddi_taskq_dispatch()
    function places func on the list for later execution.
    The dflag argument specifies whether it is allowed to
    sleep waiting for memory. DDI_SLEEP dispatches can
    sleep and are guaranteed to succeed. DDI_NOSLEEP
    dispatches are guaranteed not to sleep but may fail (return
    DDI_FAILURE) if resources are not available.
The
    ddi_taskq_destroy()
    function waits for any scheduled tasks to complete, then destroys the taskq
    tq. The caller should guarantee that no new tasks are
    scheduled for the closing taskq.
The
    ddi_taskq_wait()
    function waits for all previously scheduled tasks to complete. Note that
    this function does not stop any new task dispatches.
The
    ddi_taskq_suspend()
    function suspends all task execution until
    ddi_taskq_resume() is called. Although
    ddi_taskq_suspend() attempts to suspend pending
    tasks, there are no guarantees that they will be suspended. The only
    guarantee is that all tasks dispatched after
    ddi_taskq_suspend() will not be executed. Because it
    will trigger a deadlock, the ddi_taskq_suspend()
    function should never be called by a task executing on a taskq.
The
    ddi_taskq_suspended()
    function returns B_TRUE if the taskq
    tq is suspended, and B_FALSE
    otherwise. It is intended to ASSERT that the task queue is suspended.
The
    ddi_taskq_resume()
    function resumes task queue execution.
All functions may be called from the user or kernel contexts.
Additionally, the ddi_taskq_dispatch()
    function may be called from the interrupt context only if the
    DDI_NOSLEEP flag is set.
The ddi_taskq_create() function creates an
    opaque handle that is used for all other taskq operations. It returns a
    ddi_taskq_t * pointer on success and
    NULL on failure.
The ddi_taskq_dispatch() function returns
    DDI_FAILURE if it can't dispatch a task and returns
    DDI_SUCCESS if dispatch succeeded.
The ddi_taskq_suspended() function returns
    B_TRUE if tq is suspended.
    Otherwise B_FALSE is returned.
| September 15, 2024 | OmniOS |