From df21508671c29482b4f6efd3a9f074e62832ae8a Mon Sep 17 00:00:00 2001 From: hselasky Date: Thu, 2 Mar 2017 12:20:23 +0000 Subject: [PATCH] Implement taskqueue_poll_is_busy() for use by the LinuxKPI. Refer to comment above function for a detailed description. Discussed with: kib @ MFC after: 1 week Sponsored by: Mellanox Technologies --- sys/kern/subr_taskqueue.c | 17 +++++++++++++++++ sys/sys/taskqueue.h | 1 + 2 files changed, 18 insertions(+) diff --git a/sys/kern/subr_taskqueue.c b/sys/kern/subr_taskqueue.c index 34564155c682..5d43ac6ca94c 100644 --- a/sys/kern/subr_taskqueue.c +++ b/sys/kern/subr_taskqueue.c @@ -487,6 +487,23 @@ task_is_running(struct taskqueue *queue, struct task *task) return (0); } +/* + * Only use this function in single threaded contexts. It returns + * non-zero if the given task is either pending or running. Else the + * task is idle and can be queued again or freed. + */ +int +taskqueue_poll_is_busy(struct taskqueue *queue, struct task *task) +{ + int retval; + + TQ_LOCK(queue); + retval = task->ta_pending > 0 || task_is_running(queue, task); + TQ_UNLOCK(queue); + + return (retval); +} + static int taskqueue_cancel_locked(struct taskqueue *queue, struct task *task, u_int *pendp) diff --git a/sys/sys/taskqueue.h b/sys/sys/taskqueue.h index 3cb5427cef56..583f796e2ac1 100644 --- a/sys/sys/taskqueue.h +++ b/sys/sys/taskqueue.h @@ -79,6 +79,7 @@ int taskqueue_start_threads_cpuset(struct taskqueue **tqp, int count, int taskqueue_enqueue(struct taskqueue *queue, struct task *task); int taskqueue_enqueue_timeout(struct taskqueue *queue, struct timeout_task *timeout_task, int ticks); +int taskqueue_poll_is_busy(struct taskqueue *queue, struct task *task); int taskqueue_cancel(struct taskqueue *queue, struct task *task, u_int *pendp); int taskqueue_cancel_timeout(struct taskqueue *queue,