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;

Reply via email to