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",
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to