svn commit: r332871 - head/sys/kern
Tijl Coosemans
tijl at FreeBSD.org
Sun Apr 22 16:05:30 UTC 2018
Author: tijl
Date: Sun Apr 22 16:05:29 2018
New Revision: 332871
URL: https://svnweb.freebsd.org/changeset/base/332871
Log:
Make bufdaemon and bufspacedaemon use kthread_suspend_check instead of
kproc_suspend_check. In r329612 bufspacedaemon was turned into a thread
of the bufdaemon process causing both to call kproc_suspend_check with the
same proc argument and that function contains the following while loop:
while (SIGISMEMBER(p->p_siglist, SIGSTOP)) {
wakeup(&p->p_siglist);
msleep(&p->p_siglist, &p->p_mtx, PPAUSE, "kpsusp", 0);
}
So one thread wakes up the other and the other wakes up the first again,
locking up UP machines on shutdown.
Also register the shutdown handlers with SHUTDOWN_PRI_LAST + 100 so they
run after the syncer has shutdown, because the syncer can cause a
situation where bufdaemon help is needed to proceed.
PR: 227404
Reviewed by: kib
Tested by: cy, rmacklem
Modified:
head/sys/kern/vfs_bio.c
Modified: head/sys/kern/vfs_bio.c
==============================================================================
--- head/sys/kern/vfs_bio.c Sun Apr 22 09:30:07 2018 (r332870)
+++ head/sys/kern/vfs_bio.c Sun Apr 22 16:05:29 2018 (r332871)
@@ -791,9 +791,12 @@ bufspace_daemon(void *arg)
{
struct bufdomain *bd;
+ EVENTHANDLER_REGISTER(shutdown_pre_sync, kthread_shutdown, curthread,
+ SHUTDOWN_PRI_LAST + 100);
+
bd = arg;
for (;;) {
- kproc_suspend_check(curproc);
+ kthread_suspend_check();
/*
* Free buffers from the clean queue until we meet our
@@ -3357,8 +3360,8 @@ buf_daemon()
/*
* This process needs to be suspended prior to shutdown sync.
*/
- EVENTHANDLER_REGISTER(shutdown_pre_sync, kproc_shutdown, bufdaemonproc,
- SHUTDOWN_PRI_LAST);
+ EVENTHANDLER_REGISTER(shutdown_pre_sync, kthread_shutdown, curthread,
+ SHUTDOWN_PRI_LAST + 100);
/*
* Start the buf clean daemons as children threads.
@@ -3381,7 +3384,7 @@ buf_daemon()
bd_request = 0;
mtx_unlock(&bdlock);
- kproc_suspend_check(bufdaemonproc);
+ kthread_suspend_check();
/*
* Save speedupreq for this pass and reset to capture new
More information about the svn-src-head
mailing list