svn commit: r233825 - stable/8/sys/dev/hwpmc
Fabien Thomas
fabient at FreeBSD.org
Tue Apr 3 07:48:59 UTC 2012
Author: fabient
Date: Tue Apr 3 07:48:58 2012
New Revision: 233825
URL: http://svn.freebsd.org/changeset/base/233825
Log:
MFC r233544:
Fix random deadlock on pmcstat exit:
- Exit the thread when soft shutdown is requested
- Wakeup owner thread.
Reproduced/tested by looping pmcstat measurement:
pmcstat -S instructions -O/tmp/test ls
Modified:
stable/8/sys/dev/hwpmc/hwpmc_logging.c
Directory Properties:
stable/8/sys/ (props changed)
Modified: stable/8/sys/dev/hwpmc/hwpmc_logging.c
==============================================================================
--- stable/8/sys/dev/hwpmc/hwpmc_logging.c Tue Apr 3 07:15:42 2012 (r233824)
+++ stable/8/sys/dev/hwpmc/hwpmc_logging.c Tue Apr 3 07:48:58 2012 (r233825)
@@ -284,6 +284,7 @@ pmclog_loop(void *arg)
if ((lb = TAILQ_FIRST(&po->po_logbuffers)) == NULL) {
mtx_unlock_spin(&po->po_mtx);
+ /* No more buffers and shutdown required. */
if (po->po_flags & PMC_PO_SHUTDOWN) {
mtx_unlock(&pmc_kthread_mtx);
/*
@@ -292,6 +293,7 @@ pmclog_loop(void *arg)
*/
fo_close(po->po_file, curthread);
mtx_lock(&pmc_kthread_mtx);
+ break;
}
(void) msleep(po, &pmc_kthread_mtx, PWAIT,
@@ -354,6 +356,7 @@ pmclog_loop(void *arg)
lb = NULL;
}
+ wakeup_one(po->po_kthread);
po->po_kthread = NULL;
mtx_unlock(&pmc_kthread_mtx);
@@ -652,8 +655,7 @@ pmclog_deconfigure_log(struct pmc_owner
("[pmclog,%d] po=%p no log file", __LINE__, po));
/* stop the kthread, this will reset the 'OWNS_LOGFILE' flag */
- if (po->po_kthread)
- pmclog_stop_kthread(po);
+ pmclog_stop_kthread(po);
KASSERT(po->po_kthread == NULL,
("[pmclog,%d] po=%p kthread not stopped", __LINE__, po));
More information about the svn-src-stable-8
mailing list