Implement a much faster spinlock.
[dragonfly.git] / sys / kern / lwkt_thread.c
1 /*
2  * Copyright (c) 2003,2004 The DragonFly Project.  All rights reserved.
3  * 
4  * This code is derived from software contributed to The DragonFly Project
5  * by Matthew Dillon <dillon@backplane.com>
6  * 
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in
15  *    the documentation and/or other materials provided with the
16  *    distribution.
17  * 3. Neither the name of The DragonFly Project nor the names of its
18  *    contributors may be used to endorse or promote products derived
19  *    from this software without specific, prior written permission.
20  * 
21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
24  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE
25  * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
26  * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING,
27  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
29  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
30  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
31  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32  * SUCH DAMAGE.
33  * 
34  * $DragonFly: src/sys/kern/lwkt_thread.c,v 1.96 2006/05/21 20:23:25 dillon Exp $
35  */
36
37 /*
38  * Each cpu in a system has its own self-contained light weight kernel
39  * thread scheduler, which means that generally speaking we only need
40  * to use a critical section to avoid problems.  Foreign thread 
41  * scheduling is queued via (async) IPIs.
42  */
43
44 #ifdef _KERNEL
45
46 #include <sys/param.h>
47 #include <sys/systm.h>
48 #include <sys/kernel.h>
49 #include <sys/proc.h>
50 #include <sys/rtprio.h>
51 #include <sys/queue.h>
52 #include <sys/sysctl.h>
53 #include <sys/kthread.h>
54 #include <machine/cpu.h>
55 #include <sys/lock.h>
56 #include <sys/caps.h>
57 #include <sys/spinlock.h>
58
59 #include <sys/thread2.h>
60 #include <sys/spinlock2.h>
61
62 #include <vm/vm.h>
63 #include <vm/vm_param.h>
64 #include <vm/vm_kern.h>
65 #include <vm/vm_object.h>
66 #include <vm/vm_page.h>
67 #include <vm/vm_map.h>
68 #include <vm/vm_pager.h>
69 #include <vm/vm_extern.h>
70 #include <vm/vm_zone.h>
71
72 #include <machine/stdarg.h>
73 #include <machine/ipl.h>
74 #include <machine/smp.h>
75
76 #else
77
78 #include <sys/stdint.h>
79 #include <libcaps/thread.h>
80 #include <sys/thread.h>
81 #include <sys/msgport.h>
82 #include <sys/errno.h>
83 #include <libcaps/globaldata.h>
84 #include <machine/cpufunc.h>
85 #include <sys/thread2.h>
86 #include <sys/msgport2.h>
87 #include <stdio.h>
88 #include <stdlib.h>
89 #include <string.h>
90 #include <machine/lock.h>
91 #include <machine/atomic.h>
92 #include <machine/cpu.h>
93
94 #endif
95
96 static int untimely_switch = 0;
97 #ifdef  INVARIANTS
98 static int panic_on_cscount = 0;
99 #endif
100 static __int64_t switch_count = 0;
101 static __int64_t preempt_hit = 0;
102 static __int64_t preempt_miss = 0;
103 static __int64_t preempt_weird = 0;
104 static __int64_t token_contention_count = 0;
105 static __int64_t mplock_contention_count = 0;
106
107 #ifdef _KERNEL
108
109 SYSCTL_INT(_lwkt, OID_AUTO, untimely_switch, CTLFLAG_RW, &untimely_switch, 0, "");
110 #ifdef  INVARIANTS
111 SYSCTL_INT(_lwkt, OID_AUTO, panic_on_cscount, CTLFLAG_RW, &panic_on_cscount, 0, "");
112 #endif
113 SYSCTL_QUAD(_lwkt, OID_AUTO, switch_count, CTLFLAG_RW, &switch_count, 0, "");
114 SYSCTL_QUAD(_lwkt, OID_AUTO, preempt_hit, CTLFLAG_RW, &preempt_hit, 0, "");
115 SYSCTL_QUAD(_lwkt, OID_AUTO, preempt_miss, CTLFLAG_RW, &preempt_miss, 0, "");
116 SYSCTL_QUAD(_lwkt, OID_AUTO, preempt_weird, CTLFLAG_RW, &preempt_weird, 0, "");
117 #ifdef  INVARIANTS
118 SYSCTL_QUAD(_lwkt, OID_AUTO, token_contention_count, CTLFLAG_RW,
119         &token_contention_count, 0, "spinning due to token contention");
120 SYSCTL_QUAD(_lwkt, OID_AUTO, mplock_contention_count, CTLFLAG_RW,
121         &mplock_contention_count, 0, "spinning due to MPLOCK contention");
122 #endif
123 #endif
124
125 /*
126  * These helper procedures handle the runq, they can only be called from
127  * within a critical section.
128  *
129  * WARNING!  Prior to SMP being brought up it is possible to enqueue and
130  * dequeue threads belonging to other cpus, so be sure to use td->td_gd
131  * instead of 'mycpu' when referencing the globaldata structure.   Once
132  * SMP live enqueuing and dequeueing only occurs on the current cpu.
133  */
134 static __inline
135 void
136 _lwkt_dequeue(thread_t td)
137 {
138     if (td->td_flags & TDF_RUNQ) {
139         int nq = td->td_pri & TDPRI_MASK;
140         struct globaldata *gd = td->td_gd;
141
142         td->td_flags &= ~TDF_RUNQ;
143         TAILQ_REMOVE(&gd->gd_tdrunq[nq], td, td_threadq);
144         /* runqmask is passively cleaned up by the switcher */
145     }
146 }
147
148 static __inline
149 void
150 _lwkt_enqueue(thread_t td)
151 {
152     if ((td->td_flags & (TDF_RUNQ|TDF_MIGRATING|TDF_TSLEEPQ|TDF_BLOCKQ)) == 0) {
153         int nq = td->td_pri & TDPRI_MASK;
154         struct globaldata *gd = td->td_gd;
155
156         td->td_flags |= TDF_RUNQ;
157         TAILQ_INSERT_TAIL(&gd->gd_tdrunq[nq], td, td_threadq);
158         gd->gd_runqmask |= 1 << nq;
159     }
160 }
161
162 /*
163  * Schedule a thread to run.  As the current thread we can always safely
164  * schedule ourselves, and a shortcut procedure is provided for that
165  * function.
166  *
167  * (non-blocking, self contained on a per cpu basis)
168  */
169 void
170 lwkt_schedule_self(thread_t td)
171 {
172     crit_enter_quick(td);
173     KASSERT(td->td_wait == NULL, ("lwkt_schedule_self(): td_wait not NULL!"));
174     KASSERT(td != &td->td_gd->gd_idlethread, ("lwkt_schedule_self(): scheduling gd_idlethread is illegal!"));
175     KKASSERT(td->td_proc == NULL || (td->td_proc->p_flag & P_ONRUNQ) == 0);
176     _lwkt_enqueue(td);
177     crit_exit_quick(td);
178 }
179
180 /*
181  * Deschedule a thread.
182  *
183  * (non-blocking, self contained on a per cpu basis)
184  */
185 void
186 lwkt_deschedule_self(thread_t td)
187 {
188     crit_enter_quick(td);
189     KASSERT(td->td_wait == NULL, ("lwkt_schedule_self(): td_wait not NULL!"));
190     _lwkt_dequeue(td);
191     crit_exit_quick(td);
192 }
193
194 #ifdef _KERNEL
195
196 /*
197  * LWKTs operate on a per-cpu basis
198  *
199  * WARNING!  Called from early boot, 'mycpu' may not work yet.
200  */
201 void
202 lwkt_gdinit(struct globaldata *gd)
203 {
204     int i;
205
206     for (i = 0; i < sizeof(gd->gd_tdrunq)/sizeof(gd->gd_tdrunq[0]); ++i)
207         TAILQ_INIT(&gd->gd_tdrunq[i]);
208     gd->gd_runqmask = 0;
209     TAILQ_INIT(&gd->gd_tdallq);
210 }
211
212 #endif /* _KERNEL */
213
214 /*
215  * Initialize a thread wait structure prior to first use.
216  *
217  * NOTE!  called from low level boot code, we cannot do anything fancy!
218  */
219 void
220 lwkt_wait_init(lwkt_wait_t w)
221 {
222     spin_init(&w->wa_spinlock);
223     TAILQ_INIT(&w->wa_waitq);
224     w->wa_gen = 0;
225     w->wa_count = 0;
226 }
227
228 /*
229  * Create a new thread.  The thread must be associated with a process context
230  * or LWKT start address before it can be scheduled.  If the target cpu is
231  * -1 the thread will be created on the current cpu.
232  *
233  * If you intend to create a thread without a process context this function
234  * does everything except load the startup and switcher function.
235  */
236 thread_t
237 lwkt_alloc_thread(struct thread *td, int stksize, int cpu, int flags)
238 {
239     void *stack;
240     globaldata_t gd = mycpu;
241
242     if (td == NULL) {
243         crit_enter_gd(gd);
244         if (gd->gd_tdfreecount > 0) {
245             --gd->gd_tdfreecount;
246             td = TAILQ_FIRST(&gd->gd_tdfreeq);
247             KASSERT(td != NULL && (td->td_flags & TDF_RUNNING) == 0,
248                 ("lwkt_alloc_thread: unexpected NULL or corrupted td"));
249             TAILQ_REMOVE(&gd->gd_tdfreeq, td, td_threadq);
250             crit_exit_gd(gd);
251             flags |= td->td_flags & (TDF_ALLOCATED_STACK|TDF_ALLOCATED_THREAD);
252         } else {
253             crit_exit_gd(gd);
254 #ifdef _KERNEL
255             td = zalloc(thread_zone);
256 #else
257             td = malloc(sizeof(struct thread));
258 #endif
259             td->td_kstack = NULL;
260             td->td_kstack_size = 0;
261             flags |= TDF_ALLOCATED_THREAD;
262         }
263     }
264     if ((stack = td->td_kstack) != NULL && td->td_kstack_size != stksize) {
265         if (flags & TDF_ALLOCATED_STACK) {
266 #ifdef _KERNEL
267             kmem_free(kernel_map, (vm_offset_t)stack, td->td_kstack_size);
268 #else
269             libcaps_free_stack(stack, td->td_kstack_size);
270 #endif
271             stack = NULL;
272         }
273     }
274     if (stack == NULL) {
275 #ifdef _KERNEL
276         stack = (void *)kmem_alloc(kernel_map, stksize);
277 #else
278         stack = libcaps_alloc_stack(stksize);
279 #endif
280         flags |= TDF_ALLOCATED_STACK;
281     }
282     if (cpu < 0)
283         lwkt_init_thread(td, stack, stksize, flags, mycpu);
284     else
285         lwkt_init_thread(td, stack, stksize, flags, globaldata_find(cpu));
286     return(td);
287 }
288
289 #ifdef _KERNEL
290
291 /*
292  * Initialize a preexisting thread structure.  This function is used by
293  * lwkt_alloc_thread() and also used to initialize the per-cpu idlethread.
294  *
295  * All threads start out in a critical section at a priority of
296  * TDPRI_KERN_DAEMON.  Higher level code will modify the priority as
297  * appropriate.  This function may send an IPI message when the 
298  * requested cpu is not the current cpu and consequently gd_tdallq may
299  * not be initialized synchronously from the point of view of the originating
300  * cpu.
301  *
302  * NOTE! we have to be careful in regards to creating threads for other cpus
303  * if SMP has not yet been activated.
304  */
305 #ifdef SMP
306
307 static void
308 lwkt_init_thread_remote(void *arg)
309 {
310     thread_t td = arg;
311
312     TAILQ_INSERT_TAIL(&td->td_gd->gd_tdallq, td, td_allq);
313 }
314
315 #endif
316
317 void
318 lwkt_init_thread(thread_t td, void *stack, int stksize, int flags,
319                 struct globaldata *gd)
320 {
321     globaldata_t mygd = mycpu;
322
323     bzero(td, sizeof(struct thread));
324     td->td_kstack = stack;
325     td->td_kstack_size = stksize;
326     td->td_flags = flags;
327     td->td_gd = gd;
328     td->td_pri = TDPRI_KERN_DAEMON + TDPRI_CRIT;
329 #ifdef SMP
330     if ((flags & TDF_MPSAFE) == 0)
331         td->td_mpcount = 1;
332 #endif
333     lwkt_initport(&td->td_msgport, td);
334     pmap_init_thread(td);
335 #ifdef SMP
336     /*
337      * Normally initializing a thread for a remote cpu requires sending an
338      * IPI.  However, the idlethread is setup before the other cpus are
339      * activated so we have to treat it as a special case.  XXX manipulation
340      * of gd_tdallq requires the BGL.
341      */
342     if (gd == mygd || td == &gd->gd_idlethread) {
343         crit_enter_gd(mygd);
344         TAILQ_INSERT_TAIL(&gd->gd_tdallq, td, td_allq);
345         crit_exit_gd(mygd);
346     } else {
347         lwkt_send_ipiq(gd, lwkt_init_thread_remote, td);
348     }
349 #else
350     crit_enter_gd(mygd);
351     TAILQ_INSERT_TAIL(&gd->gd_tdallq, td, td_allq);
352     crit_exit_gd(mygd);
353 #endif
354 }
355
356 #endif /* _KERNEL */
357
358 void
359 lwkt_set_comm(thread_t td, const char *ctl, ...)
360 {
361     __va_list va;
362
363     __va_start(va, ctl);
364     vsnprintf(td->td_comm, sizeof(td->td_comm), ctl, va);
365     __va_end(va);
366 }
367
368 void
369 lwkt_hold(thread_t td)
370 {
371     ++td->td_refs;
372 }
373
374 void
375 lwkt_rele(thread_t td)
376 {
377     KKASSERT(td->td_refs > 0);
378     --td->td_refs;
379 }
380
381 #ifdef _KERNEL
382
383 void
384 lwkt_wait_free(thread_t td)
385 {
386     while (td->td_refs)
387         tsleep(td, 0, "tdreap", hz);
388 }
389
390 #endif
391
392 void
393 lwkt_free_thread(thread_t td)
394 {
395     struct globaldata *gd = mycpu;
396
397     KASSERT((td->td_flags & TDF_RUNNING) == 0,
398         ("lwkt_free_thread: did not exit! %p", td));
399
400     crit_enter_gd(gd);
401     TAILQ_REMOVE(&td->td_gd->gd_tdallq, td, td_allq); /* Protected by BGL */
402     if (gd->gd_tdfreecount < CACHE_NTHREADS &&
403         (td->td_flags & TDF_ALLOCATED_THREAD)
404     ) {
405         ++gd->gd_tdfreecount;
406         TAILQ_INSERT_HEAD(&gd->gd_tdfreeq, td, td_threadq);
407         crit_exit_gd(gd);
408     } else {
409         crit_exit_gd(gd);
410         if (td->td_kstack && (td->td_flags & TDF_ALLOCATED_STACK)) {
411 #ifdef _KERNEL
412             kmem_free(kernel_map, (vm_offset_t)td->td_kstack, td->td_kstack_size);
413 #else
414             libcaps_free_stack(td->td_kstack, td->td_kstack_size);
415 #endif
416             /* gd invalid */
417             td->td_kstack = NULL;
418             td->td_kstack_size = 0;
419         }
420         if (td->td_flags & TDF_ALLOCATED_THREAD) {
421 #ifdef _KERNEL
422             zfree(thread_zone, td);
423 #else
424             free(td);
425 #endif
426         }
427     }
428 }
429
430
431 /*
432  * Switch to the next runnable lwkt.  If no LWKTs are runnable then 
433  * switch to the idlethread.  Switching must occur within a critical
434  * section to avoid races with the scheduling queue.
435  *
436  * We always have full control over our cpu's run queue.  Other cpus
437  * that wish to manipulate our queue must use the cpu_*msg() calls to
438  * talk to our cpu, so a critical section is all that is needed and
439  * the result is very, very fast thread switching.
440  *
441  * The LWKT scheduler uses a fixed priority model and round-robins at
442  * each priority level.  User process scheduling is a totally
443  * different beast and LWKT priorities should not be confused with
444  * user process priorities.
445  *
446  * The MP lock may be out of sync with the thread's td_mpcount.  lwkt_switch()
447  * cleans it up.  Note that the td_switch() function cannot do anything that
448  * requires the MP lock since the MP lock will have already been setup for
449  * the target thread (not the current thread).  It's nice to have a scheduler
450  * that does not need the MP lock to work because it allows us to do some
451  * really cool high-performance MP lock optimizations.
452  *
453  * PREEMPTION NOTE: Preemption occurs via lwkt_preempt().  lwkt_switch()
454  * is not called by the current thread in the preemption case, only when
455  * the preempting thread blocks (in order to return to the original thread).
456  */
457 void
458 lwkt_switch(void)
459 {
460     globaldata_t gd = mycpu;
461     thread_t td = gd->gd_curthread;
462     thread_t ntd;
463 #ifdef SMP
464     int mpheld;
465 #endif
466
467     /*
468      * Switching from within a 'fast' (non thread switched) interrupt or IPI
469      * is illegal.  However, we may have to do it anyway if we hit a fatal
470      * kernel trap or we have paniced.
471      *
472      * If this case occurs save and restore the interrupt nesting level.
473      */
474     if (gd->gd_intr_nesting_level) {
475         int savegdnest;
476         int savegdtrap;
477
478         if (gd->gd_trap_nesting_level == 0 && panicstr == NULL) {
479             panic("lwkt_switch: cannot switch from within "
480                   "a fast interrupt, yet, td %p\n", td);
481         } else {
482             savegdnest = gd->gd_intr_nesting_level;
483             savegdtrap = gd->gd_trap_nesting_level;
484             gd->gd_intr_nesting_level = 0;
485             gd->gd_trap_nesting_level = 0;
486             if ((td->td_flags & TDF_PANICWARN) == 0) {
487                 td->td_flags |= TDF_PANICWARN;
488                 printf("Warning: thread switch from interrupt or IPI, "
489                         "thread %p (%s)\n", td, td->td_comm);
490 #ifdef DDB
491                 db_print_backtrace();
492 #endif
493             }
494             lwkt_switch();
495             gd->gd_intr_nesting_level = savegdnest;
496             gd->gd_trap_nesting_level = savegdtrap;
497             return;
498         }
499     }
500
501     /*
502      * Passive release (used to transition from user to kernel mode
503      * when we block or switch rather then when we enter the kernel).
504      * This function is NOT called if we are switching into a preemption
505      * or returning from a preemption.  Typically this causes us to lose
506      * our current process designation (if we have one) and become a true
507      * LWKT thread, and may also hand the current process designation to
508      * another process and schedule thread.
509      */
510     if (td->td_release)
511             td->td_release(td);
512
513     crit_enter_gd(gd);
514 #ifdef SMP
515     if (td->td_toks)
516             lwkt_relalltokens(td);
517 #endif
518
519     /*
520      * We had better not be holding any spin locks, but don't get into an
521      * endless panic loop.
522      */
523     KASSERT(gd->gd_spinlocks_rd == 0 || panicstr != NULL, 
524             ("lwkt_switch: still holding %d shared spinlocks!", 
525              gd->gd_spinlocks_rd));
526     KASSERT(gd->gd_spinlocks_wr == 0 || panicstr != NULL, 
527             ("lwkt_switch: still holding %d exclusive spinlocks!",
528              gd->gd_spinlocks_wr));
529
530
531 #ifdef SMP
532     /*
533      * td_mpcount cannot be used to determine if we currently hold the
534      * MP lock because get_mplock() will increment it prior to attempting
535      * to get the lock, and switch out if it can't.  Our ownership of 
536      * the actual lock will remain stable while we are in a critical section
537      * (but, of course, another cpu may own or release the lock so the
538      * actual value of mp_lock is not stable).
539      */
540     mpheld = MP_LOCK_HELD();
541 #ifdef  INVARIANTS
542     if (td->td_cscount) {
543         printf("Diagnostic: attempt to switch while mastering cpusync: %p\n",
544                 td);
545         if (panic_on_cscount)
546             panic("switching while mastering cpusync");
547     }
548 #endif
549 #endif
550     if ((ntd = td->td_preempted) != NULL) {
551         /*
552          * We had preempted another thread on this cpu, resume the preempted
553          * thread.  This occurs transparently, whether the preempted thread
554          * was scheduled or not (it may have been preempted after descheduling
555          * itself). 
556          *
557          * We have to setup the MP lock for the original thread after backing
558          * out the adjustment that was made to curthread when the original
559          * was preempted.
560          */
561         KKASSERT(ntd->td_flags & TDF_PREEMPT_LOCK);
562 #ifdef SMP
563         if (ntd->td_mpcount && mpheld == 0) {
564             panic("MPLOCK NOT HELD ON RETURN: %p %p %d %d",
565                td, ntd, td->td_mpcount, ntd->td_mpcount);
566         }
567         if (ntd->td_mpcount) {
568             td->td_mpcount -= ntd->td_mpcount;
569             KKASSERT(td->td_mpcount >= 0);
570         }
571 #endif
572         ntd->td_flags |= TDF_PREEMPT_DONE;
573
574         /*
575          * XXX.  The interrupt may have woken a thread up, we need to properly
576          * set the reschedule flag if the originally interrupted thread is at
577          * a lower priority.
578          */
579         if (gd->gd_runqmask > (2 << (ntd->td_pri & TDPRI_MASK)) - 1)
580             need_lwkt_resched();
581         /* YYY release mp lock on switchback if original doesn't need it */
582     } else {
583         /*
584          * Priority queue / round-robin at each priority.  Note that user
585          * processes run at a fixed, low priority and the user process
586          * scheduler deals with interactions between user processes
587          * by scheduling and descheduling them from the LWKT queue as
588          * necessary.
589          *
590          * We have to adjust the MP lock for the target thread.  If we 
591          * need the MP lock and cannot obtain it we try to locate a
592          * thread that does not need the MP lock.  If we cannot, we spin
593          * instead of HLT.
594          *
595          * A similar issue exists for the tokens held by the target thread.
596          * If we cannot obtain ownership of the tokens we cannot immediately
597          * schedule the thread.
598          */
599
600         /*
601          * If an LWKT reschedule was requested, well that is what we are
602          * doing now so clear it.
603          */
604         clear_lwkt_resched();
605 again:
606         if (gd->gd_runqmask) {
607             int nq = bsrl(gd->gd_runqmask);
608             if ((ntd = TAILQ_FIRST(&gd->gd_tdrunq[nq])) == NULL) {
609                 gd->gd_runqmask &= ~(1 << nq);
610                 goto again;
611             }
612 #ifdef SMP
613             /*
614              * THREAD SELECTION FOR AN SMP MACHINE BUILD
615              *
616              * If the target needs the MP lock and we couldn't get it,
617              * or if the target is holding tokens and we could not 
618              * gain ownership of the tokens, continue looking for a
619              * thread to schedule and spin instead of HLT if we can't.
620              *
621              * NOTE: the mpheld variable invalid after this conditional, it
622              * can change due to both cpu_try_mplock() returning success
623              * AND interactions in lwkt_getalltokens() due to the fact that
624              * we are trying to check the mpcount of a thread other then
625              * the current thread.  Because of this, if the current thread
626              * is not holding td_mpcount, an IPI indirectly run via
627              * lwkt_getalltokens() can obtain and release the MP lock and
628              * cause the core MP lock to be released. 
629              */
630             if ((ntd->td_mpcount && mpheld == 0 && !cpu_try_mplock()) ||
631                 (ntd->td_toks && lwkt_getalltokens(ntd) == 0)
632             ) {
633                 u_int32_t rqmask = gd->gd_runqmask;
634
635                 mpheld = MP_LOCK_HELD();
636                 ntd = NULL;
637                 while (rqmask) {
638                     TAILQ_FOREACH(ntd, &gd->gd_tdrunq[nq], td_threadq) {
639                         if (ntd->td_mpcount && !mpheld && !cpu_try_mplock()) {
640                             /* spinning due to MP lock being held */
641 #ifdef  INVARIANTS
642                             ++mplock_contention_count;
643 #endif
644                             /* mplock still not held, 'mpheld' still valid */
645                             continue;
646                         }
647
648                         /*
649                          * mpheld state invalid after getalltokens call returns
650                          * failure, but the variable is only needed for
651                          * the loop.
652                          */
653                         if (ntd->td_toks && !lwkt_getalltokens(ntd)) {
654                             /* spinning due to token contention */
655 #ifdef  INVARIANTS
656                             ++token_contention_count;
657 #endif
658                             mpheld = MP_LOCK_HELD();
659                             continue;
660                         }
661                         break;
662                     }
663                     if (ntd)
664                         break;
665                     rqmask &= ~(1 << nq);
666                     nq = bsrl(rqmask);
667                 }
668                 if (ntd == NULL) {
669                     ntd = &gd->gd_idlethread;
670                     ntd->td_flags |= TDF_IDLE_NOHLT;
671                     goto using_idle_thread;
672                 } else {
673                     ++gd->gd_cnt.v_swtch;
674                     TAILQ_REMOVE(&gd->gd_tdrunq[nq], ntd, td_threadq);
675                     TAILQ_INSERT_TAIL(&gd->gd_tdrunq[nq], ntd, td_threadq);
676                 }
677             } else {
678                 ++gd->gd_cnt.v_swtch;
679                 TAILQ_REMOVE(&gd->gd_tdrunq[nq], ntd, td_threadq);
680                 TAILQ_INSERT_TAIL(&gd->gd_tdrunq[nq], ntd, td_threadq);
681             }
682 #else
683             /*
684              * THREAD SELECTION FOR A UP MACHINE BUILD.  We don't have to
685              * worry about tokens or the BGL.
686              */
687             ++gd->gd_cnt.v_swtch;
688             TAILQ_REMOVE(&gd->gd_tdrunq[nq], ntd, td_threadq);
689             TAILQ_INSERT_TAIL(&gd->gd_tdrunq[nq], ntd, td_threadq);
690 #endif
691         } else {
692             /*
693              * We have nothing to run but only let the idle loop halt
694              * the cpu if there are no pending interrupts.
695              */
696             ntd = &gd->gd_idlethread;
697             if (gd->gd_reqflags & RQF_IDLECHECK_MASK)
698                 ntd->td_flags |= TDF_IDLE_NOHLT;
699 #ifdef SMP
700 using_idle_thread:
701             /*
702              * The idle thread should not be holding the MP lock unless we
703              * are trapping in the kernel or in a panic.  Since we select the
704              * idle thread unconditionally when no other thread is available,
705              * if the MP lock is desired during a panic or kernel trap, we
706              * have to loop in the scheduler until we get it.
707              */
708             if (ntd->td_mpcount) {
709                 mpheld = MP_LOCK_HELD();
710                 if (gd->gd_trap_nesting_level == 0 && panicstr == NULL)
711                     panic("Idle thread %p was holding the BGL!", ntd);
712                 else if (mpheld == 0)
713                     goto again;
714             }
715 #endif
716         }
717     }
718     KASSERT(ntd->td_pri >= TDPRI_CRIT,
719         ("priority problem in lwkt_switch %d %d", td->td_pri, ntd->td_pri));
720
721     /*
722      * Do the actual switch.  If the new target does not need the MP lock
723      * and we are holding it, release the MP lock.  If the new target requires
724      * the MP lock we have already acquired it for the target.
725      */
726 #ifdef SMP
727     if (ntd->td_mpcount == 0 ) {
728         if (MP_LOCK_HELD())
729             cpu_rel_mplock();
730     } else {
731         ASSERT_MP_LOCK_HELD(ntd);
732     }
733 #endif
734     if (td != ntd) {
735         ++switch_count;
736         td->td_switch(ntd);
737     }
738     /* NOTE: current cpu may have changed after switch */
739     crit_exit_quick(td);
740 }
741
742 /*
743  * Request that the target thread preempt the current thread.  Preemption
744  * only works under a specific set of conditions:
745  *
746  *      - We are not preempting ourselves
747  *      - The target thread is owned by the current cpu
748  *      - We are not currently being preempted
749  *      - The target is not currently being preempted
750  *      - We are able to satisfy the target's MP lock requirements (if any).
751  *
752  * THE CALLER OF LWKT_PREEMPT() MUST BE IN A CRITICAL SECTION.  Typically
753  * this is called via lwkt_schedule() through the td_preemptable callback.
754  * critpri is the managed critical priority that we should ignore in order
755  * to determine whether preemption is possible (aka usually just the crit
756  * priority of lwkt_schedule() itself).
757  *
758  * XXX at the moment we run the target thread in a critical section during
759  * the preemption in order to prevent the target from taking interrupts
760  * that *WE* can't.  Preemption is strictly limited to interrupt threads
761  * and interrupt-like threads, outside of a critical section, and the
762  * preempted source thread will be resumed the instant the target blocks
763  * whether or not the source is scheduled (i.e. preemption is supposed to
764  * be as transparent as possible).
765  *
766  * The target thread inherits our MP count (added to its own) for the
767  * duration of the preemption in order to preserve the atomicy of the
768  * MP lock during the preemption.  Therefore, any preempting targets must be
769  * careful in regards to MP assertions.  Note that the MP count may be
770  * out of sync with the physical mp_lock, but we do not have to preserve
771  * the original ownership of the lock if it was out of synch (that is, we
772  * can leave it synchronized on return).
773  */
774 void
775 lwkt_preempt(thread_t ntd, int critpri)
776 {
777     struct globaldata *gd = mycpu;
778     thread_t td;
779 #ifdef SMP
780     int mpheld;
781     int savecnt;
782 #endif
783
784     /*
785      * The caller has put us in a critical section.  We can only preempt
786      * if the caller of the caller was not in a critical section (basically
787      * a local interrupt), as determined by the 'critpri' parameter.  We
788      * also acn't preempt if the caller is holding any spinlocks (even if
789      * he isn't in a critical section).  This also handles the tokens test.
790      *
791      * YYY The target thread must be in a critical section (else it must
792      * inherit our critical section?  I dunno yet).
793      *
794      * Set need_lwkt_resched() unconditionally for now YYY.
795      */
796     KASSERT(ntd->td_pri >= TDPRI_CRIT, ("BADCRIT0 %d", ntd->td_pri));
797
798     td = gd->gd_curthread;
799     if ((ntd->td_pri & TDPRI_MASK) <= (td->td_pri & TDPRI_MASK)) {
800         ++preempt_miss;
801         return;
802     }
803     if ((td->td_pri & ~TDPRI_MASK) > critpri) {
804         ++preempt_miss;
805         need_lwkt_resched();
806         return;
807     }
808 #ifdef SMP
809     if (ntd->td_gd != gd) {
810         ++preempt_miss;
811         need_lwkt_resched();
812         return;
813     }
814 #endif
815     /*
816      * Take the easy way out and do not preempt if the target is holding
817      * any spinlocks.  We could test whether the thread(s) being
818      * preempted interlock against the target thread's tokens and whether
819      * we can get all the target thread's tokens, but this situation 
820      * should not occur very often so its easier to simply not preempt.
821      * Also, plain spinlocks are impossible to figure out at this point so 
822      * just don't preempt.
823      */
824     if (gd->gd_spinlocks_rd + gd->gd_spinlocks_wr != 0) {
825         ++preempt_miss;
826         need_lwkt_resched();
827         return;
828     }
829     if (td == ntd || ((td->td_flags | ntd->td_flags) & TDF_PREEMPT_LOCK)) {
830         ++preempt_weird;
831         need_lwkt_resched();
832         return;
833     }
834     if (ntd->td_preempted) {
835         ++preempt_hit;
836         need_lwkt_resched();
837         return;
838     }
839 #ifdef SMP
840     /*
841      * note: an interrupt might have occured just as we were transitioning
842      * to or from the MP lock.  In this case td_mpcount will be pre-disposed
843      * (non-zero) but not actually synchronized with the actual state of the
844      * lock.  We can use it to imply an MP lock requirement for the
845      * preemption but we cannot use it to test whether we hold the MP lock
846      * or not.
847      */
848     savecnt = td->td_mpcount;
849     mpheld = MP_LOCK_HELD();
850     ntd->td_mpcount += td->td_mpcount;
851     if (mpheld == 0 && ntd->td_mpcount && !cpu_try_mplock()) {
852         ntd->td_mpcount -= td->td_mpcount;
853         ++preempt_miss;
854         need_lwkt_resched();
855         return;
856     }
857 #endif
858
859     /*
860      * Since we are able to preempt the current thread, there is no need to
861      * call need_lwkt_resched().
862      */
863     ++preempt_hit;
864     ntd->td_preempted = td;
865     td->td_flags |= TDF_PREEMPT_LOCK;
866     td->td_switch(ntd);
867     KKASSERT(ntd->td_preempted && (td->td_flags & TDF_PREEMPT_DONE));
868 #ifdef SMP
869     KKASSERT(savecnt == td->td_mpcount);
870     mpheld = MP_LOCK_HELD();
871     if (mpheld && td->td_mpcount == 0)
872         cpu_rel_mplock();
873     else if (mpheld == 0 && td->td_mpcount)
874         panic("lwkt_preempt(): MP lock was not held through");
875 #endif
876     ntd->td_preempted = NULL;
877     td->td_flags &= ~(TDF_PREEMPT_LOCK|TDF_PREEMPT_DONE);
878 }
879
880 /*
881  * Yield our thread while higher priority threads are pending.  This is
882  * typically called when we leave a critical section but it can be safely
883  * called while we are in a critical section.
884  *
885  * This function will not generally yield to equal priority threads but it
886  * can occur as a side effect.  Note that lwkt_switch() is called from
887  * inside the critical section to prevent its own crit_exit() from reentering
888  * lwkt_yield_quick().
889  *
890  * gd_reqflags indicates that *something* changed, e.g. an interrupt or softint
891  * came along but was blocked and made pending.
892  *
893  * (self contained on a per cpu basis)
894  */
895 void
896 lwkt_yield_quick(void)
897 {
898     globaldata_t gd = mycpu;
899     thread_t td = gd->gd_curthread;
900
901     /*
902      * gd_reqflags is cleared in splz if the cpl is 0.  If we were to clear
903      * it with a non-zero cpl then we might not wind up calling splz after
904      * a task switch when the critical section is exited even though the
905      * new task could accept the interrupt.
906      *
907      * XXX from crit_exit() only called after last crit section is released.
908      * If called directly will run splz() even if in a critical section.
909      *
910      * td_nest_count prevent deep nesting via splz() or doreti().  Note that
911      * except for this special case, we MUST call splz() here to handle any
912      * pending ints, particularly after we switch, or we might accidently
913      * halt the cpu with interrupts pending.
914      */
915     if (gd->gd_reqflags && td->td_nest_count < 2)
916         splz();
917
918     /*
919      * YYY enabling will cause wakeup() to task-switch, which really
920      * confused the old 4.x code.  This is a good way to simulate
921      * preemption and MP without actually doing preemption or MP, because a
922      * lot of code assumes that wakeup() does not block.
923      */
924     if (untimely_switch && td->td_nest_count == 0 &&
925         gd->gd_intr_nesting_level == 0
926     ) {
927         crit_enter_quick(td);
928         /*
929          * YYY temporary hacks until we disassociate the userland scheduler
930          * from the LWKT scheduler.
931          */
932         if (td->td_flags & TDF_RUNQ) {
933             lwkt_switch();              /* will not reenter yield function */
934         } else {
935             lwkt_schedule_self(td);     /* make sure we are scheduled */
936             lwkt_switch();              /* will not reenter yield function */
937             lwkt_deschedule_self(td);   /* make sure we are descheduled */
938         }
939         crit_exit_noyield(td);
940     }
941 }
942
943 /*
944  * This implements a normal yield which, unlike _quick, will yield to equal
945  * priority threads as well.  Note that gd_reqflags tests will be handled by
946  * the crit_exit() call in lwkt_switch().
947  *
948  * (self contained on a per cpu basis)
949  */
950 void
951 lwkt_yield(void)
952 {
953     lwkt_schedule_self(curthread);
954     lwkt_switch();
955 }
956
957 /*
958  * Generic schedule.  Possibly schedule threads belonging to other cpus and
959  * deal with threads that might be blocked on a wait queue.
960  *
961  * We have a little helper inline function which does additional work after
962  * the thread has been enqueued, including dealing with preemption and
963  * setting need_lwkt_resched() (which prevents the kernel from returning
964  * to userland until it has processed higher priority threads).
965  *
966  * It is possible for this routine to be called after a failed _enqueue
967  * (due to the target thread migrating, sleeping, or otherwise blocked).
968  * We have to check that the thread is actually on the run queue!
969  */
970 static __inline
971 void
972 _lwkt_schedule_post(globaldata_t gd, thread_t ntd, int cpri)
973 {
974     if (ntd->td_flags & TDF_RUNQ) {
975         if (ntd->td_preemptable) {
976             ntd->td_preemptable(ntd, cpri);     /* YYY +token */
977         } else if ((ntd->td_flags & TDF_NORESCHED) == 0 &&
978             (ntd->td_pri & TDPRI_MASK) > (gd->gd_curthread->td_pri & TDPRI_MASK)
979         ) {
980             need_lwkt_resched();
981         }
982     }
983 }
984
985 void
986 lwkt_schedule(thread_t td)
987 {
988     globaldata_t mygd = mycpu;
989
990     KASSERT(td != &td->td_gd->gd_idlethread, ("lwkt_schedule(): scheduling gd_idlethread is illegal!"));
991     crit_enter_gd(mygd);
992     KKASSERT(td->td_proc == NULL || (td->td_proc->p_flag & P_ONRUNQ) == 0);
993     if (td == mygd->gd_curthread) {
994         _lwkt_enqueue(td);
995     } else {
996         lwkt_wait_t w;
997
998         /*
999          * If the thread is on a wait list we have to send our scheduling
1000          * request to the owner of the wait structure.  Otherwise we send
1001          * the scheduling request to the cpu owning the thread.  Races
1002          * are ok, the target will forward the message as necessary (the
1003          * message may chase the thread around before it finally gets
1004          * acted upon).
1005          *
1006          * (remember, wait structures use stable storage)
1007          *
1008          * NOTE: we have to account for the number of critical sections
1009          * under our control when calling _lwkt_schedule_post() so it
1010          * can figure out whether preemption is allowed.
1011          *
1012          * NOTE: The wait structure algorithms are a mess and need to be
1013          * rewritten.
1014          *
1015          * NOTE: We cannot safely acquire or release a token, even 
1016          * non-blocking, because this routine may be called in the context
1017          * of a thread already holding the token and thus not provide any
1018          * interlock protection.  We cannot safely manipulate the td_toks
1019          * list for the same reason.  Instead we depend on our critical
1020          * section if the token is owned by our cpu.
1021          */
1022         if ((w = td->td_wait) != NULL) {
1023             spin_lock_wr(&w->wa_spinlock);
1024             TAILQ_REMOVE(&w->wa_waitq, td, td_threadq);
1025             --w->wa_count;
1026             td->td_wait = NULL;
1027             spin_unlock_wr(&w->wa_spinlock);
1028 #ifdef SMP
1029             if (td->td_gd == mygd) {
1030                 _lwkt_enqueue(td);
1031                 _lwkt_schedule_post(mygd, td, TDPRI_CRIT);
1032             } else {
1033                 lwkt_send_ipiq(td->td_gd, (ipifunc1_t)lwkt_schedule, td);
1034             }
1035 #else
1036             _lwkt_enqueue(td);
1037             _lwkt_schedule_post(mygd, td, TDPRI_CRIT);
1038 #endif
1039         } else {
1040             /*
1041              * If the wait structure is NULL and we own the thread, there
1042              * is no race (since we are in a critical section).  If we
1043              * do not own the thread there might be a race but the
1044              * target cpu will deal with it.
1045              */
1046 #ifdef SMP
1047             if (td->td_gd == mygd) {
1048                 _lwkt_enqueue(td);
1049                 _lwkt_schedule_post(mygd, td, TDPRI_CRIT);
1050             } else {
1051                 lwkt_send_ipiq(td->td_gd, (ipifunc1_t)lwkt_schedule, td);
1052             }
1053 #else
1054             _lwkt_enqueue(td);
1055             _lwkt_schedule_post(mygd, td, TDPRI_CRIT);
1056 #endif
1057         }
1058     }
1059     crit_exit_gd(mygd);
1060 }
1061
1062 /*
1063  * Managed acquisition.  This code assumes that the MP lock is held for
1064  * the tdallq operation and that the thread has been descheduled from its
1065  * original cpu.  We also have to wait for the thread to be entirely switched
1066  * out on its original cpu (this is usually fast enough that we never loop)
1067  * since the LWKT system does not have to hold the MP lock while switching
1068  * and the target may have released it before switching.
1069  */
1070 void
1071 lwkt_acquire(thread_t td)
1072 {
1073     globaldata_t gd;
1074     globaldata_t mygd;
1075
1076     gd = td->td_gd;
1077     mygd = mycpu;
1078     cpu_lfence();
1079     KKASSERT((td->td_flags & TDF_RUNQ) == 0);
1080     while (td->td_flags & (TDF_RUNNING|TDF_PREEMPT_LOCK))       /* XXX spin */
1081         cpu_lfence();
1082     if (gd != mygd) {
1083         crit_enter_gd(mygd);
1084         TAILQ_REMOVE(&gd->gd_tdallq, td, td_allq);      /* protected by BGL */
1085         td->td_gd = mygd;
1086         TAILQ_INSERT_TAIL(&mygd->gd_tdallq, td, td_allq); /* protected by BGL */
1087         crit_exit_gd(mygd);
1088     }
1089 }
1090
1091 /*
1092  * Generic deschedule.  Descheduling threads other then your own should be
1093  * done only in carefully controlled circumstances.  Descheduling is 
1094  * asynchronous.  
1095  *
1096  * This function may block if the cpu has run out of messages.
1097  */
1098 void
1099 lwkt_deschedule(thread_t td)
1100 {
1101     crit_enter();
1102 #ifdef SMP
1103     if (td == curthread) {
1104         _lwkt_dequeue(td);
1105     } else {
1106         if (td->td_gd == mycpu) {
1107             _lwkt_dequeue(td);
1108         } else {
1109             lwkt_send_ipiq(td->td_gd, (ipifunc1_t)lwkt_deschedule, td);
1110         }
1111     }
1112 #else
1113     _lwkt_dequeue(td);
1114 #endif
1115     crit_exit();
1116 }
1117
1118 /*
1119  * Set the target thread's priority.  This routine does not automatically
1120  * switch to a higher priority thread, LWKT threads are not designed for
1121  * continuous priority changes.  Yield if you want to switch.
1122  *
1123  * We have to retain the critical section count which uses the high bits
1124  * of the td_pri field.  The specified priority may also indicate zero or
1125  * more critical sections by adding TDPRI_CRIT*N.
1126  *
1127  * Note that we requeue the thread whether it winds up on a different runq
1128  * or not.  uio_yield() depends on this and the routine is not normally
1129  * called with the same priority otherwise.
1130  */
1131 void
1132 lwkt_setpri(thread_t td, int pri)
1133 {
1134     KKASSERT(pri >= 0);
1135     KKASSERT(td->td_gd == mycpu);
1136     crit_enter();
1137     if (td->td_flags & TDF_RUNQ) {
1138         _lwkt_dequeue(td);
1139         td->td_pri = (td->td_pri & ~TDPRI_MASK) + pri;
1140         _lwkt_enqueue(td);
1141     } else {
1142         td->td_pri = (td->td_pri & ~TDPRI_MASK) + pri;
1143     }
1144     crit_exit();
1145 }
1146
1147 void
1148 lwkt_setpri_self(int pri)
1149 {
1150     thread_t td = curthread;
1151
1152     KKASSERT(pri >= 0 && pri <= TDPRI_MAX);
1153     crit_enter();
1154     if (td->td_flags & TDF_RUNQ) {
1155         _lwkt_dequeue(td);
1156         td->td_pri = (td->td_pri & ~TDPRI_MASK) + pri;
1157         _lwkt_enqueue(td);
1158     } else {
1159         td->td_pri = (td->td_pri & ~TDPRI_MASK) + pri;
1160     }
1161     crit_exit();
1162 }
1163
1164 /*
1165  * Determine if there is a runnable thread at a higher priority then
1166  * the current thread.  lwkt_setpri() does not check this automatically.
1167  * Return 1 if there is, 0 if there isn't.
1168  *
1169  * Example: if bit 31 of runqmask is set and the current thread is priority
1170  * 30, then we wind up checking the mask: 0x80000000 against 0x7fffffff.  
1171  *
1172  * If nq reaches 31 the shift operation will overflow to 0 and we will wind
1173  * up comparing against 0xffffffff, a comparison that will always be false.
1174  */
1175 int
1176 lwkt_checkpri_self(void)
1177 {
1178     globaldata_t gd = mycpu;
1179     thread_t td = gd->gd_curthread;
1180     int nq = td->td_pri & TDPRI_MASK;
1181
1182     while (gd->gd_runqmask > (__uint32_t)(2 << nq) - 1) {
1183         if (TAILQ_FIRST(&gd->gd_tdrunq[nq + 1]))
1184             return(1);
1185         ++nq;
1186     }
1187     return(0);
1188 }
1189
1190 /*
1191  * Migrate the current thread to the specified cpu.  The BGL must be held
1192  * (for the gd_tdallq manipulation XXX).  This is accomplished by 
1193  * descheduling ourselves from the current cpu, moving our thread to the
1194  * tdallq of the target cpu, IPI messaging the target cpu, and switching out.
1195  * TDF_MIGRATING prevents scheduling races while the thread is being migrated.
1196  */
1197 #ifdef SMP
1198 static void lwkt_setcpu_remote(void *arg);
1199 #endif
1200
1201 void
1202 lwkt_setcpu_self(globaldata_t rgd)
1203 {
1204 #ifdef SMP
1205     thread_t td = curthread;
1206
1207     if (td->td_gd != rgd) {
1208         crit_enter_quick(td);
1209         td->td_flags |= TDF_MIGRATING;
1210         lwkt_deschedule_self(td);
1211         TAILQ_REMOVE(&td->td_gd->gd_tdallq, td, td_allq); /* protected by BGL */
1212         TAILQ_INSERT_TAIL(&rgd->gd_tdallq, td, td_allq); /* protected by BGL */
1213         lwkt_send_ipiq(rgd, (ipifunc1_t)lwkt_setcpu_remote, td);
1214         lwkt_switch();
1215         /* we are now on the target cpu */
1216         crit_exit_quick(td);
1217     }
1218 #endif
1219 }
1220
1221 void
1222 lwkt_migratecpu(int cpuid)
1223 {
1224 #ifdef SMP
1225         globaldata_t rgd;
1226
1227         rgd = globaldata_find(cpuid);
1228         lwkt_setcpu_self(rgd);
1229 #endif
1230 }
1231
1232 /*
1233  * Remote IPI for cpu migration (called while in a critical section so we
1234  * do not have to enter another one).  The thread has already been moved to
1235  * our cpu's allq, but we must wait for the thread to be completely switched
1236  * out on the originating cpu before we schedule it on ours or the stack
1237  * state may be corrupt.  We clear TDF_MIGRATING after flushing the GD
1238  * change to main memory.
1239  *
1240  * XXX The use of TDF_MIGRATING might not be sufficient to avoid races
1241  * against wakeups.  It is best if this interface is used only when there
1242  * are no pending events that might try to schedule the thread.
1243  */
1244 #ifdef SMP
1245 static void
1246 lwkt_setcpu_remote(void *arg)
1247 {
1248     thread_t td = arg;
1249     globaldata_t gd = mycpu;
1250
1251     while (td->td_flags & (TDF_RUNNING|TDF_PREEMPT_LOCK))
1252         cpu_lfence();
1253     td->td_gd = gd;
1254     cpu_sfence();
1255     td->td_flags &= ~TDF_MIGRATING;
1256     KKASSERT(td->td_proc == NULL || (td->td_proc->p_flag & P_ONRUNQ) == 0);
1257     _lwkt_enqueue(td);
1258 }
1259 #endif
1260
1261 struct lwp *
1262 lwkt_preempted_proc(void)
1263 {
1264     thread_t td = curthread;
1265     while (td->td_preempted)
1266         td = td->td_preempted;
1267     return(td->td_lwp);
1268 }
1269
1270 /*
1271  * Block on the specified wait queue until signaled.  A generation number
1272  * must be supplied to interlock the wait queue.  The function will
1273  * return immediately if the generation number does not match the wait
1274  * structure's generation number.
1275  */
1276 void
1277 lwkt_block(lwkt_wait_t w, const char *wmesg, int *gen)
1278 {
1279     thread_t td = curthread;
1280
1281     spin_lock_wr(&w->wa_spinlock);
1282     if (w->wa_gen == *gen) {
1283         _lwkt_dequeue(td);
1284         td->td_flags |= TDF_BLOCKQ;
1285         TAILQ_INSERT_TAIL(&w->wa_waitq, td, td_threadq);
1286         ++w->wa_count;
1287         td->td_wait = w;
1288         td->td_wmesg = wmesg;
1289         spin_unlock_wr(&w->wa_spinlock);
1290         lwkt_switch();
1291         KKASSERT((td->td_flags & TDF_BLOCKQ) == 0);
1292         td->td_wmesg = NULL;
1293         *gen = w->wa_gen;
1294     } else {
1295         *gen = w->wa_gen;
1296         spin_unlock_wr(&w->wa_spinlock);
1297     }
1298 }
1299
1300 /*
1301  * Signal a wait queue.  We gain ownership of the wait queue in order to
1302  * signal it.  Once a thread is removed from the wait queue we have to
1303  * deal with the cpu owning the thread.
1304  *
1305  * Note: alternatively we could message the target cpu owning the wait
1306  * queue.  YYY implement as sysctl.
1307  */
1308 void
1309 lwkt_signal(lwkt_wait_t w, int count)
1310 {
1311     thread_t td;
1312
1313     spin_lock_wr(&w->wa_spinlock);
1314     ++w->wa_gen;
1315     if (count < 0)
1316         count = w->wa_count;
1317     while ((td = TAILQ_FIRST(&w->wa_waitq)) != NULL && count) {
1318         --count;
1319         --w->wa_count;
1320         KKASSERT(td->td_flags & TDF_BLOCKQ);
1321         TAILQ_REMOVE(&w->wa_waitq, td, td_threadq);
1322         td->td_flags &= ~TDF_BLOCKQ;
1323         td->td_wait = NULL;
1324         spin_unlock_wr(&w->wa_spinlock);
1325         KKASSERT(td->td_proc == NULL || (td->td_proc->p_flag & P_ONRUNQ) == 0);
1326 #ifdef SMP
1327         if (td->td_gd == mycpu) {
1328             _lwkt_enqueue(td);
1329         } else {
1330             lwkt_send_ipiq(td->td_gd, (ipifunc1_t)lwkt_schedule, td);
1331         }
1332 #else
1333         _lwkt_enqueue(td);
1334 #endif
1335         spin_lock_wr(&w->wa_spinlock);
1336     }
1337     spin_unlock_wr(&w->wa_spinlock);
1338 }
1339
1340 /*
1341  * Create a kernel process/thread/whatever.  It shares it's address space
1342  * with proc0 - ie: kernel only.
1343  *
1344  * NOTE!  By default new threads are created with the MP lock held.  A 
1345  * thread which does not require the MP lock should release it by calling
1346  * rel_mplock() at the start of the new thread.
1347  */
1348 int
1349 lwkt_create(void (*func)(void *), void *arg,
1350     struct thread **tdp, thread_t template, int tdflags, int cpu,
1351     const char *fmt, ...)
1352 {
1353     thread_t td;
1354     __va_list ap;
1355
1356     td = lwkt_alloc_thread(template, LWKT_THREAD_STACK, cpu,
1357                            tdflags | TDF_VERBOSE);
1358     if (tdp)
1359         *tdp = td;
1360     cpu_set_thread_handler(td, lwkt_exit, func, arg);
1361
1362     /*
1363      * Set up arg0 for 'ps' etc
1364      */
1365     __va_start(ap, fmt);
1366     vsnprintf(td->td_comm, sizeof(td->td_comm), fmt, ap);
1367     __va_end(ap);
1368
1369     /*
1370      * Schedule the thread to run
1371      */
1372     if ((td->td_flags & TDF_STOPREQ) == 0)
1373         lwkt_schedule(td);
1374     else
1375         td->td_flags &= ~TDF_STOPREQ;
1376     return 0;
1377 }
1378
1379 /*
1380  * kthread_* is specific to the kernel and is not needed by userland.
1381  */
1382 #ifdef _KERNEL
1383
1384 /*
1385  * Destroy an LWKT thread.   Warning!  This function is not called when
1386  * a process exits, cpu_proc_exit() directly calls cpu_thread_exit() and
1387  * uses a different reaping mechanism.
1388  */
1389 void
1390 lwkt_exit(void)
1391 {
1392     thread_t td = curthread;
1393     globaldata_t gd;
1394
1395     if (td->td_flags & TDF_VERBOSE)
1396         printf("kthread %p %s has exited\n", td, td->td_comm);
1397     caps_exit(td);
1398     crit_enter_quick(td);
1399     lwkt_deschedule_self(td);
1400     gd = mycpu;
1401     KKASSERT(gd == td->td_gd);
1402     TAILQ_REMOVE(&gd->gd_tdallq, td, td_allq);
1403     if (td->td_flags & TDF_ALLOCATED_THREAD) {
1404         ++gd->gd_tdfreecount;
1405         TAILQ_INSERT_TAIL(&gd->gd_tdfreeq, td, td_threadq);
1406     }
1407     cpu_thread_exit();
1408 }
1409
1410 #endif /* _KERNEL */
1411
1412 void
1413 crit_panic(void)
1414 {
1415     thread_t td = curthread;
1416     int lpri = td->td_pri;
1417
1418     td->td_pri = 0;
1419     panic("td_pri is/would-go negative! %p %d", td, lpri);
1420 }
1421
1422 #ifdef SMP
1423
1424 /*
1425  * Called from debugger/panic on cpus which have been stopped.  We must still
1426  * process the IPIQ while stopped, even if we were stopped while in a critical
1427  * section (XXX).
1428  *
1429  * If we are dumping also try to process any pending interrupts.  This may
1430  * or may not work depending on the state of the cpu at the point it was
1431  * stopped.
1432  */
1433 void
1434 lwkt_smp_stopped(void)
1435 {
1436     globaldata_t gd = mycpu;
1437
1438     crit_enter_gd(gd);
1439     if (dumping) {
1440         lwkt_process_ipiq();
1441         splz();
1442     } else {
1443         lwkt_process_ipiq();
1444     }
1445     crit_exit_gd(gd);
1446 }
1447
1448 #endif