diff options
author | kib <kib@FreeBSD.org> | 2014-12-13 16:18:29 +0000 |
---|---|---|
committer | kib <kib@FreeBSD.org> | 2014-12-13 16:18:29 +0000 |
commit | d41bf48327e4a369279b68c229110e873880419a (patch) | |
tree | 21a6b4ad228b2aef4fe0eedb1771d3e649435e34 /sys/rpc | |
parent | 07899121cbcd3408ca43bb2f40102fa7e41decae (diff) | |
download | FreeBSD-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.c | 3 |
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); |