Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys PR/55664: Ruslan Nikolaev: Split out sleepq guts and tur...
details: https://anonhg.NetBSD.org/src/rev/5e9794677be3
branches: trunk
changeset: 941936:5e9794677be3
user: christos <christos%NetBSD.org@localhost>
date: Sun Nov 01 20:55:15 2020 +0000
description:
PR/55664: Ruslan Nikolaev: Split out sleepq guts and turnstiles not used
in rump into a separate header file. Add a sleepq_destroy() empty hook.
diffstat:
sys/kern/kern_condvar.c | 5 +-
sys/sys/sleepq.h | 98 +---------------------------------
sys/sys/sleeptab.h | 136 ++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 142 insertions(+), 97 deletions(-)
diffs (truncated from 301 to 300 lines):
diff -r 51110d2204ed -r 5e9794677be3 sys/kern/kern_condvar.c
--- a/sys/kern/kern_condvar.c Sun Nov 01 20:24:45 2020 +0000
+++ b/sys/kern/kern_condvar.c Sun Nov 01 20:55:15 2020 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: kern_condvar.c,v 1.52 2020/05/11 03:59:33 riastradh Exp $ */
+/* $NetBSD: kern_condvar.c,v 1.53 2020/11/01 20:55:15 christos Exp $ */
/*-
* Copyright (c) 2006, 2007, 2008, 2019, 2020 The NetBSD Foundation, Inc.
@@ -34,7 +34,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_condvar.c,v 1.52 2020/05/11 03:59:33 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_condvar.c,v 1.53 2020/11/01 20:55:15 christos Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -102,6 +102,7 @@
cv_destroy(kcondvar_t *cv)
{
+ sleepq_destroy(CV_SLEEPQ(cv));
#ifdef DIAGNOSTIC
KASSERT(cv_is_valid(cv));
KASSERT(!cv_has_waiters(cv));
diff -r 51110d2204ed -r 5e9794677be3 sys/sys/sleepq.h
--- a/sys/sys/sleepq.h Sun Nov 01 20:24:45 2020 +0000
+++ b/sys/sys/sleepq.h Sun Nov 01 20:55:15 2020 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: sleepq.h,v 1.32 2020/10/23 00:25:45 thorpej Exp $ */
+/* $NetBSD: sleepq.h,v 1.33 2020/11/01 20:55:15 christos Exp $ */
/*-
* Copyright (c) 2002, 2006, 2007, 2008, 2009, 2019, 2020
@@ -45,20 +45,10 @@
* Generic sleep queues.
*/
-#define SLEEPTAB_HASH_SHIFT 7
-#define SLEEPTAB_HASH_SIZE (1 << SLEEPTAB_HASH_SHIFT)
-#define SLEEPTAB_HASH_MASK (SLEEPTAB_HASH_SIZE - 1)
-#define SLEEPTAB_HASH(wchan) (((uintptr_t)(wchan) >> 8) & SLEEPTAB_HASH_MASK)
-
-LIST_HEAD(sleepq, lwp);
-
typedef struct sleepq sleepq_t;
-typedef struct sleeptab {
- sleepq_t st_queue[SLEEPTAB_HASH_SIZE];
-} sleeptab_t;
-
void sleepq_init(sleepq_t *);
+void sleepq_destroy(sleepq_t *);
void sleepq_remove(sleepq_t *, lwp_t *);
void sleepq_enqueue(sleepq_t *, wchan_t, const char *, struct syncobj *,
bool);
@@ -73,10 +63,6 @@
void sleepq_lendpri(lwp_t *, pri_t);
int sleepq_block(int, bool);
-void sleeptab_init(sleeptab_t *);
-
-extern sleeptab_t sleeptab;
-
#ifdef _KERNEL
typedef union {
kmutex_t lock;
@@ -97,35 +83,6 @@
}
/*
- * Find the correct sleep queue for the specified wait channel. This
- * acquires and holds the per-queue interlock.
- */
-static __inline sleepq_t *
-sleeptab_lookup(sleeptab_t *st, wchan_t wchan, kmutex_t **mp)
-{
- extern sleepqlock_t sleepq_locks[SLEEPTAB_HASH_SIZE];
- sleepq_t *sq;
- u_int hash;
-
- hash = SLEEPTAB_HASH(wchan);
- sq = &st->st_queue[hash];
- *mp = &sleepq_locks[hash].lock;
- mutex_spin_enter(*mp);
- return sq;
-}
-
-static __inline kmutex_t *
-sleepq_hashlock(wchan_t wchan)
-{
- extern sleepqlock_t sleepq_locks[SLEEPTAB_HASH_SIZE];
- kmutex_t *mp;
-
- mp = &sleepq_locks[SLEEPTAB_HASH(wchan)].lock;
- mutex_spin_enter(mp);
- return mp;
-}
-
-/*
* Prepare to block on a sleep queue, after which any interlock can be
* safely released.
*/
@@ -143,55 +100,6 @@
}
#endif
-/*
- * Turnstiles, specialized sleep queues for use by kernel locks.
- */
-
-typedef struct turnstile {
- LIST_ENTRY(turnstile) ts_chain; /* link on hash chain */
- struct turnstile *ts_free; /* turnstile free list */
- wchan_t ts_obj; /* lock object */
- sleepq_t ts_sleepq[2]; /* sleep queues */
- u_int ts_waiters[2]; /* count of waiters */
-
- /* priority inheritance */
- pri_t ts_eprio;
- lwp_t *ts_inheritor;
- SLIST_ENTRY(turnstile) ts_pichain;
-} turnstile_t;
-
-LIST_HEAD(tschain, turnstile);
-
-typedef struct tschain tschain_t;
-
-#define TS_READER_Q 0 /* reader sleep queue */
-#define TS_WRITER_Q 1 /* writer sleep queue */
-
-#define TS_WAITERS(ts, q) \
- (ts)->ts_waiters[(q)]
-
-#define TS_ALL_WAITERS(ts) \
- ((ts)->ts_waiters[TS_READER_Q] + \
- (ts)->ts_waiters[TS_WRITER_Q])
-
-#define TS_FIRST(ts, q) (LIST_FIRST(&(ts)->ts_sleepq[(q)]))
-
-#ifdef _KERNEL
-
-void turnstile_init(void);
-turnstile_t *turnstile_lookup(wchan_t);
-void turnstile_ctor(turnstile_t *);
-void turnstile_exit(wchan_t);
-void turnstile_block(turnstile_t *, int, wchan_t, syncobj_t *);
-void turnstile_wakeup(turnstile_t *, int, int, lwp_t *);
-void turnstile_print(volatile void *, void (*)(const char *, ...)
- __printflike(1, 2));
-void turnstile_unsleep(lwp_t *, bool);
-void turnstile_changepri(lwp_t *, pri_t);
-
-extern struct pool turnstile_pool;
-extern turnstile_t turnstile0;
-
-#endif /* _KERNEL */
+#include <sys/sleeptab.h>
#endif /* _SYS_SLEEPQ_H_ */
diff -r 51110d2204ed -r 5e9794677be3 sys/sys/sleeptab.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sys/sys/sleeptab.h Sun Nov 01 20:55:15 2020 +0000
@@ -0,0 +1,136 @@
+/* $NetBSD: sleeptab.h,v 1.1 2020/11/01 20:55:15 christos Exp $ */
+
+/*-
+ * Copyright (c) 2002, 2006, 2007, 2008, 2009, 2019, 2020
+ * The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Jason R. Thorpe and Andrew Doran.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef _SYS_SLEEPTAB_H_
+#define _SYS_SLEEPTAB_H_
+
+#define SLEEPTAB_HASH_SHIFT 7
+#define SLEEPTAB_HASH_SIZE (1 << SLEEPTAB_HASH_SHIFT)
+#define SLEEPTAB_HASH_MASK (SLEEPTAB_HASH_SIZE - 1)
+#define SLEEPTAB_HASH(wchan) (((uintptr_t)(wchan) >> 8) & SLEEPTAB_HASH_MASK)
+
+LIST_HEAD(sleepq, lwp);
+
+typedef struct sleeptab {
+ sleepq_t st_queue[SLEEPTAB_HASH_SIZE];
+} sleeptab_t;
+
+void sleeptab_init(sleeptab_t *);
+
+extern sleeptab_t sleeptab;
+
+#ifdef _KERNEL
+/*
+ * Find the correct sleep queue for the specified wait channel. This
+ * acquires and holds the per-queue interlock.
+ */
+static __inline sleepq_t *
+sleeptab_lookup(sleeptab_t *st, wchan_t wchan, kmutex_t **mp)
+{
+ extern sleepqlock_t sleepq_locks[SLEEPTAB_HASH_SIZE];
+ sleepq_t *sq;
+ u_int hash;
+
+ hash = SLEEPTAB_HASH(wchan);
+ sq = &st->st_queue[hash];
+ *mp = &sleepq_locks[hash].lock;
+ mutex_spin_enter(*mp);
+ return sq;
+}
+
+static __inline kmutex_t *
+sleepq_hashlock(wchan_t wchan)
+{
+ extern sleepqlock_t sleepq_locks[SLEEPTAB_HASH_SIZE];
+ kmutex_t *mp;
+
+ mp = &sleepq_locks[SLEEPTAB_HASH(wchan)].lock;
+ mutex_spin_enter(mp);
+ return mp;
+}
+
+#define sleepq_destroy(a)
+
+#endif
+
+/*
+ * Turnstiles, specialized sleep queues for use by kernel locks.
+ */
+
+typedef struct turnstile {
+ LIST_ENTRY(turnstile) ts_chain; /* link on hash chain */
+ struct turnstile *ts_free; /* turnstile free list */
+ wchan_t ts_obj; /* lock object */
+ sleepq_t ts_sleepq[2]; /* sleep queues */
+ u_int ts_waiters[2]; /* count of waiters */
+
+ /* priority inheritance */
+ pri_t ts_eprio;
+ lwp_t *ts_inheritor;
+ SLIST_ENTRY(turnstile) ts_pichain;
+} turnstile_t;
+
+LIST_HEAD(tschain, turnstile);
+
+typedef struct tschain tschain_t;
+
+#define TS_READER_Q 0 /* reader sleep queue */
+#define TS_WRITER_Q 1 /* writer sleep queue */
+
+#define TS_WAITERS(ts, q) \
+ (ts)->ts_waiters[(q)]
+
+#define TS_ALL_WAITERS(ts) \
+ ((ts)->ts_waiters[TS_READER_Q] + \
+ (ts)->ts_waiters[TS_WRITER_Q])
+
+#define TS_FIRST(ts, q) (LIST_FIRST(&(ts)->ts_sleepq[(q)]))
+
+#ifdef _KERNEL
+
+void turnstile_init(void);
+turnstile_t *turnstile_lookup(wchan_t);
+void turnstile_ctor(turnstile_t *);
+void turnstile_exit(wchan_t);
+void turnstile_block(turnstile_t *, int, wchan_t, syncobj_t *);
+void turnstile_wakeup(turnstile_t *, int, int, lwp_t *);
+void turnstile_print(volatile void *, void (*)(const char *, ...)
+ __printflike(1, 2));
+void turnstile_unsleep(lwp_t *, bool);
+void turnstile_changepri(lwp_t *, pri_t);
+
+extern struct pool turnstile_pool;
+extern turnstile_t turnstile0;
+
+#endif /* _KERNEL */
+
Home |
Main Index |
Thread Index |
Old Index