Move single_thread_set() out of KERNEL_LOCK().
authormpi <mpi@openbsd.org>
Mon, 15 Feb 2021 09:35:59 +0000 (09:35 +0000)
committermpi <mpi@openbsd.org>
Mon, 15 Feb 2021 09:35:59 +0000 (09:35 +0000)
Use the SCHED_LOCK() to ensure `ps_thread' isn't being modified by a sibling
when entering tsleep(9) w/o KERNEL_LOCK().

ok visa@

sys/kern/kern_exit.c
sys/kern/kern_fork.c
sys/kern/kern_sig.c
sys/sys/proc.h

index 94e3981..cbb116e 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: kern_exit.c,v 1.195 2021/02/08 10:51:01 mpi Exp $     */
+/*     $OpenBSD: kern_exit.c,v 1.196 2021/02/15 09:35:59 mpi Exp $     */
 /*     $NetBSD: kern_exit.c,v 1.39 1996/04/22 01:38:25 christos Exp $  */
 
 /*
@@ -124,6 +124,7 @@ exit1(struct proc *p, int xexit, int xsig, int flags)
 {
        struct process *pr, *qr, *nqr;
        struct rusage *rup;
+       int s;
 
        atomic_setbits_int(&p->p_flag, P_WEXIT);
 
@@ -161,7 +162,9 @@ exit1(struct proc *p, int xexit, int xsig, int flags)
        }
 
        /* unlink ourselves from the active threads */
+       SCHED_LOCK(s);
        TAILQ_REMOVE(&pr->ps_threads, p, p_thr_link);
+       SCHED_UNLOCK(s);
        if ((p->p_flag & P_THREAD) == 0) {
                /* main thread gotta wait because it has the pid, et al */
                while (pr->ps_refcnt > 1)
index ee11b70..2c84a9a 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: kern_fork.c,v 1.233 2021/02/11 13:40:28 otto Exp $    */
+/*     $OpenBSD: kern_fork.c,v 1.234 2021/02/15 09:35:59 mpi Exp $     */
 /*     $NetBSD: kern_fork.c,v 1.29 1996/02/09 18:59:34 christos Exp $  */
 
 /*
@@ -558,13 +558,13 @@ thread_fork(struct proc *curp, void *stack, void *tcb, pid_t *tidptr,
 
        LIST_INSERT_HEAD(&allproc, p, p_list);
        LIST_INSERT_HEAD(TIDHASH(p->p_tid), p, p_hash);
-       TAILQ_INSERT_TAIL(&pr->ps_threads, p, p_thr_link);
 
+       SCHED_LOCK(s);
+       TAILQ_INSERT_TAIL(&pr->ps_threads, p, p_thr_link);
        /*
         * if somebody else wants to take us to single threaded mode,
         * count ourselves in.
         */
-       SCHED_LOCK(s);
        if (pr->ps_single) {
                atomic_inc_int(&pr->ps_singlecount);
                atomic_setbits_int(&p->p_flag, P_SUSPSINGLE);
index 6435794..97d9996 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: kern_sig.c,v 1.272 2021/02/08 10:51:01 mpi Exp $      */
+/*     $OpenBSD: kern_sig.c,v 1.273 2021/02/15 09:35:59 mpi Exp $      */
 /*     $NetBSD: kern_sig.c,v 1.54 1996/04/22 01:38:32 christos Exp $   */
 
 /*
@@ -1209,11 +1209,7 @@ issignal(struct proc *p)
                    signum != SIGKILL) {
                        pr->ps_xsig = signum;
 
-                       if (dolock)
-                               KERNEL_LOCK();
                        single_thread_set(p, SINGLE_PTRACE, 0);
-                       if (dolock)
-                               KERNEL_UNLOCK();
 
                        if (dolock)
                                SCHED_LOCK(s);
@@ -2009,7 +2005,6 @@ single_thread_set(struct proc *p, enum single_thread_mode mode, int deep)
        struct proc *q;
        int error, s;
 
-       KERNEL_ASSERT_LOCKED();
        KASSERT(curproc == p);
 
        SCHED_LOCK(s);
index 4317805..462af50 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: proc.h,v 1.308 2021/02/08 10:51:02 mpi Exp $  */
+/*     $OpenBSD: proc.h,v 1.309 2021/02/15 09:35:59 mpi Exp $  */
 /*     $NetBSD: proc.h,v 1.44 1996/04/22 01:23:21 christos Exp $       */
 
 /*-
@@ -167,7 +167,7 @@ struct process {
        struct  ucred *ps_ucred;        /* Process owner's identity. */
 
        LIST_ENTRY(process) ps_list;    /* List of all processes. */
-       TAILQ_HEAD(,proc) ps_threads;   /* Threads in this process. */
+       TAILQ_HEAD(,proc) ps_threads;   /* [K|S] Threads in this process. */
 
        LIST_ENTRY(process) ps_pglist;  /* List of processes in pgrp. */
        struct  process *ps_pptr;       /* Pointer to parent process. */