|TASKQ(9F)||Kernel Functions for Drivers||TASKQ(9F)|
#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);
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 taskq on the list for later execution. The dflag argument specifies whether it is allowed 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. 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 taskq 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.
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 taskq is suspended. Otherwise B_FALSE is returned.
Additionally, the ddi_taskq_dispatch function may be called from the interrupt context only if the DDI_NOSLEEP flag is set.
|September 12, 2020||OmniOS|