svn commit: r207138 - stable/8/sys/kern
Attilio Rao
attilio at FreeBSD.org
Sat Apr 24 00:53:42 UTC 2010
Author: attilio
Date: Sat Apr 24 00:53:41 2010
New Revision: 207138
URL: http://svn.freebsd.org/changeset/base/207138
Log:
MFC r206482, r206879:
- Introduce a blessed list for sxlocks that prevents the deadlkres to
panic on those ones. Populate this list with getblk and so_snd_sx and
so_rcv_sx.
- Fix ticks counter wrap-up
Sponsored by: Sandvine Incorporated
Modified:
stable/8/sys/kern/kern_clock.c
Directory Properties:
stable/8/sys/ (props changed)
stable/8/sys/amd64/include/xen/ (props changed)
stable/8/sys/cddl/contrib/opensolaris/ (props changed)
stable/8/sys/contrib/dev/acpica/ (props changed)
stable/8/sys/contrib/pf/ (props changed)
stable/8/sys/dev/xen/xenpci/ (props changed)
stable/8/sys/geom/sched/ (props changed)
Modified: stable/8/sys/kern/kern_clock.c
==============================================================================
--- stable/8/sys/kern/kern_clock.c Sat Apr 24 00:49:19 2010 (r207137)
+++ stable/8/sys/kern/kern_clock.c Sat Apr 24 00:53:41 2010 (r207138)
@@ -162,6 +162,12 @@ SYSCTL_PROC(_kern, OID_AUTO, cp_times, C
0,0, sysctl_kern_cp_times, "LU", "per-CPU time statistics");
#ifdef DEADLKRES
+static const char *blessed[] = {
+ "getblk",
+ "so_snd_sx",
+ "so_rcv_sx",
+ NULL
+};
static int slptime_threshold = 1800;
static int blktime_threshold = 900;
static int sleepfreq = 3;
@@ -172,7 +178,7 @@ deadlkres(void)
struct proc *p;
struct thread *td;
void *wchan;
- int blkticks, slpticks, slptype, tryl, tticks;
+ int blkticks, i, slpticks, slptype, tryl, tticks;
tryl = 0;
for (;;) {
@@ -205,6 +211,10 @@ deadlkres(void)
* turnstile channel is in good state.
*/
MPASS(td->td_blocked != NULL);
+
+ /* Handle ticks wrap-up. */
+ if (ticks < td->td_blktick)
+ continue;
tticks = ticks - td->td_blktick;
thread_unlock(td);
if (tticks > blkticks) {
@@ -222,6 +232,10 @@ deadlkres(void)
}
} else if (TD_IS_SLEEPING(td)) {
+ /* Handle ticks wrap-up. */
+ if (ticks < td->td_blktick)
+ continue;
+
/*
* Check if the thread is sleeping on a
* lock, otherwise skip the check.
@@ -242,7 +256,24 @@ deadlkres(void)
* thresholds, this thread is
* stuck for too long on a
* sleepqueue.
+ * However, being on a
+ * sleepqueue, we might still
+ * check for the blessed
+ * list.
*/
+ tryl = 0;
+ for (i = 0; blessed[i] != NULL;
+ i++) {
+ if (!strcmp(blessed[i],
+ td->td_wmesg)) {
+ tryl = 1;
+ break;
+ }
+ }
+ if (tryl != 0) {
+ tryl = 0;
+ continue;
+ }
PROC_UNLOCK(p);
sx_sunlock(&allproc_lock);
panic("%s: possible deadlock detected for %p, blocked for %d ticks\n",
More information about the svn-src-all
mailing list