summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_kthread.c
diff options
context:
space:
mode:
authorluoqi <luoqi@FreeBSD.org>2000-01-07 08:36:44 +0000
committerluoqi <luoqi@FreeBSD.org>2000-01-07 08:36:44 +0000
commite100d44d5538cc21abeba58f459ce9eb497651a9 (patch)
treeca8740d97497e39a1d8bb5f7f15e17f85fa4c506 /sys/kern/kern_kthread.c
parente69b1ea5c9a5104ae1afe7dd26c89222983ed04e (diff)
downloadFreeBSD-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.c40
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);
+ }
+}
OpenPOWER on IntegriCloud