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