diff options
author | luoqi <luoqi@FreeBSD.org> | 2000-01-07 08:36:44 +0000 |
---|---|---|
committer | luoqi <luoqi@FreeBSD.org> | 2000-01-07 08:36:44 +0000 |
commit | e100d44d5538cc21abeba58f459ce9eb497651a9 (patch) | |
tree | ca8740d97497e39a1d8bb5f7f15e17f85fa4c506 /sys/kern/kern_kthread.c | |
parent | e69b1ea5c9a5104ae1afe7dd26c89222983ed04e (diff) | |
download | FreeBSD-src-e100d44d5538cc21abeba58f459ce9eb497651a9.zip FreeBSD-src-e100d44d5538cc21abeba58f459ce9eb497651a9.tar.gz |
Introduce a mechanism to suspend/resume system processes. Suspend syncer
and bufdaemon prior to disk sync during system shutdown.
Diffstat (limited to 'sys/kern/kern_kthread.c')
-rw-r--r-- | sys/kern/kern_kthread.c | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/sys/kern/kern_kthread.c b/sys/kern/kern_kthread.c index b375fbb..5efe90c 100644 --- a/sys/kern/kern_kthread.c +++ b/sys/kern/kern_kthread.c @@ -30,6 +30,7 @@ #include <sys/systm.h> #include <sys/proc.h> #include <sys/kthread.h> +#include <sys/signalvar.h> #include <sys/unistd.h> #include <sys/wait.h> @@ -97,3 +98,42 @@ kthread_exit(int ecode) exit1(curproc, W_EXITCODE(ecode, 0)); } +/* + * Advise a kernel process to suspend (or resume) in its main loop. + * Participation is voluntary. + */ +int +suspend_kproc(struct proc *p, int timo) +{ + /* + * Make sure this is indeed a system process and we can safely + * use the p_siglist field. + */ + if ((p->p_flag & P_SYSTEM) == 0) + return (EINVAL); + SIGADDSET(p->p_siglist, SIGSTOP); + return tsleep((caddr_t)&p->p_siglist, PPAUSE, "suspkp", timo); +} + +int +resume_kproc(struct proc *p) +{ + /* + * Make sure this is indeed a system process and we can safely + * use the p_siglist field. + */ + if ((p->p_flag & P_SYSTEM) == 0) + return (EINVAL); + SIGDELSET(p->p_siglist, SIGSTOP); + wakeup((caddr_t)&p->p_siglist); + return (0); +} + +void +kproc_suspend_loop(struct proc *p) +{ + while (SIGISMEMBER(p->p_siglist, SIGSTOP)) { + wakeup((caddr_t)&p->p_siglist); + tsleep((caddr_t)&p->p_siglist, PPAUSE, "kpsusp", 0); + } +} |