Module Name: src
Committed By: thorpej
Date: Thu Dec 27 04:45:29 UTC 2018
Modified Files:
src/sys/kern: kern_threadpool.c
Log Message:
Restore curlwp->l_name in threadpool_job_done(), rather than after the
job function has returned. This lays the groundwork for some job object
reference counting change that will be coming in a subsequent comment.
To generate a diff of this commit:
cvs rdiff -u -r1.11 -r1.12 src/sys/kern/kern_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/sys/kern/kern_threadpool.c
diff -u src/sys/kern/kern_threadpool.c:1.11 src/sys/kern/kern_threadpool.c:1.12
--- src/sys/kern/kern_threadpool.c:1.11 Wed Dec 26 22:16:26 2018
+++ src/sys/kern/kern_threadpool.c Thu Dec 27 04:45:29 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: kern_threadpool.c,v 1.11 2018/12/26 22:16:26 thorpej Exp $ */
+/* $NetBSD: kern_threadpool.c,v 1.12 2018/12/27 04:45:29 thorpej Exp $ */
/*-
* Copyright (c) 2014, 2018 The NetBSD Foundation, Inc.
@@ -81,7 +81,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_threadpool.c,v 1.11 2018/12/26 22:16:26 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_threadpool.c,v 1.12 2018/12/27 04:45:29 thorpej Exp $");
#include <sys/types.h>
#include <sys/param.h>
@@ -107,6 +107,7 @@ TAILQ_HEAD(thread_head, threadpool_threa
struct threadpool_thread {
struct lwp *tpt_lwp;
+ char *tpt_lwp_savedname;
struct threadpool *tpt_pool;
struct threadpool_job *tpt_job;
kcondvar_t tpt_cv;
@@ -693,6 +694,15 @@ threadpool_job_done(struct threadpool_jo
KASSERT(job->job_thread != NULL);
KASSERT(job->job_thread->tpt_lwp == curlwp);
+ /*
+ * We can safely read this field; it's only modified right before
+ * we call the job work function, and we are only preserving it
+ * to use here; no one cares if it contains junk afterward.
+ */
+ lwp_lock(curlwp);
+ curlwp->l_name = job->job_thread->tpt_lwp_savedname;
+ lwp_unlock(curlwp);
+
cv_broadcast(&job->job_cv);
job->job_thread = NULL;
}
@@ -977,24 +987,25 @@ threadpool_thread(void *arg)
struct threadpool_job *const job = thread->tpt_job;
KASSERT(job != NULL);
- mutex_spin_exit(&pool->tp_lock);
-
- TP_LOG(("%s: running job '%s' on thread %p.\n",
- __func__, job->job_name, thread));
/* Set our lwp name to reflect what job we're doing. */
lwp_lock(curlwp);
- char *const lwp_name = curlwp->l_name;
+ char *const lwp_name __diagused = curlwp->l_name;
+ thread->tpt_lwp_savedname = curlwp->l_name;
curlwp->l_name = job->job_name;
lwp_unlock(curlwp);
+ mutex_spin_exit(&pool->tp_lock);
+
+ TP_LOG(("%s: running job '%s' on thread %p.\n",
+ __func__, job->job_name, thread));
+
/* Run the job. */
(*job->job_fn)(job);
- /* Restore our lwp name. */
- lwp_lock(curlwp);
- curlwp->l_name = lwp_name;
- lwp_unlock(curlwp);
+ /* lwp name restored in threadpool_job_done(). */
+ KASSERTMSG((curlwp->l_name == lwp_name),
+ "someone forgot to call threadpool_job_done()!");
/* Job is done and its name is unreferenced. Release it. */
threadpool_job_rele(job);