Author: attilio
Date: Wed Jul  7 12:00:11 2010
New Revision: 209761
URL: http://svn.freebsd.org/changeset/base/209761

Log:
  - Simplify logic in handling ticks wrap-up
  - Fix a bug where thread may be in sleeping state but the wchan won't
    be set, leading to an empty container for sleepq_type(). [0]
  
  Sponsored by:         Sandvine Incorporated
  [0] Submitted by:     Bryan Venteicher
                        <bryanv at daemoninthecloset dot org>
  MFC after:            3 days
  X-MFC:                        209577

Modified:
  head/sys/kern/kern_clock.c

Modified: head/sys/kern/kern_clock.c
==============================================================================
--- head/sys/kern/kern_clock.c  Wed Jul  7 11:19:06 2010        (r209760)
+++ head/sys/kern/kern_clock.c  Wed Jul  7 12:00:11 2010        (r209761)
@@ -202,8 +202,14 @@ deadlkres(void)
                FOREACH_PROC_IN_SYSTEM(p) {
                        PROC_LOCK(p);
                        FOREACH_THREAD_IN_PROC(p, td) {
+
+                               /*
+                                * Once a thread is found in "interesting"
+                                * state a possible ticks wrap-up needs to be
+                                * checked.
+                                */
                                thread_lock(td);
-                               if (TD_ON_LOCK(td)) {
+                               if (TD_ON_LOCK(td) && ticks < td->td_blktick) {
 
                                        /*
                                         * The thread should be blocked on a
@@ -212,11 +218,6 @@ deadlkres(void)
                                         */
                                        MPASS(td->td_blocked != NULL);
 
-                                       /* Handle ticks wrap-up. */
-                                       if (ticks < td->td_blktick) {
-                                               thread_unlock(td);
-                                               continue;
-                                       }
                                        tticks = ticks - td->td_blktick;
                                        thread_unlock(td);
                                        if (tticks > blkticks) {
@@ -232,13 +233,9 @@ deadlkres(void)
        panic("%s: possible deadlock detected for %p, blocked for %d ticks\n",
                                                    __func__, td, tticks);
                                        }
-                               } else if (TD_IS_SLEEPING(td)) {
-
-                                       /* Handle ticks wrap-up. */
-                                       if (ticks < td->td_blktick) {
-                                               thread_unlock(td);
-                                               continue;
-                                       }
+                               } else if (TD_IS_SLEEPING(td) &&
+                                   TD_ON_SLEEPQ(td) &&
+                                   ticks < td->td_blktick) {
 
                                        /*
                                         * Check if the thread is sleeping on a
_______________________________________________
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