summaryrefslogtreecommitdiffstats
path: root/sys/miscfs/procfs/procfs_ctl.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/miscfs/procfs/procfs_ctl.c')
-rw-r--r--sys/miscfs/procfs/procfs_ctl.c19
1 files changed, 18 insertions, 1 deletions
diff --git a/sys/miscfs/procfs/procfs_ctl.c b/sys/miscfs/procfs/procfs_ctl.c
index d96bcb3..72ad575 100644
--- a/sys/miscfs/procfs/procfs_ctl.c
+++ b/sys/miscfs/procfs/procfs_ctl.c
@@ -158,8 +158,12 @@ procfs_control(curp, p, op)
break;
default:
- if (!TRACE_WAIT_P(curp, p))
+ mtx_enter(&sched_lock, MTX_SPIN);
+ if (!TRACE_WAIT_P(curp, p)) {
+ mtx_exit(&sched_lock, MTX_SPIN);
return (EBUSY);
+ }
+ mtx_exit(&sched_lock, MTX_SPIN);
}
@@ -234,20 +238,28 @@ procfs_control(curp, p, op)
case PROCFS_CTL_WAIT:
error = 0;
if (p->p_flag & P_TRACED) {
+ mtx_enter(&sched_lock, MTX_SPIN);
while (error == 0 &&
(p->p_stat != SSTOP) &&
(p->p_flag & P_TRACED) &&
(p->p_pptr == curp)) {
+ mtx_exit(&sched_lock, MTX_SPIN);
error = tsleep((caddr_t) p,
PWAIT|PCATCH, "procfsx", 0);
+ mtx_enter(&sched_lock, MTX_SPIN);
}
if (error == 0 && !TRACE_WAIT_P(curp, p))
error = EBUSY;
+ mtx_exit(&sched_lock, MTX_SPIN);
} else {
+ mtx_enter(&sched_lock, MTX_SPIN);
while (error == 0 && p->p_stat != SSTOP) {
+ mtx_exit(&sched_lock, MTX_SPIN);
error = tsleep((caddr_t) p,
PWAIT|PCATCH, "procfs", 0);
+ mtx_enter(&sched_lock, MTX_SPIN);
}
+ mtx_exit(&sched_lock, MTX_SPIN);
}
return (error);
@@ -255,8 +267,10 @@ procfs_control(curp, p, op)
panic("procfs_control");
}
+ mtx_enter(&sched_lock, MTX_SPIN);
if (p->p_stat == SSTOP)
setrunnable(p);
+ mtx_exit(&sched_lock, MTX_SPIN);
return (0);
}
@@ -297,13 +311,16 @@ procfs_doctl(curp, p, pfs, uio)
} else {
nm = vfs_findname(signames, msg, xlen);
if (nm) {
+ mtx_enter(&sched_lock, MTX_SPIN);
if (TRACE_WAIT_P(curp, p)) {
p->p_xstat = nm->nm_val;
#ifdef FIX_SSTEP
FIX_SSTEP(p);
#endif
setrunnable(p);
+ mtx_exit(&sched_lock, MTX_SPIN);
} else {
+ mtx_exit(&sched_lock, MTX_SPIN);
psignal(p, nm->nm_val);
}
error = 0;
OpenPOWER on IntegriCloud