kernel - Add lwkt_yield_quick()
authorMatthew Dillon <dillon@apollo.backplane.com>
Thu, 20 Sep 2012 04:33:54 +0000 (21:33 -0700)
committerMatthew Dillon <dillon@apollo.backplane.com>
Thu, 20 Sep 2012 04:33:54 +0000 (21:33 -0700)
* Add a quick version of lwkt_yield() which does not try to round-robin
  LWKT threads at the same priority.

sys/kern/lwkt_thread.c
sys/sys/thread.h

index bc6f22c..7414c2c 100644 (file)
@@ -1200,6 +1200,28 @@ lwkt_yield(void)
 }
 
 /*
+ * The quick version processes pending interrupts and higher-priority
+ * LWKT threads but will not round-robin same-priority LWKT threads.
+ */
+void
+lwkt_yield_quick(void)
+{
+    globaldata_t gd = mycpu;
+    thread_t td = gd->gd_curthread;
+
+    if ((gd->gd_reqflags & RQF_IDLECHECK_MASK) && td->td_nest_count < 2)
+       splz();
+    if (lwkt_resched_wanted()) {
+       if (TAILQ_FIRST(&gd->gd_tdrunq) == td) {
+           clear_lwkt_resched();
+       } else {
+           lwkt_schedule_self(curthread);
+           lwkt_switch();
+       }
+    }
+}
+
+/*
  * This yield is designed for kernel threads with a user context.
  *
  * The kernel acting on behalf of the user is potentially cpu-bound,
index 66c126e..4e244a5 100644 (file)
@@ -444,6 +444,7 @@ extern void lwkt_schedule_self(thread_t);
 extern void lwkt_deschedule(thread_t);
 extern void lwkt_deschedule_self(thread_t);
 extern void lwkt_yield(void);
+extern void lwkt_yield_quick(void);
 extern void lwkt_user_yield(void);
 extern void lwkt_token_wait(void);
 extern void lwkt_hold(thread_t);