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