tsleep_interlock - Fix bug with TDF_TSLEEPQ
authorMatthew Dillon <dillon@apollo.backplane.com>
Thu, 16 Jul 2009 05:25:40 +0000 (22:25 -0700)
committerMatthew Dillon <dillon@apollo.backplane.com>
Thu, 16 Jul 2009 05:25:40 +0000 (22:25 -0700)
* LWKT previously disallowed the scheduling of a thread flagged
  TDF_TSLEEPQ because the tsleep queue was the same as the threadq.
  Now that they are different, it is possible for the thread to
  still be on a tsleepq when descheduled and later rescheduled.
  Remove the check, allowing the thread to be rescheduled by LWKT.

  This fixes issues with processes just locking up in "D"isk wait.

sys/kern/lwkt_thread.c

index 8878c67..3b497d8 100644 (file)
@@ -182,7 +182,7 @@ static __inline
 void
 _lwkt_enqueue(thread_t td)
 {
-    if ((td->td_flags & (TDF_RUNQ|TDF_MIGRATING|TDF_TSLEEPQ|TDF_BLOCKQ)) == 0) {
+    if ((td->td_flags & (TDF_RUNQ|TDF_MIGRATING|TDF_BLOCKQ)) == 0) {
        int nq = td->td_pri & TDPRI_MASK;
        struct globaldata *gd = td->td_gd;