Module Name: src
Committed By: thorpej
Date: Wed Dec 26 18:54:20 UTC 2018
Modified Files:
src/share/man/man9: threadpool.9
src/sys/kern: kern_threadpool.c
src/sys/sys: threadpool.h
src/tests/kernel/threadpool_tester: threadpool_tester.c
src/tests/rump/kernspace: threadpool.c
Log Message:
- De-opaque'ify struct threadpool_job.
- De-_t'ify all of the structure types.
No functional chage, no ABI change (verified with old rump unit test
before and after new librump.so).
Per Taylor's request.
To generate a diff of this commit:
cvs rdiff -u -r1.1 -r1.2 src/share/man/man9/threadpool.9
cvs rdiff -u -r1.3 -r1.4 src/sys/kern/kern_threadpool.c
cvs rdiff -u -r1.2 -r1.3 src/sys/sys/threadpool.h
cvs rdiff -u -r1.1 -r1.2 \
src/tests/kernel/threadpool_tester/threadpool_tester.c
cvs rdiff -u -r1.2 -r1.3 src/tests/rump/kernspace/threadpool.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/share/man/man9/threadpool.9
diff -u src/share/man/man9/threadpool.9:1.1 src/share/man/man9/threadpool.9:1.2
--- src/share/man/man9/threadpool.9:1.1 Mon Dec 24 16:58:54 2018
+++ src/share/man/man9/threadpool.9 Wed Dec 26 18:54:19 2018
@@ -1,4 +1,4 @@
-.\" $NetBSD: threadpool.9,v 1.1 2018/12/24 16:58:54 thorpej Exp $
+.\" $NetBSD: threadpool.9,v 1.2 2018/12/26 18:54:19 thorpej Exp $
.\"
.\" Copyright (c) 2014 The NetBSD Foundation, Inc.
.\" All rights reserved.
@@ -39,40 +39,40 @@
.In sys/threadpool.h
.\""""""""""""""""""""""""""""""""""""
.Ft int
-.Fn threadpool_get "threadpool_t **poolp" "pri_t pri"
+.Fn threadpool_get "struct threadpool **poolp" "pri_t pri"
.\"
.Ft void
-.Fn threadpool_put "threadpool_t *pool" "pri_t pri"
+.Fn threadpool_put "struct threadpool *pool" "pri_t pri"
.\""""""""""""""""""""""""""""""""""""
.Ft int
-.Fn threadpool_percpu_get "threadpool_percpu_t **pool_percpup" "pri_t pri"
+.Fn threadpool_percpu_get "struct threadpool_percpu **pool_percpup" "pri_t pri"
.\"
.Ft void
-.Fn threadpool_percpu_put "threadpool_percpu_t *pool_percpu" "pri_t pri"
+.Fn threadpool_percpu_put "struct threadpool_percpu *pool_percpu" "pri_t pri"
.\"
-.Ft threadpool_t *
-.Fn threadpool_percpu_ref "threadpool_percpu_t *pool"
+.Ft struct threadpool *
+.Fn threadpool_percpu_ref "struct threadpool_percpu *pool"
.\"
-.Ft threadpool_t *
-.Fn threadpool_percpu_ref_remote "threadpool_percpu_t *pool" "struct cpu_info *ci"
+.Ft struct threadpool *
+.Fn threadpool_percpu_ref_remote "struct threadpool_percpu *pool" "struct cpu_info *ci"
.\""""""""""""""""""""""""""""""""""""
.Ft void
-.Fn threadpool_job_init "threadpool_job_t *job" "void (*fn)(threadpool_job_t *)" "kmutex_t *interlock"
+.Fn threadpool_job_init "struct threadpool_job *job" "void (*fn)(struct threadpool_job *)" "kmutex_t *interlock"
.\"
.Ft void
-.Fn threadpool_job_destroy "threadpool_job_t *job"
+.Fn threadpool_job_destroy "struct threadpool_job *job"
.\"
.Ft void
-.Fn threadpool_job_done "threadpool_job_t *job"
+.Fn threadpool_job_done "struct threadpool_job *job"
.\""""""""""""""""""""""""""""""""""""
.Ft void
-.Fn threadpool_schedule_job "threadpool_t *pool" "threadpool_job_t *job"
+.Fn threadpool_schedule_job "struct threadpool *pool" "struct threadpool_job *job"
.\"
.Ft void
-.Fn threadpool_cancel_job "threadpool_t *pool" "threadpool_job_t *job"
+.Fn threadpool_cancel_job "struct threadpool *pool" "struct threadpool_job *job"
.\"
.Ft bool
-.Fn threadpool_cancel_job_async "threadpool_t *pool" "threadpool_job_t *job"
+.Fn threadpool_cancel_job_async "struct threadpool *pool" "struct threadpool_job *job"
.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
.Sh DESCRIPTION
The
@@ -94,18 +94,18 @@ and
.Fn threadpool_percpu_put .
.Pp
Job state is stored in the
-.Vt threadpool_job_t
-object.
+.Vt threadpool_job
+structure.
Callers of the
.Nm
abstraction
must allocate memory for
-.Vt threadpool_job_t
-objects, but should consider them opaque, and should not inspect or
+.Vt threadpool_job
+structures, but should consider them opaque, and should not inspect or
copy them.
Each job represented by a
-.Vt threadpool_job_t
-object will be run only once at a time, until the action associated
+.Vt threadpool_job
+structure will be run only once at a time, until the action associated
with it calls
.Fn threadpool_job_done .
.Pp
Index: src/sys/kern/kern_threadpool.c
diff -u src/sys/kern/kern_threadpool.c:1.3 src/sys/kern/kern_threadpool.c:1.4
--- src/sys/kern/kern_threadpool.c:1.3 Tue Dec 25 05:44:13 2018
+++ src/sys/kern/kern_threadpool.c Wed Dec 26 18:54:19 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: kern_threadpool.c,v 1.3 2018/12/25 05:44:13 thorpej Exp $ */
+/* $NetBSD: kern_threadpool.c,v 1.4 2018/12/26 18:54:19 thorpej Exp $ */
/*-
* Copyright (c) 2014, 2018 The NetBSD Foundation, Inc.
@@ -76,12 +76,12 @@
* touching remote CPUs' memory when scheduling a job, but that still
* requires interprocessor synchronization. Perhaps we could get by
* with a single overseer thread, at the expense of another pointer in
- * struct threadpool_job_impl to identify the CPU on which it must run
+ * struct threadpool_job to identify the CPU on which it must run
* in order for the overseer to schedule it correctly.
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_threadpool.c,v 1.3 2018/12/25 05:44:13 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_threadpool.c,v 1.4 2018/12/26 18:54:19 thorpej Exp $");
#include <sys/types.h>
#include <sys/param.h>
@@ -108,33 +108,16 @@ do { \
RUN_ONCE(&threadpool_init_once, threadpools_init); \
KASSERT(threadpool_init_error == 0); \
} while (/*CONSTCOND*/0)
-
/* Data structures */
-TAILQ_HEAD(job_head, threadpool_job_impl);
+TAILQ_HEAD(job_head, threadpool_job);
TAILQ_HEAD(thread_head, threadpool_thread);
-typedef struct threadpool_job_impl {
- kmutex_t *job_lock; /* 1 */
- struct threadpool_thread *job_thread; /* 1 */
- TAILQ_ENTRY(threadpool_job_impl) job_entry; /* 2 */
- volatile unsigned int job_refcnt; /* 1 */
- /* implicit pad on _LP64 */
- kcondvar_t job_cv; /* 3 */
- threadpool_job_fn_t job_fn; /* 1 */
- /* ILP32 / LP64 */
- char job_name[MAXCOMLEN]; /* 4 / 2 */
-} threadpool_job_impl_t;
-
-CTASSERT(sizeof(threadpool_job_impl_t) <= sizeof(threadpool_job_t));
-#define THREADPOOL_JOB_TO_IMPL(j) ((threadpool_job_impl_t *)(j))
-#define THREADPOOL_IMPL_TO_JOB(j) ((threadpool_job_t *)(j))
-
struct threadpool_thread {
struct lwp *tpt_lwp;
- threadpool_t *tpt_pool;
- threadpool_job_impl_t *tpt_job;
+ struct threadpool *tpt_pool;
+ struct threadpool_job *tpt_job;
kcondvar_t tpt_cv;
TAILQ_ENTRY(threadpool_thread) tpt_entry;
};
@@ -151,16 +134,16 @@ struct threadpool {
pri_t tp_pri;
};
-static int threadpool_hold(threadpool_t *);
-static void threadpool_rele(threadpool_t *);
+static int threadpool_hold(struct threadpool *);
+static void threadpool_rele(struct threadpool *);
-static int threadpool_percpu_create(threadpool_percpu_t **, pri_t);
-static void threadpool_percpu_destroy(threadpool_percpu_t *);
+static int threadpool_percpu_create(struct threadpool_percpu **, pri_t);
+static void threadpool_percpu_destroy(struct threadpool_percpu *);
-static void threadpool_job_dead(threadpool_job_t *);
+static void threadpool_job_dead(struct threadpool_job *);
-static int threadpool_job_hold(threadpool_job_impl_t *);
-static void threadpool_job_rele(threadpool_job_impl_t *);
+static int threadpool_job_hold(struct threadpool_job *);
+static void threadpool_job_rele(struct threadpool_job *);
static void threadpool_overseer_thread(void *) __dead;
static void threadpool_thread(void *) __dead;
@@ -220,10 +203,10 @@ struct threadpool_percpu {
static LIST_HEAD(, threadpool_percpu) percpu_threadpools;
-static threadpool_percpu_t *
+static struct threadpool_percpu *
threadpool_lookup_percpu(pri_t pri)
{
- threadpool_percpu_t *tpp;
+ struct threadpool_percpu *tpp;
LIST_FOREACH(tpp, &percpu_threadpools, tpp_link) {
if (tpp->tpp_pri == pri)
@@ -233,14 +216,14 @@ threadpool_lookup_percpu(pri_t pri)
}
static void
-threadpool_insert_percpu(threadpool_percpu_t *tpp)
+threadpool_insert_percpu(struct threadpool_percpu *tpp)
{
KASSERT(threadpool_lookup_percpu(tpp->tpp_pri) == NULL);
LIST_INSERT_HEAD(&percpu_threadpools, tpp, tpp_link);
}
static void
-threadpool_remove_percpu(threadpool_percpu_t *tpp)
+threadpool_remove_percpu(struct threadpool_percpu *tpp)
{
KASSERT(threadpool_lookup_percpu(tpp->tpp_pri) == tpp);
LIST_REMOVE(tpp, tpp_link);
@@ -265,7 +248,7 @@ threadpools_init(void)
mutex_init(&threadpools_lock, MUTEX_DEFAULT, IPL_NONE);
TP_LOG(("%s: sizeof(threadpool_job) = %zu\n",
- __func__, sizeof(threadpool_job_t)));
+ __func__, sizeof(struct threadpool_job)));
return 0;
}
@@ -279,10 +262,10 @@ threadpool_pri_is_valid(pri_t pri)
}
static int
-threadpool_create(threadpool_t **poolp, struct cpu_info *ci, pri_t pri,
+threadpool_create(struct threadpool **poolp, struct cpu_info *ci, pri_t pri,
size_t size)
{
- threadpool_t *const pool = kmem_zalloc(size, KM_SLEEP);
+ struct threadpool *const pool = kmem_zalloc(size, KM_SLEEP);
struct lwp *lwp;
int ktflags;
int error;
@@ -340,7 +323,7 @@ fail0: KASSERT(error);
/* Thread pool destruction */
static void
-threadpool_destroy(threadpool_t *pool, size_t size)
+threadpool_destroy(struct threadpool *pool, size_t size)
{
struct threadpool_thread *thread;
@@ -371,7 +354,7 @@ threadpool_destroy(threadpool_t *pool, s
}
static int
-threadpool_hold(threadpool_t *pool)
+threadpool_hold(struct threadpool *pool)
{
unsigned int refcnt;
@@ -386,7 +369,7 @@ threadpool_hold(threadpool_t *pool)
}
static void
-threadpool_rele(threadpool_t *pool)
+threadpool_rele(struct threadpool *pool)
{
unsigned int refcnt;
@@ -409,7 +392,7 @@ threadpool_rele(threadpool_t *pool)
/* Unbound thread pools */
int
-threadpool_get(threadpool_t **poolp, pri_t pri)
+threadpool_get(struct threadpool **poolp, pri_t pri)
{
struct threadpool_unbound *tpu, *tmp = NULL;
int error;
@@ -424,7 +407,7 @@ threadpool_get(threadpool_t **poolp, pri
mutex_enter(&threadpools_lock);
tpu = threadpool_lookup_unbound(pri);
if (tpu == NULL) {
- threadpool_t *new_pool;
+ struct threadpool *new_pool;
mutex_exit(&threadpools_lock);
TP_LOG(("%s: No pool for pri=%d, creating one.\n",
__func__, (int)pri));
@@ -455,14 +438,14 @@ threadpool_get(threadpool_t **poolp, pri
mutex_exit(&threadpools_lock);
if (tmp != NULL)
- threadpool_destroy((threadpool_t *)tmp, sizeof(*tpu));
+ threadpool_destroy((struct threadpool *)tmp, sizeof(*tpu));
KASSERT(tpu != NULL);
*poolp = &tpu->tpu_pool;
return 0;
}
void
-threadpool_put(threadpool_t *pool, pri_t pri)
+threadpool_put(struct threadpool *pool, pri_t pri)
{
struct threadpool_unbound *tpu =
container_of(pool, struct threadpool_unbound, tpu_pool);
@@ -491,9 +474,9 @@ threadpool_put(threadpool_t *pool, pri_t
/* Per-CPU thread pools */
int
-threadpool_percpu_get(threadpool_percpu_t **pool_percpup, pri_t pri)
+threadpool_percpu_get(struct threadpool_percpu **pool_percpup, pri_t pri)
{
- threadpool_percpu_t *pool_percpu, *tmp = NULL;
+ struct threadpool_percpu *pool_percpu, *tmp = NULL;
int error;
THREADPOOL_INIT();
@@ -541,7 +524,7 @@ threadpool_percpu_get(threadpool_percpu_
}
void
-threadpool_percpu_put(threadpool_percpu_t *pool_percpu, pri_t pri)
+threadpool_percpu_put(struct threadpool_percpu *pool_percpu, pri_t pri)
{
THREADPOOL_INIT();
@@ -565,10 +548,10 @@ threadpool_percpu_put(threadpool_percpu_
threadpool_percpu_destroy(pool_percpu);
}
-threadpool_t *
-threadpool_percpu_ref(threadpool_percpu_t *pool_percpu)
+struct threadpool *
+threadpool_percpu_ref(struct threadpool_percpu *pool_percpu)
{
- threadpool_t **poolp, *pool;
+ struct threadpool **poolp, *pool;
poolp = percpu_getref(pool_percpu->tpp_percpu);
pool = *poolp;
@@ -577,11 +560,11 @@ threadpool_percpu_ref(threadpool_percpu_
return pool;
}
-threadpool_t *
-threadpool_percpu_ref_remote(threadpool_percpu_t *pool_percpu,
+struct threadpool *
+threadpool_percpu_ref_remote(struct threadpool_percpu *pool_percpu,
struct cpu_info *ci)
{
- threadpool_t **poolp, *pool;
+ struct threadpool **poolp, *pool;
percpu_traverse_enter();
poolp = percpu_getptr_remote(pool_percpu->tpp_percpu, ci);
@@ -592,9 +575,9 @@ threadpool_percpu_ref_remote(threadpool_
}
static int
-threadpool_percpu_create(threadpool_percpu_t **pool_percpup, pri_t pri)
+threadpool_percpu_create(struct threadpool_percpu **pool_percpup, pri_t pri)
{
- threadpool_percpu_t *pool_percpu;
+ struct threadpool_percpu *pool_percpu;
struct cpu_info *ci;
CPU_INFO_ITERATOR cii;
unsigned int i, j;
@@ -607,36 +590,36 @@ threadpool_percpu_create(threadpool_perc
}
pool_percpu->tpp_pri = pri;
- pool_percpu->tpp_percpu = percpu_alloc(sizeof(threadpool_t *));
+ pool_percpu->tpp_percpu = percpu_alloc(sizeof(struct threadpool *));
if (pool_percpu->tpp_percpu == NULL) {
error = ENOMEM;
goto fail1;
}
for (i = 0, CPU_INFO_FOREACH(cii, ci), i++) {
- threadpool_t *pool;
+ struct threadpool *pool;
error = threadpool_create(&pool, ci, pri, sizeof(*pool));
if (error)
goto fail2;
percpu_traverse_enter();
- threadpool_t **const poolp =
+ struct threadpool **const poolp =
percpu_getptr_remote(pool_percpu->tpp_percpu, ci);
*poolp = pool;
percpu_traverse_exit();
}
/* Success! */
- *pool_percpup = (threadpool_percpu_t *)pool_percpu;
+ *pool_percpup = (struct threadpool_percpu *)pool_percpu;
return 0;
fail2: for (j = 0, CPU_INFO_FOREACH(cii, ci), j++) {
if (i <= j)
break;
percpu_traverse_enter();
- threadpool_t **const poolp =
+ struct threadpool **const poolp =
percpu_getptr_remote(pool_percpu->tpp_percpu, ci);
- threadpool_t *const pool = *poolp;
+ struct threadpool *const pool = *poolp;
percpu_traverse_exit();
threadpool_destroy(pool, sizeof(*pool));
}
@@ -646,31 +629,30 @@ fail0: return error;
}
static void
-threadpool_percpu_destroy(threadpool_percpu_t *pool_percpu)
+threadpool_percpu_destroy(struct threadpool_percpu *pool_percpu)
{
struct cpu_info *ci;
CPU_INFO_ITERATOR cii;
for (CPU_INFO_FOREACH(cii, ci)) {
percpu_traverse_enter();
- threadpool_t **const poolp =
+ struct threadpool **const poolp =
percpu_getptr_remote(pool_percpu->tpp_percpu, ci);
- threadpool_t *const pool = *poolp;
+ struct threadpool *const pool = *poolp;
percpu_traverse_exit();
threadpool_destroy(pool, sizeof(*pool));
}
- percpu_free(pool_percpu->tpp_percpu, sizeof(threadpool_t *));
+ percpu_free(pool_percpu->tpp_percpu, sizeof(struct threadpool *));
kmem_free(pool_percpu, sizeof(*pool_percpu));
}
/* Thread pool jobs */
void __printflike(4,5)
-threadpool_job_init(threadpool_job_t *ext_job, threadpool_job_fn_t fn,
+threadpool_job_init(struct threadpool_job *job, threadpool_job_fn_t fn,
kmutex_t *lock, const char *fmt, ...)
{
- threadpool_job_impl_t *job = THREADPOOL_JOB_TO_IMPL(ext_job);
va_list ap;
va_start(ap, fmt);
@@ -685,16 +667,15 @@ threadpool_job_init(threadpool_job_t *ex
}
static void
-threadpool_job_dead(threadpool_job_t *ext_job)
+threadpool_job_dead(struct threadpool_job *job)
{
- panic("threadpool job %p ran after destruction", ext_job);
+ panic("threadpool job %p ran after destruction", job);
}
void
-threadpool_job_destroy(threadpool_job_t *ext_job)
+threadpool_job_destroy(struct threadpool_job *job)
{
- threadpool_job_impl_t *job = THREADPOOL_JOB_TO_IMPL(ext_job);
ASSERT_SLEEPABLE();
@@ -715,7 +696,7 @@ threadpool_job_destroy(threadpool_job_t
}
static int
-threadpool_job_hold(threadpool_job_impl_t *job)
+threadpool_job_hold(struct threadpool_job *job)
{
unsigned int refcnt;
do {
@@ -729,7 +710,7 @@ threadpool_job_hold(threadpool_job_impl_
}
static void
-threadpool_job_rele(threadpool_job_impl_t *job)
+threadpool_job_rele(struct threadpool_job *job)
{
unsigned int refcnt;
@@ -750,9 +731,8 @@ threadpool_job_rele(threadpool_job_impl_
}
void
-threadpool_job_done(threadpool_job_t *ext_job)
+threadpool_job_done(struct threadpool_job *job)
{
- threadpool_job_impl_t *job = THREADPOOL_JOB_TO_IMPL(ext_job);
KASSERT(mutex_owned(job->job_lock));
KASSERT(job->job_thread != NULL);
@@ -763,9 +743,8 @@ threadpool_job_done(threadpool_job_t *ex
}
void
-threadpool_schedule_job(threadpool_t *pool, threadpool_job_t *ext_job)
+threadpool_schedule_job(struct threadpool *pool, struct threadpool_job *job)
{
- threadpool_job_impl_t *job = THREADPOOL_JOB_TO_IMPL(ext_job);
KASSERT(mutex_owned(job->job_lock));
@@ -807,9 +786,8 @@ threadpool_schedule_job(threadpool_t *po
}
bool
-threadpool_cancel_job_async(threadpool_t *pool, threadpool_job_t *ext_job)
+threadpool_cancel_job_async(struct threadpool *pool, struct threadpool_job *job)
{
- threadpool_job_impl_t *job = THREADPOOL_JOB_TO_IMPL(ext_job);
KASSERT(mutex_owned(job->job_lock));
@@ -851,15 +829,14 @@ threadpool_cancel_job_async(threadpool_t
}
void
-threadpool_cancel_job(threadpool_t *pool, threadpool_job_t *ext_job)
+threadpool_cancel_job(struct threadpool *pool, struct threadpool_job *job)
{
- threadpool_job_impl_t *job = THREADPOOL_JOB_TO_IMPL(ext_job);
ASSERT_SLEEPABLE();
KASSERT(mutex_owned(job->job_lock));
- if (threadpool_cancel_job_async(pool, ext_job))
+ if (threadpool_cancel_job_async(pool, job))
return;
/* Already running. Wait for it to complete. */
@@ -873,7 +850,7 @@ static void __dead
threadpool_overseer_thread(void *arg)
{
struct threadpool_thread *const overseer = arg;
- threadpool_t *const pool = overseer->tpt_pool;
+ struct threadpool *const pool = overseer->tpt_pool;
struct lwp *lwp = NULL;
int ktflags;
int error;
@@ -949,7 +926,7 @@ threadpool_overseer_thread(void *arg)
/* There are idle threads, so try giving one a job. */
bool rele_job = true;
- threadpool_job_impl_t *const job = TAILQ_FIRST(&pool->tp_jobs);
+ struct threadpool_job *const job = TAILQ_FIRST(&pool->tp_jobs);
TAILQ_REMOVE(&pool->tp_jobs, job, job_entry);
error = threadpool_job_hold(job);
if (error) {
@@ -1014,7 +991,7 @@ static void __dead
threadpool_thread(void *arg)
{
struct threadpool_thread *const thread = arg;
- threadpool_t *const pool = thread->tpt_pool;
+ struct threadpool *const pool = thread->tpt_pool;
KASSERT((pool->tp_cpu == NULL) || (pool->tp_cpu == curcpu()));
@@ -1044,7 +1021,7 @@ threadpool_thread(void *arg)
break;
}
- threadpool_job_impl_t *const job = thread->tpt_job;
+ struct threadpool_job *const job = thread->tpt_job;
KASSERT(job != NULL);
mutex_spin_exit(&pool->tp_lock);
@@ -1058,7 +1035,7 @@ threadpool_thread(void *arg)
lwp_unlock(curlwp);
/* Run the job. */
- (*job->job_fn)(THREADPOOL_IMPL_TO_JOB(job));
+ (*job->job_fn)(job);
/* Restore our lwp name. */
lwp_lock(curlwp);
Index: src/sys/sys/threadpool.h
diff -u src/sys/sys/threadpool.h:1.2 src/sys/sys/threadpool.h:1.3
--- src/sys/sys/threadpool.h:1.2 Mon Dec 24 21:40:48 2018
+++ src/sys/sys/threadpool.h Wed Dec 26 18:54:19 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: threadpool.h,v 1.2 2018/12/24 21:40:48 thorpej Exp $ */
+/* $NetBSD: threadpool.h,v 1.3 2018/12/26 18:54:19 thorpej Exp $ */
/*-
* Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -39,38 +39,44 @@
#include <sys/types.h>
#include <sys/param.h>
#include <sys/mutex.h>
+#include <sys/queue.h>
-typedef struct threadpool threadpool_t;
-typedef struct threadpool_percpu threadpool_percpu_t;
+struct threadpool;
+struct threadpool_job;
+struct threadpool_percpu;
+struct threadpool_thread;
+
+typedef void (*threadpool_job_fn_t)(struct threadpool_job *);
typedef struct threadpool_job {
-#ifdef _LP64
- void *opaque[11];
-#else
- void *opaque[13];
-#endif /* _LP64 */
+ kmutex_t *job_lock;
+ struct threadpool_thread *job_thread;
+ TAILQ_ENTRY(threadpool_job) job_entry;
+ volatile unsigned int job_refcnt;
+ kcondvar_t job_cv;
+ threadpool_job_fn_t job_fn;
+ char job_name[MAXCOMLEN];
} threadpool_job_t;
-typedef void (*threadpool_job_fn_t)(threadpool_job_t *);
-
-int threadpool_get(threadpool_t **, pri_t);
-void threadpool_put(threadpool_t *, pri_t);
+int threadpool_get(struct threadpool **, pri_t);
+void threadpool_put(struct threadpool *, pri_t);
-int threadpool_percpu_get(threadpool_percpu_t **, pri_t);
-void threadpool_percpu_put(threadpool_percpu_t *, pri_t);
-threadpool_t *
- threadpool_percpu_ref(threadpool_percpu_t *);
-threadpool_t *
- threadpool_percpu_ref_remote(threadpool_percpu_t *,
+int threadpool_percpu_get(struct threadpool_percpu **, pri_t);
+void threadpool_percpu_put(struct threadpool_percpu *, pri_t);
+struct threadpool *
+ threadpool_percpu_ref(struct threadpool_percpu *);
+struct threadpool *
+ threadpool_percpu_ref_remote(struct threadpool_percpu *,
struct cpu_info *);
-void threadpool_job_init(threadpool_job_t *, threadpool_job_fn_t,
+void threadpool_job_init(struct threadpool_job *, threadpool_job_fn_t,
kmutex_t *, const char *, ...) __printflike(4,5);
-void threadpool_job_destroy(threadpool_job_t *);
-void threadpool_job_done(threadpool_job_t *);
+void threadpool_job_destroy(struct threadpool_job *);
+void threadpool_job_done(struct threadpool_job *);
-void threadpool_schedule_job(threadpool_t *, threadpool_job_t *);
-void threadpool_cancel_job(threadpool_t *, threadpool_job_t *);
-bool threadpool_cancel_job_async(threadpool_t *, threadpool_job_t *);
+void threadpool_schedule_job(struct threadpool *, struct threadpool_job *);
+void threadpool_cancel_job(struct threadpool *, struct threadpool_job *);
+bool threadpool_cancel_job_async(struct threadpool *,
+ struct threadpool_job *);
#endif /* _SYS_THREADPOOL_H_ */
Index: src/tests/kernel/threadpool_tester/threadpool_tester.c
diff -u src/tests/kernel/threadpool_tester/threadpool_tester.c:1.1 src/tests/kernel/threadpool_tester/threadpool_tester.c:1.2
--- src/tests/kernel/threadpool_tester/threadpool_tester.c:1.1 Mon Dec 24 16:58:54 2018
+++ src/tests/kernel/threadpool_tester/threadpool_tester.c Wed Dec 26 18:54:19 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: threadpool_tester.c,v 1.1 2018/12/24 16:58:54 thorpej Exp $ */
+/* $NetBSD: threadpool_tester.c,v 1.2 2018/12/26 18:54:19 thorpej Exp $ */
/*-
* Copyright (c) 2018 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: threadpool_tester.c,v 1.1 2018/12/24 16:58:54 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: threadpool_tester.c,v 1.2 2018/12/26 18:54:19 thorpej Exp $");
#include <sys/param.h>
#include <sys/kernel.h>
@@ -49,10 +49,10 @@ MODULE(MODULE_CLASS_MISC, threadpool_tes
static struct tester_context {
kmutex_t ctx_mutex;
struct sysctllog *ctx_sysctllog;
- threadpool_t *ctx_unbound[PRI_COUNT + 1];
- threadpool_percpu_t *ctx_percpu[PRI_COUNT + 1];
+ struct threadpool *ctx_unbound[PRI_COUNT + 1];
+ struct threadpool_percpu *ctx_percpu[PRI_COUNT + 1];
unsigned int ctx_value;
- threadpool_job_t ctx_job;
+ struct threadpool_job ctx_job;
} tester_ctx;
#define pri_to_idx(pri) ((pri) == PRI_NONE ? PRI_COUNT : (pri))
@@ -67,7 +67,7 @@ static int
threadpool_tester_get_unbound(SYSCTLFN_ARGS)
{
struct tester_context *ctx;
- threadpool_t *pool, *opool = NULL;
+ struct threadpool *pool, *opool = NULL;
struct sysctlnode node;
int error, val;
@@ -116,7 +116,7 @@ static int
threadpool_tester_put_unbound(SYSCTLFN_ARGS)
{
struct tester_context *ctx;
- threadpool_t *pool;
+ struct threadpool *pool;
struct sysctlnode node;
int error, val;
@@ -155,7 +155,7 @@ static int
threadpool_tester_run_unbound(SYSCTLFN_ARGS)
{
struct tester_context *ctx;
- threadpool_t *pool;
+ struct threadpool *pool;
struct sysctlnode node;
int error, val;
@@ -192,7 +192,7 @@ static int
threadpool_tester_get_percpu(SYSCTLFN_ARGS)
{
struct tester_context *ctx;
- threadpool_percpu_t *pcpu, *opcpu = NULL;
+ struct threadpool_percpu *pcpu, *opcpu = NULL;
struct sysctlnode node;
int error, val;
@@ -241,7 +241,7 @@ static int
threadpool_tester_put_percpu(SYSCTLFN_ARGS)
{
struct tester_context *ctx;
- threadpool_percpu_t *pcpu;
+ struct threadpool_percpu *pcpu;
struct sysctlnode node;
int error, val;
@@ -280,8 +280,8 @@ static int
threadpool_tester_run_percpu(SYSCTLFN_ARGS)
{
struct tester_context *ctx;
- threadpool_percpu_t *pcpu;
- threadpool_t *pool;
+ struct threadpool_percpu *pcpu;
+ struct threadpool *pool;
struct sysctlnode node;
int error, val;
@@ -343,7 +343,7 @@ threadpool_tester_test_value(SYSCTLFN_AR
}
static void
-threadpool_tester_job(threadpool_job_t *job)
+threadpool_tester_job(struct threadpool_job *job)
{
struct tester_context *ctx =
container_of(job, struct tester_context, ctx_job);
@@ -447,9 +447,9 @@ threadpool_tester_fini(void)
mutex_enter(&tester_ctx.ctx_mutex);
for (pri = PRI_NONE/*-1*/; pri < PRI_COUNT; pri++) {
- threadpool_t *pool =
+ struct threadpool *pool =
tester_ctx.ctx_unbound[pri_to_idx(pri)];
- threadpool_percpu_t *pcpu =
+ struct threadpool_percpu *pcpu =
tester_ctx.ctx_percpu[pri_to_idx(pri)];
/*
Index: src/tests/rump/kernspace/threadpool.c
diff -u src/tests/rump/kernspace/threadpool.c:1.2 src/tests/rump/kernspace/threadpool.c:1.3
--- src/tests/rump/kernspace/threadpool.c:1.2 Tue Dec 25 21:26:31 2018
+++ src/tests/rump/kernspace/threadpool.c Wed Dec 26 18:54:20 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: threadpool.c,v 1.2 2018/12/25 21:26:31 thorpej Exp $ */
+/* $NetBSD: threadpool.c,v 1.3 2018/12/26 18:54:20 thorpej Exp $ */
/*-
* Copyright (c) 2018 The NetBSD Foundation, Inc.
@@ -32,7 +32,7 @@
#include <sys/cdefs.h>
#if !defined(lint)
-__RCSID("$NetBSD: threadpool.c,v 1.2 2018/12/25 21:26:31 thorpej Exp $");
+__RCSID("$NetBSD: threadpool.c,v 1.3 2018/12/26 18:54:20 thorpej Exp $");
#endif /* !lint */
#include <sys/param.h>
@@ -47,7 +47,7 @@ __RCSID("$NetBSD: threadpool.c,v 1.2 201
void
rumptest_threadpool_unbound_lifecycle(void)
{
- threadpool_t *pool0, *pool1, *pool2;
+ struct threadpool *pool0, *pool1, *pool2;
int error;
error = threadpool_get(&pool0, PRI_NONE);
@@ -71,7 +71,7 @@ rumptest_threadpool_unbound_lifecycle(vo
void
rumptest_threadpool_percpu_lifecycle(void)
{
- threadpool_percpu_t *pcpu0, *pcpu1, *pcpu2;
+ struct threadpool_percpu *pcpu0, *pcpu1, *pcpu2;
int error;
error = threadpool_percpu_get(&pcpu0, PRI_NONE);
@@ -96,13 +96,13 @@ struct test_job_data {
kmutex_t mutex;
kcondvar_t cond;
unsigned int count;
- threadpool_job_t job;
+ struct threadpool_job job;
};
#define FINAL_COUNT 12345
static void
-test_job_func_schedule(threadpool_job_t *job)
+test_job_func_schedule(struct threadpool_job *job)
{
struct test_job_data *data =
container_of(job, struct test_job_data, job);
@@ -116,7 +116,7 @@ test_job_func_schedule(threadpool_job_t
}
static void
-test_job_func_cancel(threadpool_job_t *job)
+test_job_func_cancel(struct threadpool_job *job)
{
struct test_job_data *data =
container_of(job, struct test_job_data, job);
@@ -153,7 +153,7 @@ void
rumptest_threadpool_unbound_schedule(void)
{
struct test_job_data data;
- threadpool_t *pool;
+ struct threadpool *pool;
int error;
error = threadpool_get(&pool, PRI_NONE);
@@ -178,8 +178,8 @@ void
rumptest_threadpool_percpu_schedule(void)
{
struct test_job_data data;
- threadpool_percpu_t *pcpu;
- threadpool_t *pool;
+ struct threadpool_percpu *pcpu;
+ struct threadpool *pool;
int error;
error = threadpool_percpu_get(&pcpu, PRI_NONE);
@@ -206,7 +206,7 @@ void
rumptest_threadpool_job_cancel(void)
{
struct test_job_data data;
- threadpool_t *pool;
+ struct threadpool *pool;
int error;
bool rv;