Author: attilio
Date: Sun Apr 11 16:06:09 2010
New Revision: 206482
URL: http://svn.freebsd.org/changeset/base/206482

Log:
  - Introduce a blessed list for sxlocks that prevents the deadlkres to
    panic on those ones. [0]
  - Fix ticks counter wrap-up
  
  Sponsored by:         Sandvine Incorporated
  [0] Reported by:      jilles
  [0] Tested by:                jilles
  MFC:                  1 week

Modified:
  head/sys/kern/kern_clock.c

Modified: head/sys/kern/kern_clock.c
==============================================================================
--- head/sys/kern/kern_clock.c  Sun Apr 11 16:04:08 2010        (r206481)
+++ head/sys/kern/kern_clock.c  Sun Apr 11 16:06:09 2010        (r206482)
@@ -162,6 +162,11 @@ 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[] = {
+       "so_snd_sx",
+       "so_rcv_sx",
+       NULL
+};
 static int slptime_threshold = 1800;
 static int blktime_threshold = 900;
 static int sleepfreq = 3;
@@ -172,7 +177,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 +210,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 +231,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 +255,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",
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to