summaryrefslogtreecommitdiffstats
path: root/sys/rpc
diff options
context:
space:
mode:
authorkib <kib@FreeBSD.org>2014-12-13 16:18:29 +0000
committerkib <kib@FreeBSD.org>2014-12-13 16:18:29 +0000
commitd41bf48327e4a369279b68c229110e873880419a (patch)
tree21a6b4ad228b2aef4fe0eedb1771d3e649435e34 /sys/rpc
parent07899121cbcd3408ca43bb2f40102fa7e41decae (diff)
downloadFreeBSD-src-d41bf48327e4a369279b68c229110e873880419a.zip
FreeBSD-src-d41bf48327e4a369279b68c229110e873880419a.tar.gz
Add facility to stop all userspace processes. The supposed use of the
feature is to quisce the system before suspend. Stop is implemented by reusing the thread_single(9) with the special mode SINGLE_ALLPROC. SINGLE_ALLPROC differs from the existing single-threading modes by allowing (requiring) caller to operate on other process. Interruptible sleeps for !TDF_SBDRY threads are suspended like SIGSTOP does it, instead of aborting the sleep, like SINGLE_NO_EXIT, to avoid spurious EINTRs on resume. Provide debugging sysctl debug.stop_all_proc, which causes total stop and suspends syncer, while waiting for variable reset for resume. It is used for debugging; should be removed after the real use of the interface is added. In collaboration with: pho Discussed with: avg Sponsored by: The FreeBSD Foundation MFC after: 2 weeks
Diffstat (limited to 'sys/rpc')
-rw-r--r--sys/rpc/svc.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/sys/rpc/svc.c b/sys/rpc/svc.c
index 75d9d6e..d2bd378 100644
--- a/sys/rpc/svc.c
+++ b/sys/rpc/svc.c
@@ -1190,7 +1190,8 @@ svc_run_internal(SVCGROUP *grp, bool_t ismaster)
mtx_unlock(&grp->sg_lock);
p = curproc;
PROC_LOCK(p);
- if (P_SHOULDSTOP(p)) {
+ if (P_SHOULDSTOP(p) ||
+ (p->p_flag & P_TOTAL_STOP) != 0) {
thread_suspend_check(0);
PROC_UNLOCK(p);
mtx_lock(&grp->sg_lock);
OpenPOWER on IntegriCloud