svn commit: r321743 - in head: share/man/man9 sys/kern sys/sys
Ian Lepore
ian at FreeBSD.org
Mon Jul 31 00:54:51 UTC 2017
Author: ian
Date: Mon Jul 31 00:54:50 2017
New Revision: 321743
URL: https://svnweb.freebsd.org/changeset/base/321743
Log:
Add taskqueue_enqueue_timeout_sbt(), because sometimes you want more control
over the scheduling precision than 'ticks' can offer, and because sometimes
you're already working with sbintime_t units and it's dumb to convert them
to ticks just so they can get converted back to sbintime_t under the hood.
Modified:
head/share/man/man9/taskqueue.9
head/sys/kern/subr_taskqueue.c
head/sys/sys/taskqueue.h
Modified: head/share/man/man9/taskqueue.9
==============================================================================
--- head/share/man/man9/taskqueue.9 Mon Jul 31 00:41:05 2017 (r321742)
+++ head/share/man/man9/taskqueue.9 Mon Jul 31 00:54:50 2017 (r321743)
@@ -28,7 +28,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd March 1, 2016
+.Dd July 30, 2017
.Dt TASKQUEUE 9
.Os
.Sh NAME
@@ -82,6 +82,8 @@ struct timeout_task;
.Ft int
.Fn taskqueue_enqueue_timeout "struct taskqueue *queue" "struct timeout_task *timeout_task" "int ticks"
.Ft int
+.Fn taskqueue_enqueue_timeout_sbt "struct taskqueue *queue" "struct timeout_task *timeout_task" "sbintime_t sbt" "sbintime_t pr" "int flags"
+.Ft int
.Fn taskqueue_cancel "struct taskqueue *queue" "struct task *task" "u_int *pendp"
.Ft int
.Fn taskqueue_cancel_timeout "struct taskqueue *queue" "struct timeout_task *timeout_task" "u_int *pendp"
@@ -211,8 +213,17 @@ is called on the task pointer passed to
.Pp
The
.Fn taskqueue_enqueue_timeout
-is used to schedule the enqueue after the specified amount of
+function is used to schedule the enqueue after the specified number of
.Va ticks .
+The
+.Fn taskqueue_enqueue_timeout_sbt
+function provides finer control over the scheduling based on
+.Va sbt ,
+.Va pr ,
+and
+.Va flags ,
+as detailed in
+.Xr timeout 9 .
Only non-fast task queues can be used for
.Va timeout_task
scheduling.
@@ -483,6 +494,7 @@ be created with a dedicated processing thread.
.Xr ithread 9 ,
.Xr kthread 9 ,
.Xr swi 9
+.Xr timeout 9
.Sh HISTORY
This interface first appeared in
.Fx 5.0 .
Modified: head/sys/kern/subr_taskqueue.c
==============================================================================
--- head/sys/kern/subr_taskqueue.c Mon Jul 31 00:41:05 2017 (r321742)
+++ head/sys/kern/subr_taskqueue.c Mon Jul 31 00:54:50 2017 (r321743)
@@ -289,8 +289,8 @@ taskqueue_timeout_func(void *arg)
}
int
-taskqueue_enqueue_timeout(struct taskqueue *queue,
- struct timeout_task *timeout_task, int ticks)
+taskqueue_enqueue_timeout_sbt(struct taskqueue *queue,
+ struct timeout_task *timeout_task, sbintime_t sbt, sbintime_t pr, int flags)
{
int res;
@@ -304,7 +304,7 @@ taskqueue_enqueue_timeout(struct taskqueue *queue,
/* Do nothing */
TQ_UNLOCK(queue);
res = -1;
- } else if (ticks == 0) {
+ } else if (sbt == 0) {
taskqueue_enqueue_locked(queue, &timeout_task->t);
/* The lock is released inside. */
} else {
@@ -313,16 +313,25 @@ taskqueue_enqueue_timeout(struct taskqueue *queue,
} else {
queue->tq_callouts++;
timeout_task->f |= DT_CALLOUT_ARMED;
- if (ticks < 0)
- ticks = -ticks; /* Ignore overflow. */
+ if (sbt < 0)
+ sbt = -sbt; /* Ignore overflow. */
}
- if (ticks > 0) {
- callout_reset(&timeout_task->c, ticks,
- taskqueue_timeout_func, timeout_task);
+ if (sbt > 0) {
+ callout_reset_sbt(&timeout_task->c, sbt, pr,
+ taskqueue_timeout_func, timeout_task, flags);
}
TQ_UNLOCK(queue);
}
return (res);
+}
+
+int
+taskqueue_enqueue_timeout(struct taskqueue *queue,
+ struct timeout_task *ttask, int ticks)
+{
+
+ return (taskqueue_enqueue_timeout_sbt(queue, ttask, ticks * tick_sbt,
+ 0, 0));
}
static void
Modified: head/sys/sys/taskqueue.h
==============================================================================
--- head/sys/sys/taskqueue.h Mon Jul 31 00:41:05 2017 (r321742)
+++ head/sys/sys/taskqueue.h Mon Jul 31 00:54:50 2017 (r321743)
@@ -79,6 +79,9 @@ int taskqueue_start_threads_cpuset(struct taskqueue **
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_enqueue_timeout_sbt(struct taskqueue *queue,
+ struct timeout_task *timeout_task, sbintime_t sbt, sbintime_t pr,
+ int flags);
int taskqueue_poll_is_busy(struct taskqueue *queue, struct task *task);
int taskqueue_cancel(struct taskqueue *queue, struct task *task,
u_int *pendp);
More information about the svn-src-all
mailing list