Module Name: src
Committed By: ad
Date: Sun Feb 23 16:27:09 UTC 2020
Modified Files:
src/sys/kern: kern_synch.c
src/sys/sys: syncobj.h
Log Message:
kpause(): is only awoken via timeout or signal, so use SOBJ_SLEEPQ_NULL like
_lwp_park() does, and dispense with the hashed sleepq & lock.
To generate a diff of this commit:
cvs rdiff -u -r1.341 -r1.342 src/sys/kern/kern_synch.c
cvs rdiff -u -r1.10 -r1.11 src/sys/sys/syncobj.h
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_synch.c
diff -u src/sys/kern/kern_synch.c:1.341 src/sys/kern/kern_synch.c:1.342
--- src/sys/kern/kern_synch.c:1.341 Sun Feb 23 15:46:41 2020
+++ src/sys/kern/kern_synch.c Sun Feb 23 16:27:09 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: kern_synch.c,v 1.341 2020/02/23 15:46:41 ad Exp $ */
+/* $NetBSD: kern_synch.c,v 1.342 2020/02/23 16:27:09 ad Exp $ */
/*-
* Copyright (c) 1999, 2000, 2004, 2006, 2007, 2008, 2009, 2019, 2020
@@ -69,7 +69,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_synch.c,v 1.341 2020/02/23 15:46:41 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_synch.c,v 1.342 2020/02/23 16:27:09 ad Exp $");
#include "opt_kstack.h"
#include "opt_dtrace.h"
@@ -122,6 +122,14 @@ syncobj_t sched_syncobj = {
.sobj_owner = syncobj_noowner,
};
+syncobj_t kpause_syncobj = {
+ .sobj_flag = SOBJ_SLEEPQ_NULL,
+ .sobj_unsleep = sleepq_unsleep,
+ .sobj_changepri = sleepq_changepri,
+ .sobj_lendpri = sleepq_lendpri,
+ .sobj_owner = syncobj_noowner,
+};
+
/* "Lightning bolt": once a second sleep address. */
kcondvar_t lbolt __cacheline_aligned;
@@ -258,8 +266,6 @@ int
kpause(const char *wmesg, bool intr, int timo, kmutex_t *mtx)
{
struct lwp *l = curlwp;
- kmutex_t *mp;
- sleepq_t *sq;
int error;
KASSERT(!(timo == 0 && intr == false));
@@ -270,9 +276,9 @@ kpause(const char *wmesg, bool intr, int
if (mtx != NULL)
mutex_exit(mtx);
l->l_kpriority = true;
- sq = sleeptab_lookup(&sleeptab, l, &mp);
- sleepq_enter(sq, l, mp);
- sleepq_enqueue(sq, l, wmesg, &sleep_syncobj);
+ lwp_lock(l);
+ KERNEL_UNLOCK_ALL(NULL, &l->l_biglocks);
+ sleepq_enqueue(NULL, l, wmesg, &kpause_syncobj);
error = sleepq_block(timo, intr);
if (mtx != NULL)
mutex_enter(mtx);
Index: src/sys/sys/syncobj.h
diff -u src/sys/sys/syncobj.h:1.10 src/sys/sys/syncobj.h:1.11
--- src/sys/sys/syncobj.h:1.10 Sat Feb 15 17:09:24 2020
+++ src/sys/sys/syncobj.h Sun Feb 23 16:27:09 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: syncobj.h,v 1.10 2020/02/15 17:09:24 ad Exp $ */
+/* $NetBSD: syncobj.h,v 1.11 2020/02/23 16:27:09 ad Exp $ */
/*-
* Copyright (c) 2007, 2008, 2020 The NetBSD Foundation, Inc.
@@ -59,6 +59,7 @@ struct lwp *syncobj_noowner(wchan_t);
extern syncobj_t cv_syncobj;
extern syncobj_t lwp_park_syncobj;
extern syncobj_t mutex_syncobj;
+extern syncobj_t kpause_syncobj;
extern syncobj_t rw_syncobj;
extern syncobj_t sched_syncobj;
extern syncobj_t select_syncobj;