Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/netbsd-9]: src/sys/kern Pull up following revision(s) (requested by kami...
details: https://anonhg.NetBSD.org/src/rev/69db279c670c
branches: netbsd-9
changeset: 455386:69db279c670c
user: martin <martin%NetBSD.org@localhost>
date: Tue Oct 15 19:25:11 2019 +0000
description:
Pull up following revision(s) (requested by kamil in ticket #327):
sys/kern/kern_sig.c: revision 1.370
Add sigswitch_unlock_and_switch_away(), extracted from sigswitch()
Use sigswitch_unlock_and_switch_away() whenever there is no need for
sigswitch().
diffstat:
sys/kern/kern_sig.c | 44 +++++++++++++++++++++++++++++++-------------
1 files changed, 31 insertions(+), 13 deletions(-)
diffs (113 lines):
diff -r 651dbd8d18db -r 69db279c670c sys/kern/kern_sig.c
--- a/sys/kern/kern_sig.c Tue Oct 15 19:23:09 2019 +0000
+++ b/sys/kern/kern_sig.c Tue Oct 15 19:25:11 2019 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: kern_sig.c,v 1.364.2.4 2019/10/15 19:23:09 martin Exp $ */
+/* $NetBSD: kern_sig.c,v 1.364.2.5 2019/10/15 19:25:11 martin Exp $ */
/*-
* Copyright (c) 2006, 2007, 2008 The NetBSD Foundation, Inc.
@@ -70,7 +70,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_sig.c,v 1.364.2.4 2019/10/15 19:23:09 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_sig.c,v 1.364.2.5 2019/10/15 19:25:11 martin Exp $");
#include "opt_ptrace.h"
#include "opt_dtrace.h"
@@ -126,6 +126,7 @@
static int sigput(sigpend_t *, struct proc *, ksiginfo_t *);
static int sigunwait(struct proc *, const ksiginfo_t *);
static void sigswitch(int, int, bool);
+static void sigswitch_unlock_and_switch_away(struct lwp *);
static void sigacts_poolpage_free(struct pool *, void *);
static void *sigacts_poolpage_alloc(struct pool *, int);
@@ -932,10 +933,11 @@
* The process is already stopping.
*/
if ((p->p_sflag & PS_STOPPING) != 0) {
- sigswitch(0, p->p_xsig, true);
+ mutex_exit(proc_lock);
+ sigswitch_unlock_and_switch_away(l);
mutex_enter(proc_lock);
mutex_enter(p->p_lock);
- goto repeat; /* XXX */
+ goto repeat;
}
mask = &l->l_sigmask;
@@ -1640,10 +1642,11 @@
* The process is already stopping.
*/
if ((p->p_sflag & PS_STOPPING) != 0) {
- sigswitch(0, p->p_xsig, true);
+ mutex_exit(proc_lock);
+ sigswitch_unlock_and_switch_away(l);
mutex_enter(proc_lock);
mutex_enter(p->p_lock);
- goto repeat; /* XXX */
+ goto repeat;
}
KSI_INIT_TRAP(&ksi);
@@ -1690,7 +1693,6 @@
{
struct lwp *l = curlwp;
struct proc *p = l->l_proc;
- int biglocks;
KASSERT(mutex_owned(p->p_lock));
KASSERT(l->l_stat == LSONPROC);
@@ -1750,10 +1752,26 @@
mutex_exit(proc_lock);
}
- /*
- * Unlock and switch away.
- */
+ sigswitch_unlock_and_switch_away(l);
+}
+
+/*
+ * Unlock and switch away.
+ */
+static void
+sigswitch_unlock_and_switch_away(struct lwp *l)
+{
+ struct proc *p;
+ int biglocks;
+
+ p = l->l_proc;
+
+ KASSERT(mutex_owned(p->p_lock));
KASSERT(!mutex_owned(proc_lock));
+
+ KASSERT(l->l_stat == LSONPROC);
+ KASSERT(p->p_nrlwps > 0);
+
KERNEL_UNLOCK_ALL(l, &biglocks);
if (p->p_stat == SSTOP || (p->p_sflag & PS_STOPPING) != 0) {
p->p_nrlwps--;
@@ -1843,7 +1861,7 @@
* we awaken, check for a signal from the debugger.
*/
if (p->p_stat == SSTOP || (p->p_sflag & PS_STOPPING) != 0) {
- sigswitch(PS_NOCLDSTOP, 0, false);
+ sigswitch_unlock_and_switch_away(l);
mutex_enter(p->p_lock);
signo = sigchecktrace();
} else if (p->p_stat == SACTIVE)
@@ -2525,9 +2543,9 @@
* The process is already stopping.
*/
if ((p->p_sflag & PS_STOPPING) != 0) {
- sigswitch(0, p->p_xsig, false);
+ sigswitch_unlock_and_switch_away(l);
mutex_enter(p->p_lock);
- goto repeat; /* XXX */
+ goto repeat;
}
/* Needed for ktrace */
Home |
Main Index |
Thread Index |
Old Index