Change __mp_lock_held() to work with an arbitrary CPU info structure and
authormpi <mpi@openbsd.org>
Mon, 4 Dec 2017 09:51:03 +0000 (09:51 +0000)
committermpi <mpi@openbsd.org>
Mon, 4 Dec 2017 09:51:03 +0000 (09:51 +0000)
extend ddb(4) "ps /o" output to print which CPU is currently holding the
KERNEL_LOCK().

Tested by dhill@, ok visa@

12 files changed:
sys/arch/alpha/alpha/lock_machdep.c
sys/arch/alpha/include/mplock.h
sys/arch/arm64/include/mplock.h
sys/arch/hppa/hppa/lock_machdep.c
sys/arch/hppa/include/mplock.h
sys/arch/m88k/include/mplock.h
sys/arch/powerpc/include/mplock.h
sys/arch/powerpc/powerpc/lock_machdep.c
sys/kern/kern_lock.c
sys/kern/kern_proc.c
sys/sys/mplock.h
sys/sys/sched.h

index f9292e8..d1267d0 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: lock_machdep.c,v 1.6 2017/05/29 14:19:49 mpi Exp $    */
+/*     $OpenBSD: lock_machdep.c,v 1.7 2017/12/04 09:51:03 mpi Exp $    */
 
 /*
  * Copyright (c) 2007 Artur Grabowski <art@openbsd.org>
@@ -186,7 +186,7 @@ __mp_acquire_count(struct __mp_lock *mpl, int count)
 }
 
 int
-__mp_lock_held(struct __mp_lock *mpl)
+__mp_lock_held(struct __mp_lock *mpl, struct cpu_info *ci)
 {
-       return (mpl->mpl_cpu == curcpu());
+       return (mpl->mpl_cpu == ci);
 }
index 8f8523a..664e943 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: mplock.h,v 1.1 2014/01/26 17:40:11 miod Exp $ */
+/*     $OpenBSD: mplock.h,v 1.2 2017/12/04 09:51:03 mpi Exp $  */
 
 /*
  * Copyright (c) 2004 Niklas Hallqvist.  All rights reserved.
@@ -45,7 +45,7 @@ void __mp_unlock(struct __mp_lock *);
 int __mp_release_all(struct __mp_lock *);
 int __mp_release_all_but_one(struct __mp_lock *);
 void __mp_acquire_count(struct __mp_lock *, int);
-int __mp_lock_held(struct __mp_lock *);
+int __mp_lock_held(struct __mp_lock *, struct cpu_info *);
 
 #endif
 
index f85c6df..9aed99f 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: mplock.h,v 1.1 2016/12/17 23:38:33 patrick Exp $      */
+/*     $OpenBSD: mplock.h,v 1.2 2017/12/04 09:51:03 mpi Exp $  */
 
 /*
  * Copyright (c) 2004 Niklas Hallqvist.  All rights reserved.
@@ -46,7 +46,7 @@ void __mp_unlock(struct __mp_lock *);
 int __mp_release_all(struct __mp_lock *);
 int __mp_release_all_but_one(struct __mp_lock *);
 void __mp_acquire_count(struct __mp_lock *, int);
-int __mp_lock_held(struct __mp_lock *);
+int __mp_lock_held(struct __mp_lock *, struct cpu_info *);
 
 #endif
 
index 605a54f..aeccffa 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: lock_machdep.c,v 1.12 2017/07/16 22:48:38 guenther Exp $      */
+/*     $OpenBSD: lock_machdep.c,v 1.13 2017/12/04 09:51:03 mpi Exp $   */
 
 /*
  * Copyright (c) 2007 Artur Grabowski <art@openbsd.org>
@@ -100,7 +100,7 @@ ___mp_lock(struct __mp_lock *mpl LOCK_FL_VARS)
        int s;
 
 #ifdef WITNESS
-       if (!__mp_lock_held(mpl))
+       if (!__mp_lock_held(mpl, curcpu()))
                WITNESS_CHECKORDER(&mpl->mpl_lock_obj,
                    LOP_EXCLUSIVE | LOP_NEWORDER, file, line, NULL);
 #endif
@@ -225,7 +225,7 @@ ___mp_acquire_count(struct __mp_lock *mpl, int count LOCK_FL_VARS)
 }
 
 int
-__mp_lock_held(struct __mp_lock *mpl)
+__mp_lock_held(struct __mp_lock *mpl, struct cpu_info *ci)
 {
-       return mpl->mpl_cpu == curcpu();
+       return mpl->mpl_cpu == ci;
 }
index 3315424..db93266 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: mplock.h,v 1.2 2017/07/16 22:48:38 guenther Exp $     */
+/*     $OpenBSD: mplock.h,v 1.3 2017/12/04 09:51:03 mpi Exp $  */
 
 /*
  * Copyright (c) 2004 Niklas Hallqvist.  All rights reserved.
@@ -52,7 +52,7 @@ void  ___mp_unlock(struct __mp_lock * LOCK_FL_VARS);
 int    ___mp_release_all(struct __mp_lock * LOCK_FL_VARS);
 int    ___mp_release_all_but_one(struct __mp_lock * LOCK_FL_VARS);
 void   ___mp_acquire_count(struct __mp_lock *, int LOCK_FL_VARS);
-int    __mp_lock_held(struct __mp_lock *);
+int    __mp_lock_held(struct __mp_lock *, struct cpu_info *);
 
 #ifdef WITNESS
 
index 8b9e828..2a9e3ce 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: mplock.h,v 1.2 2011/03/23 16:54:35 pirofti Exp $      */
+/*     $OpenBSD: mplock.h,v 1.3 2017/12/04 09:51:03 mpi Exp $  */
 
 /*
  * Copyright (c) 2004 Niklas Hallqvist.  All rights reserved.
@@ -61,9 +61,9 @@ __mp_acquire_count(struct __mp_lock *mpl, int count)
 }
 
 static __inline__ int
-__mp_lock_held(struct __mp_lock *mpl)
+__mp_lock_held(struct __mp_lock *mpl, struct cpu_info *ci)
 {
-       return mpl->mpl_cpu == curcpu();
+       return mpl->mpl_cpu == ci;
 }
 
 #endif
index 29fbfbb..a412a6c 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: mplock.h,v 1.2 2015/06/26 11:22:12 dlg Exp $  */
+/*     $OpenBSD: mplock.h,v 1.3 2017/12/04 09:51:03 mpi Exp $  */
 
 /*
  * Copyright (c) 2004 Niklas Hallqvist.  All rights reserved.
@@ -45,7 +45,7 @@ void __mp_unlock(struct __mp_lock *);
 int __mp_release_all(struct __mp_lock *);
 int __mp_release_all_but_one(struct __mp_lock *);
 void __mp_acquire_count(struct __mp_lock *, int);
-int __mp_lock_held(struct __mp_lock *);
+int __mp_lock_held(struct __mp_lock *, struct cpu_info *);
 
 #endif
 
index b78af74..de6690d 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: lock_machdep.c,v 1.6 2017/05/29 14:19:50 mpi Exp $    */
+/*     $OpenBSD: lock_machdep.c,v 1.7 2017/12/04 09:51:03 mpi Exp $    */
 
 /*
  * Copyright (c) 2007 Artur Grabowski <art@openbsd.org>
@@ -164,7 +164,7 @@ __mp_acquire_count(struct __mp_lock *mpl, int count)
 }
 
 int
-__mp_lock_held(struct __mp_lock *mpl)
+__mp_lock_held(struct __mp_lock *mpl, struct cpu_info *ci)
 {
-       return mpl->mpl_cpu == curcpu();
+       return mpl->mpl_cpu == ci;
 }
index 3b6adb1..f067a50 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: kern_lock.c,v 1.51 2017/10/17 14:25:35 visa Exp $     */
+/*     $OpenBSD: kern_lock.c,v 1.52 2017/12/04 09:51:03 mpi Exp $      */
 
 /* 
  * Copyright (c) 1995
@@ -96,7 +96,7 @@ _kernel_lock_held(void)
 {
        if (panicstr)
                return 1;
-       return (__mp_lock_held(&kernel_lock));
+       return (__mp_lock_held(&kernel_lock, curcpu()));
 }
 
 #ifdef __USE_MI_MPLOCK
@@ -168,7 +168,7 @@ ___mp_lock(struct __mp_lock *mpl LOCK_FL_VARS)
        unsigned long s;
 
 #ifdef WITNESS
-       if (!__mp_lock_held(mpl))
+       if (!__mp_lock_held(mpl, curcpu()))
                WITNESS_CHECKORDER(&mpl->mpl_lock_obj,
                    LOP_EXCLUSIVE | LOP_NEWORDER, file, line, NULL);
 #endif
@@ -191,7 +191,7 @@ ___mp_unlock(struct __mp_lock *mpl LOCK_FL_VARS)
        unsigned long s;
 
 #ifdef MP_LOCKDEBUG
-       if (!__mp_lock_held(mpl)) {
+       if (!__mp_lock_held(mpl, curcpu())) {
                db_printf("__mp_unlock(%p): not held lock\n", mpl);
                db_enter();
        }
@@ -244,7 +244,7 @@ ___mp_release_all_but_one(struct __mp_lock *mpl LOCK_FL_VARS)
 #endif
 
 #ifdef MP_LOCKDEBUG
-       if (!__mp_lock_held(mpl)) {
+       if (!__mp_lock_held(mpl, curcpu())) {
                db_printf("__mp_release_all_but_one(%p): not held lock\n", mpl);
                db_enter();
        }
@@ -263,9 +263,9 @@ ___mp_acquire_count(struct __mp_lock *mpl, int count LOCK_FL_VARS)
 }
 
 int
-__mp_lock_held(struct __mp_lock *mpl)
+__mp_lock_held(struct __mp_lock *mpl, struct cpu_info *ci)
 {
-       struct __mp_lock_cpu *cpu = &mpl->mpl_cpus[cpu_number()];
+       struct __mp_lock_cpu *cpu = &mpl->mpl_cpus[CPU_INFO_UNIT(ci)];
 
        return (cpu->mplc_ticket == mpl->mpl_ticket && cpu->mplc_depth > 0);
 }
index 37ad323..7856369 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: kern_proc.c,v 1.77 2017/09/29 09:36:04 mpi Exp $      */
+/*     $OpenBSD: kern_proc.c,v 1.78 2017/12/04 09:51:03 mpi Exp $      */
 /*     $NetBSD: kern_proc.c,v 1.14 1996/02/09 18:59:41 christos Exp $  */
 
 /*
@@ -466,9 +466,10 @@ db_show_all_procs(db_expr_t addr, int haddr, db_expr_t count, char *modif)
 {
        char *mode;
        int skipzomb = 0;
+       int has_kernel_lock = 0;
        struct proc *p;
        struct process *pr, *ppr;
-    
+
        if (modif[0] == 0)
                modif[0] = 'n';                 /* default == normal mode */
 
@@ -483,7 +484,7 @@ db_show_all_procs(db_expr_t addr, int haddr, db_expr_t count, char *modif)
                db_printf("\t/o == show normal info for non-idle SONPROC\n");
                return;
        }
-       
+
        pr = LIST_FIRST(&allprocess);
 
        switch (*mode) {
@@ -511,6 +512,12 @@ db_show_all_procs(db_expr_t addr, int haddr, db_expr_t count, char *modif)
                ppr = pr->ps_pptr;
 
                TAILQ_FOREACH(p, &pr->ps_threads, p_thr_link) {
+#ifdef MULTIPROCESSOR
+                       if (__mp_lock_held(&kernel_lock, p->p_cpu))
+                               has_kernel_lock = 1;
+                       else
+                               has_kernel_lock = 0;
+#endif
                        if (p->p_stat) {
                                if (*mode == 'o') {
                                        if (p->p_stat != SONPROC)
@@ -556,10 +563,11 @@ db_show_all_procs(db_expr_t addr, int haddr, db_expr_t count, char *modif)
 
                                case 'o':
                                        db_printf("%5d  %5d  %#10x %#10x  %3d"
-                                           "  %-31s\n",
+                                           "%c %-31s\n",
                                            pr->ps_pid, pr->ps_ucred->cr_ruid,
                                            pr->ps_flags, p->p_flag,
                                            CPU_INFO_UNIT(p->p_cpu),
+                                           has_kernel_lock ? 'K' : ' ',
                                            pr->ps_comm);
                                        break;
 
index a1a0623..1d64bbc 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: mplock.h,v 1.10 2017/10/17 14:25:35 visa Exp $        */
+/*     $OpenBSD: mplock.h,v 1.11 2017/12/04 09:51:03 mpi Exp $ */
 
 /*
  * Copyright (c) 2004 Niklas Hallqvist.  All rights reserved.
@@ -53,7 +53,7 @@ void  ___mp_unlock(struct __mp_lock * LOCK_FL_VARS);
 int    ___mp_release_all(struct __mp_lock * LOCK_FL_VARS);
 int    ___mp_release_all_but_one(struct __mp_lock * LOCK_FL_VARS);
 void   ___mp_acquire_count(struct __mp_lock *, int LOCK_FL_VARS);
-int    __mp_lock_held(struct __mp_lock *);
+int    __mp_lock_held(struct __mp_lock *, struct cpu_info *);
 
 #ifdef WITNESS
 
index 0ae777f..0da1f2c 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: sched.h,v 1.42 2017/02/14 10:31:15 mpi Exp $  */
+/*     $OpenBSD: sched.h,v 1.43 2017/12/04 09:51:03 mpi Exp $  */
 /* $NetBSD: sched.h,v 1.2 1999/02/28 18:14:58 ross Exp $ */
 
 /*-
@@ -199,9 +199,12 @@ extern struct __mp_lock sched_lock;
 #define        SCHED_ASSERT_LOCKED()                                           \
 do {                                                                   \
        splassert(IPL_SCHED);                                           \
-       KASSERT(__mp_lock_held(&sched_lock));                           \
+       KASSERT(__mp_lock_held(&sched_lock, curcpu()));                 \
+} while (0)
+#define        SCHED_ASSERT_UNLOCKED()                                         \
+do {                                                                   \
+       KASSERT(__mp_lock_held(&sched_lock, curcpu()) == 0);            \
 } while (0)
-#define        SCHED_ASSERT_UNLOCKED() KASSERT(__mp_lock_held(&sched_lock) == 0)
 
 #define        SCHED_LOCK_INIT()       __mp_lock_init(&sched_lock)