Introduce an MI cpu synchronization API, redo the SMP AP startup code,
[dragonfly.git] / sys / kern / lwkt_thread.c
1 /*
2  * Copyright (c) 2003 Matthew Dillon <dillon@backplane.com>
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24  * SUCH DAMAGE.
25  *
26  * $DragonFly: src/sys/kern/lwkt_thread.c,v 1.55 2004/02/17 19:38:49 dillon Exp $
27  */
28
29 /*
30  * Each cpu in a system has its own self-contained light weight kernel
31  * thread scheduler, which means that generally speaking we only need
32  * to use a critical section to avoid problems.  Foreign thread 
33  * scheduling is queued via (async) IPIs.
34  */
35
36 #ifdef _KERNEL
37
38 #include <sys/param.h>
39 #include <sys/systm.h>
40 #include <sys/kernel.h>
41 #include <sys/proc.h>
42 #include <sys/rtprio.h>
43 #include <sys/queue.h>
44 #include <sys/thread2.h>
45 #include <sys/sysctl.h>
46 #include <sys/kthread.h>
47 #include <machine/cpu.h>
48 #include <sys/lock.h>
49 #include <sys/caps.h>
50
51 #include <vm/vm.h>
52 #include <vm/vm_param.h>
53 #include <vm/vm_kern.h>
54 #include <vm/vm_object.h>
55 #include <vm/vm_page.h>
56 #include <vm/vm_map.h>
57 #include <vm/vm_pager.h>
58 #include <vm/vm_extern.h>
59 #include <vm/vm_zone.h>
60
61 #include <machine/stdarg.h>
62 #include <machine/ipl.h>
63 #include <machine/smp.h>
64
65 #define THREAD_STACK    (UPAGES * PAGE_SIZE)
66
67 #else
68
69 #include <sys/stdint.h>
70 #include <libcaps/thread.h>
71 #include <sys/thread.h>
72 #include <sys/msgport.h>
73 #include <sys/errno.h>
74 #include <libcaps/globaldata.h>
75 #include <sys/thread2.h>
76 #include <sys/msgport2.h>
77 #include <stdio.h>
78 #include <stdlib.h>
79 #include <string.h>
80 #include <machine/cpufunc.h>
81 #include <machine/lock.h>
82
83 #endif
84
85 static int untimely_switch = 0;
86 #ifdef  INVARIANTS
87 static int panic_on_cscount = 0;
88 #endif
89 static __int64_t switch_count = 0;
90 static __int64_t preempt_hit = 0;
91 static __int64_t preempt_miss = 0;
92 static __int64_t preempt_weird = 0;
93
94 #ifdef _KERNEL
95
96 SYSCTL_INT(_lwkt, OID_AUTO, untimely_switch, CTLFLAG_RW, &untimely_switch, 0, "");
97 #ifdef  INVARIANTS
98 SYSCTL_INT(_lwkt, OID_AUTO, panic_on_cscount, CTLFLAG_RW, &panic_on_cscount, 0, "");
99 #endif
100 SYSCTL_QUAD(_lwkt, OID_AUTO, switch_count, CTLFLAG_RW, &switch_count, 0, "");
101 SYSCTL_QUAD(_lwkt, OID_AUTO, preempt_hit, CTLFLAG_RW, &preempt_hit, 0, "");
102 SYSCTL_QUAD(_lwkt, OID_AUTO, preempt_miss, CTLFLAG_RW, &preempt_miss, 0, "");
103 SYSCTL_QUAD(_lwkt, OID_AUTO, preempt_weird, CTLFLAG_RW, &preempt_weird, 0, "");
104
105 #endif
106
107 /*
108  * These helper procedures handle the runq, they can only be called from
109  * within a critical section.
110  *
111  * WARNING!  Prior to SMP being brought up it is possible to enqueue and
112  * dequeue threads belonging to other cpus, so be sure to use td->td_gd
113  * instead of 'mycpu' when referencing the globaldata structure.   Once
114  * SMP live enqueuing and dequeueing only occurs on the current cpu.
115  */
116 static __inline
117 void
118 _lwkt_dequeue(thread_t td)
119 {
120     if (td->td_flags & TDF_RUNQ) {
121         int nq = td->td_pri & TDPRI_MASK;
122         struct globaldata *gd = td->td_gd;
123
124         td->td_flags &= ~TDF_RUNQ;
125         TAILQ_REMOVE(&gd->gd_tdrunq[nq], td, td_threadq);
126         /* runqmask is passively cleaned up by the switcher */
127     }
128 }
129
130 static __inline
131 void
132 _lwkt_enqueue(thread_t td)
133 {
134     if ((td->td_flags & TDF_RUNQ) == 0) {
135         int nq = td->td_pri & TDPRI_MASK;
136         struct globaldata *gd = td->td_gd;
137
138         td->td_flags |= TDF_RUNQ;
139         TAILQ_INSERT_TAIL(&gd->gd_tdrunq[nq], td, td_threadq);
140         gd->gd_runqmask |= 1 << nq;
141     }
142 }
143
144 static __inline
145 int
146 _lwkt_wantresched(thread_t ntd, thread_t cur)
147 {
148     return((ntd->td_pri & TDPRI_MASK) > (cur->td_pri & TDPRI_MASK));
149 }
150
151 #ifdef _KERNEL
152
153 /*
154  * LWKTs operate on a per-cpu basis
155  *
156  * WARNING!  Called from early boot, 'mycpu' may not work yet.
157  */
158 void
159 lwkt_gdinit(struct globaldata *gd)
160 {
161     int i;
162
163     for (i = 0; i < sizeof(gd->gd_tdrunq)/sizeof(gd->gd_tdrunq[0]); ++i)
164         TAILQ_INIT(&gd->gd_tdrunq[i]);
165     gd->gd_runqmask = 0;
166     TAILQ_INIT(&gd->gd_tdallq);
167 }
168
169 #endif /* _KERNEL */
170
171 /*
172  * Initialize a thread wait structure prior to first use.
173  *
174  * NOTE!  called from low level boot code, we cannot do anything fancy!
175  */
176 void
177 lwkt_init_wait(lwkt_wait_t w)
178 {
179     TAILQ_INIT(&w->wa_waitq);
180 }
181
182 /*
183  * Create a new thread.  The thread must be associated with a process context
184  * or LWKT start address before it can be scheduled.  If the target cpu is
185  * -1 the thread will be created on the current cpu.
186  *
187  * If you intend to create a thread without a process context this function
188  * does everything except load the startup and switcher function.
189  */
190 thread_t
191 lwkt_alloc_thread(struct thread *td, int cpu)
192 {
193     void *stack;
194     int flags = 0;
195
196     if (td == NULL) {
197         crit_enter();
198         if (mycpu->gd_tdfreecount > 0) {
199             --mycpu->gd_tdfreecount;
200             td = TAILQ_FIRST(&mycpu->gd_tdfreeq);
201             KASSERT(td != NULL && (td->td_flags & TDF_RUNNING) == 0,
202                 ("lwkt_alloc_thread: unexpected NULL or corrupted td"));
203             TAILQ_REMOVE(&mycpu->gd_tdfreeq, td, td_threadq);
204             crit_exit();
205             stack = td->td_kstack;
206             flags = td->td_flags & (TDF_ALLOCATED_STACK|TDF_ALLOCATED_THREAD);
207         } else {
208             crit_exit();
209 #ifdef _KERNEL
210             td = zalloc(thread_zone);
211 #else
212             td = malloc(sizeof(struct thread));
213 #endif
214             td->td_kstack = NULL;
215             flags |= TDF_ALLOCATED_THREAD;
216         }
217     }
218     if ((stack = td->td_kstack) == NULL) {
219 #ifdef _KERNEL
220         stack = (void *)kmem_alloc(kernel_map, THREAD_STACK);
221 #else
222         stack = libcaps_alloc_stack(THREAD_STACK);
223 #endif
224         flags |= TDF_ALLOCATED_STACK;
225     }
226     if (cpu < 0)
227         lwkt_init_thread(td, stack, flags, mycpu);
228     else
229         lwkt_init_thread(td, stack, flags, globaldata_find(cpu));
230     return(td);
231 }
232
233 #ifdef _KERNEL
234
235 /*
236  * Initialize a preexisting thread structure.  This function is used by
237  * lwkt_alloc_thread() and also used to initialize the per-cpu idlethread.
238  *
239  * All threads start out in a critical section at a priority of
240  * TDPRI_KERN_DAEMON.  Higher level code will modify the priority as
241  * appropriate.  This function may send an IPI message when the 
242  * requested cpu is not the current cpu and consequently gd_tdallq may
243  * not be initialized synchronously from the point of view of the originating
244  * cpu.
245  *
246  * NOTE! we have to be careful in regards to creating threads for other cpus
247  * if SMP has not yet been activated.
248  */
249 static void
250 lwkt_init_thread_remote(void *arg)
251 {
252     thread_t td = arg;
253
254     TAILQ_INSERT_TAIL(&td->td_gd->gd_tdallq, td, td_allq);
255 }
256
257 void
258 lwkt_init_thread(thread_t td, void *stack, int flags, struct globaldata *gd)
259 {
260     bzero(td, sizeof(struct thread));
261     td->td_kstack = stack;
262     td->td_flags |= flags;
263     td->td_gd = gd;
264     td->td_pri = TDPRI_KERN_DAEMON + TDPRI_CRIT;
265     lwkt_initport(&td->td_msgport, td);
266     pmap_init_thread(td);
267 #ifdef SMP
268     if (gd == mycpu) {
269         crit_enter();
270         TAILQ_INSERT_TAIL(&gd->gd_tdallq, td, td_allq);
271         crit_exit();
272     } else {
273         lwkt_send_ipiq(gd, lwkt_init_thread_remote, td);
274     }
275 #else
276     crit_enter();
277     TAILQ_INSERT_TAIL(&gd->gd_tdallq, td, td_allq);
278     crit_exit();
279 #endif
280 }
281
282 #endif /* _KERNEL */
283
284 void
285 lwkt_set_comm(thread_t td, const char *ctl, ...)
286 {
287     __va_list va;
288
289     __va_start(va, ctl);
290     vsnprintf(td->td_comm, sizeof(td->td_comm), ctl, va);
291     __va_end(va);
292 }
293
294 void
295 lwkt_hold(thread_t td)
296 {
297     ++td->td_refs;
298 }
299
300 void
301 lwkt_rele(thread_t td)
302 {
303     KKASSERT(td->td_refs > 0);
304     --td->td_refs;
305 }
306
307 #ifdef _KERNEL
308
309 void
310 lwkt_wait_free(thread_t td)
311 {
312     while (td->td_refs)
313         tsleep(td, 0, "tdreap", hz);
314 }
315
316 #endif
317
318 void
319 lwkt_free_thread(thread_t td)
320 {
321     struct globaldata *gd = mycpu;
322
323     KASSERT((td->td_flags & TDF_RUNNING) == 0,
324         ("lwkt_free_thread: did not exit! %p", td));
325
326     crit_enter();
327     TAILQ_REMOVE(&gd->gd_tdallq, td, td_allq);
328     if (gd->gd_tdfreecount < CACHE_NTHREADS &&
329         (td->td_flags & TDF_ALLOCATED_THREAD)
330     ) {
331         ++gd->gd_tdfreecount;
332         TAILQ_INSERT_HEAD(&gd->gd_tdfreeq, td, td_threadq);
333         crit_exit();
334     } else {
335         crit_exit();
336         if (td->td_kstack && (td->td_flags & TDF_ALLOCATED_STACK)) {
337 #ifdef _KERNEL
338             kmem_free(kernel_map, (vm_offset_t)td->td_kstack, THREAD_STACK);
339 #else
340             libcaps_free_stack(td->td_kstack, THREAD_STACK);
341 #endif
342             /* gd invalid */
343             td->td_kstack = NULL;
344         }
345         if (td->td_flags & TDF_ALLOCATED_THREAD) {
346 #ifdef _KERNEL
347             zfree(thread_zone, td);
348 #else
349             free(td);
350 #endif
351         }
352     }
353 }
354
355
356 /*
357  * Switch to the next runnable lwkt.  If no LWKTs are runnable then 
358  * switch to the idlethread.  Switching must occur within a critical
359  * section to avoid races with the scheduling queue.
360  *
361  * We always have full control over our cpu's run queue.  Other cpus
362  * that wish to manipulate our queue must use the cpu_*msg() calls to
363  * talk to our cpu, so a critical section is all that is needed and
364  * the result is very, very fast thread switching.
365  *
366  * The LWKT scheduler uses a fixed priority model and round-robins at
367  * each priority level.  User process scheduling is a totally
368  * different beast and LWKT priorities should not be confused with
369  * user process priorities.
370  *
371  * The MP lock may be out of sync with the thread's td_mpcount.  lwkt_switch()
372  * cleans it up.  Note that the td_switch() function cannot do anything that
373  * requires the MP lock since the MP lock will have already been setup for
374  * the target thread (not the current thread).  It's nice to have a scheduler
375  * that does not need the MP lock to work because it allows us to do some
376  * really cool high-performance MP lock optimizations.
377  */
378
379 void
380 lwkt_switch(void)
381 {
382     struct globaldata *gd;
383     thread_t td = curthread;
384     thread_t ntd;
385 #ifdef SMP
386     int mpheld;
387 #endif
388
389     /*
390      * Switching from within a 'fast' (non thread switched) interrupt is
391      * illegal.
392      */
393     if (mycpu->gd_intr_nesting_level && panicstr == NULL) {
394         panic("lwkt_switch: cannot switch from within a fast interrupt, yet\n");
395     }
396
397     /*
398      * Passive release (used to transition from user to kernel mode
399      * when we block or switch rather then when we enter the kernel).
400      * This function is NOT called if we are switching into a preemption
401      * or returning from a preemption.  Typically this causes us to lose
402      * our P_CURPROC designation (if we have one) and become a true LWKT
403      * thread, and may also hand P_CURPROC to another process and schedule
404      * its thread.
405      */
406     if (td->td_release)
407             td->td_release(td);
408
409     crit_enter();
410     ++switch_count;
411
412 #ifdef SMP
413     /*
414      * td_mpcount cannot be used to determine if we currently hold the
415      * MP lock because get_mplock() will increment it prior to attempting
416      * to get the lock, and switch out if it can't.  Our ownership of 
417      * the actual lock will remain stable while we are in a critical section
418      * (but, of course, another cpu may own or release the lock so the
419      * actual value of mp_lock is not stable).
420      */
421     mpheld = MP_LOCK_HELD();
422 #ifdef  INVARIANTS
423     if (td->td_cscount) {
424         printf("Diagnostic: attempt to switch while mastering cpusync: %p\n",
425                 td);
426         if (panic_on_cscount)
427             panic("switching while mastering cpusync");
428     }
429 #endif
430 #endif
431     if ((ntd = td->td_preempted) != NULL) {
432         /*
433          * We had preempted another thread on this cpu, resume the preempted
434          * thread.  This occurs transparently, whether the preempted thread
435          * was scheduled or not (it may have been preempted after descheduling
436          * itself). 
437          *
438          * We have to setup the MP lock for the original thread after backing
439          * out the adjustment that was made to curthread when the original
440          * was preempted.
441          */
442         KKASSERT(ntd->td_flags & TDF_PREEMPT_LOCK);
443 #ifdef SMP
444         if (ntd->td_mpcount && mpheld == 0) {
445             panic("MPLOCK NOT HELD ON RETURN: %p %p %d %d\n",
446                td, ntd, td->td_mpcount, ntd->td_mpcount);
447         }
448         if (ntd->td_mpcount) {
449             td->td_mpcount -= ntd->td_mpcount;
450             KKASSERT(td->td_mpcount >= 0);
451         }
452 #endif
453         ntd->td_flags |= TDF_PREEMPT_DONE;
454         /* YYY release mp lock on switchback if original doesn't need it */
455     } else {
456         /*
457          * Priority queue / round-robin at each priority.  Note that user
458          * processes run at a fixed, low priority and the user process
459          * scheduler deals with interactions between user processes
460          * by scheduling and descheduling them from the LWKT queue as
461          * necessary.
462          *
463          * We have to adjust the MP lock for the target thread.  If we 
464          * need the MP lock and cannot obtain it we try to locate a
465          * thread that does not need the MP lock.
466          */
467         gd = mycpu;
468 again:
469         if (gd->gd_runqmask) {
470             int nq = bsrl(gd->gd_runqmask);
471             if ((ntd = TAILQ_FIRST(&gd->gd_tdrunq[nq])) == NULL) {
472                 gd->gd_runqmask &= ~(1 << nq);
473                 goto again;
474             }
475 #ifdef SMP
476             if (ntd->td_mpcount && mpheld == 0 && !cpu_try_mplock()) {
477                 /*
478                  * Target needs MP lock and we couldn't get it, try
479                  * to locate a thread which does not need the MP lock
480                  * to run.  If we cannot locate a thread spin in idle.
481                  */
482                 u_int32_t rqmask = gd->gd_runqmask;
483                 while (rqmask) {
484                     TAILQ_FOREACH(ntd, &gd->gd_tdrunq[nq], td_threadq) {
485                         if (ntd->td_mpcount == 0)
486                             break;
487                     }
488                     if (ntd)
489                         break;
490                     rqmask &= ~(1 << nq);
491                     nq = bsrl(rqmask);
492                 }
493                 if (ntd == NULL) {
494                     ntd = &gd->gd_idlethread;
495                     ntd->td_flags |= TDF_IDLE_NOHLT;
496                 } else {
497                     TAILQ_REMOVE(&gd->gd_tdrunq[nq], ntd, td_threadq);
498                     TAILQ_INSERT_TAIL(&gd->gd_tdrunq[nq], ntd, td_threadq);
499                 }
500             } else {
501                 TAILQ_REMOVE(&gd->gd_tdrunq[nq], ntd, td_threadq);
502                 TAILQ_INSERT_TAIL(&gd->gd_tdrunq[nq], ntd, td_threadq);
503             }
504 #else
505             TAILQ_REMOVE(&gd->gd_tdrunq[nq], ntd, td_threadq);
506             TAILQ_INSERT_TAIL(&gd->gd_tdrunq[nq], ntd, td_threadq);
507 #endif
508         } else {
509             /*
510              * We have nothing to run but only let the idle loop halt
511              * the cpu if there are no pending interrupts.
512              */
513             ntd = &gd->gd_idlethread;
514             if (gd->gd_reqflags & RQF_IDLECHECK_MASK)
515                 ntd->td_flags |= TDF_IDLE_NOHLT;
516         }
517     }
518     KASSERT(ntd->td_pri >= TDPRI_CRIT,
519         ("priority problem in lwkt_switch %d %d", td->td_pri, ntd->td_pri));
520
521     /*
522      * Do the actual switch.  If the new target does not need the MP lock
523      * and we are holding it, release the MP lock.  If the new target requires
524      * the MP lock we have already acquired it for the target.
525      */
526 #ifdef SMP
527     if (ntd->td_mpcount == 0 ) {
528         if (MP_LOCK_HELD())
529             cpu_rel_mplock();
530     } else {
531         ASSERT_MP_LOCK_HELD();
532     }
533 #endif
534     if (td != ntd) {
535         td->td_switch(ntd);
536     }
537
538     crit_exit();
539 }
540
541 /*
542  * Switch if another thread has a higher priority.  Do not switch to other
543  * threads at the same priority.
544  */
545 void
546 lwkt_maybe_switch()
547 {
548     struct globaldata *gd = mycpu;
549     struct thread *td = gd->gd_curthread;
550
551     if ((td->td_pri & TDPRI_MASK) < bsrl(gd->gd_runqmask)) {
552         lwkt_switch();
553     }
554 }
555
556 /*
557  * Request that the target thread preempt the current thread.  Preemption
558  * only works under a specific set of conditions:
559  *
560  *      - We are not preempting ourselves
561  *      - The target thread is owned by the current cpu
562  *      - We are not currently being preempted
563  *      - The target is not currently being preempted
564  *      - We are able to satisfy the target's MP lock requirements (if any).
565  *
566  * THE CALLER OF LWKT_PREEMPT() MUST BE IN A CRITICAL SECTION.  Typically
567  * this is called via lwkt_schedule() through the td_preemptable callback.
568  * critpri is the managed critical priority that we should ignore in order
569  * to determine whether preemption is possible (aka usually just the crit
570  * priority of lwkt_schedule() itself).
571  *
572  * XXX at the moment we run the target thread in a critical section during
573  * the preemption in order to prevent the target from taking interrupts
574  * that *WE* can't.  Preemption is strictly limited to interrupt threads
575  * and interrupt-like threads, outside of a critical section, and the
576  * preempted source thread will be resumed the instant the target blocks
577  * whether or not the source is scheduled (i.e. preemption is supposed to
578  * be as transparent as possible).
579  *
580  * The target thread inherits our MP count (added to its own) for the
581  * duration of the preemption in order to preserve the atomicy of the
582  * MP lock during the preemption.  Therefore, any preempting targets must be
583  * careful in regards to MP assertions.  Note that the MP count may be
584  * out of sync with the physical mp_lock, but we do not have to preserve
585  * the original ownership of the lock if it was out of synch (that is, we
586  * can leave it synchronized on return).
587  */
588 void
589 lwkt_preempt(thread_t ntd, int critpri)
590 {
591     struct globaldata *gd = mycpu;
592     thread_t td = gd->gd_curthread;
593 #ifdef SMP
594     int mpheld;
595     int savecnt;
596 #endif
597
598     /*
599      * The caller has put us in a critical section.  We can only preempt
600      * if the caller of the caller was not in a critical section (basically
601      * a local interrupt), as determined by the 'critpri' parameter.   If
602      * we are unable to preempt 
603      *
604      * YYY The target thread must be in a critical section (else it must
605      * inherit our critical section?  I dunno yet).
606      */
607     KASSERT(ntd->td_pri >= TDPRI_CRIT, ("BADCRIT0 %d", ntd->td_pri));
608
609     need_resched();
610     if (!_lwkt_wantresched(ntd, td)) {
611         ++preempt_miss;
612         return;
613     }
614     if ((td->td_pri & ~TDPRI_MASK) > critpri) {
615         ++preempt_miss;
616         return;
617     }
618 #ifdef SMP
619     if (ntd->td_gd != gd) {
620         ++preempt_miss;
621         return;
622     }
623 #endif
624     if (td == ntd || ((td->td_flags | ntd->td_flags) & TDF_PREEMPT_LOCK)) {
625         ++preempt_weird;
626         return;
627     }
628     if (ntd->td_preempted) {
629         ++preempt_hit;
630         return;
631     }
632 #ifdef SMP
633     /*
634      * note: an interrupt might have occured just as we were transitioning
635      * to or from the MP lock.  In this case td_mpcount will be pre-disposed
636      * (non-zero) but not actually synchronized with the actual state of the
637      * lock.  We can use it to imply an MP lock requirement for the
638      * preemption but we cannot use it to test whether we hold the MP lock
639      * or not.
640      */
641     savecnt = td->td_mpcount;
642     mpheld = MP_LOCK_HELD();
643     ntd->td_mpcount += td->td_mpcount;
644     if (mpheld == 0 && ntd->td_mpcount && !cpu_try_mplock()) {
645         ntd->td_mpcount -= td->td_mpcount;
646         ++preempt_miss;
647         return;
648     }
649 #endif
650
651     ++preempt_hit;
652     ntd->td_preempted = td;
653     td->td_flags |= TDF_PREEMPT_LOCK;
654     td->td_switch(ntd);
655     KKASSERT(ntd->td_preempted && (td->td_flags & TDF_PREEMPT_DONE));
656 #ifdef SMP
657     KKASSERT(savecnt == td->td_mpcount);
658     mpheld = MP_LOCK_HELD();
659     if (mpheld && td->td_mpcount == 0)
660         cpu_rel_mplock();
661     else if (mpheld == 0 && td->td_mpcount)
662         panic("lwkt_preempt(): MP lock was not held through");
663 #endif
664     ntd->td_preempted = NULL;
665     td->td_flags &= ~(TDF_PREEMPT_LOCK|TDF_PREEMPT_DONE);
666 }
667
668 /*
669  * Yield our thread while higher priority threads are pending.  This is
670  * typically called when we leave a critical section but it can be safely
671  * called while we are in a critical section.
672  *
673  * This function will not generally yield to equal priority threads but it
674  * can occur as a side effect.  Note that lwkt_switch() is called from
675  * inside the critical section to prevent its own crit_exit() from reentering
676  * lwkt_yield_quick().
677  *
678  * gd_reqflags indicates that *something* changed, e.g. an interrupt or softint
679  * came along but was blocked and made pending.
680  *
681  * (self contained on a per cpu basis)
682  */
683 void
684 lwkt_yield_quick(void)
685 {
686     globaldata_t gd = mycpu;
687     thread_t td = gd->gd_curthread;
688
689     /*
690      * gd_reqflags is cleared in splz if the cpl is 0.  If we were to clear
691      * it with a non-zero cpl then we might not wind up calling splz after
692      * a task switch when the critical section is exited even though the
693      * new task could accept the interrupt.
694      *
695      * XXX from crit_exit() only called after last crit section is released.
696      * If called directly will run splz() even if in a critical section.
697      *
698      * td_nest_count prevent deep nesting via splz() or doreti().  Note that
699      * except for this special case, we MUST call splz() here to handle any
700      * pending ints, particularly after we switch, or we might accidently
701      * halt the cpu with interrupts pending.
702      */
703     if (gd->gd_reqflags && td->td_nest_count < 2)
704         splz();
705
706     /*
707      * YYY enabling will cause wakeup() to task-switch, which really
708      * confused the old 4.x code.  This is a good way to simulate
709      * preemption and MP without actually doing preemption or MP, because a
710      * lot of code assumes that wakeup() does not block.
711      */
712     if (untimely_switch && td->td_nest_count == 0 &&
713         gd->gd_intr_nesting_level == 0
714     ) {
715         crit_enter();
716         /*
717          * YYY temporary hacks until we disassociate the userland scheduler
718          * from the LWKT scheduler.
719          */
720         if (td->td_flags & TDF_RUNQ) {
721             lwkt_switch();              /* will not reenter yield function */
722         } else {
723             lwkt_schedule_self();       /* make sure we are scheduled */
724             lwkt_switch();              /* will not reenter yield function */
725             lwkt_deschedule_self();     /* make sure we are descheduled */
726         }
727         crit_exit_noyield(td);
728     }
729 }
730
731 /*
732  * This implements a normal yield which, unlike _quick, will yield to equal
733  * priority threads as well.  Note that gd_reqflags tests will be handled by
734  * the crit_exit() call in lwkt_switch().
735  *
736  * (self contained on a per cpu basis)
737  */
738 void
739 lwkt_yield(void)
740 {
741     lwkt_schedule_self();
742     lwkt_switch();
743 }
744
745 /*
746  * Schedule a thread to run.  As the current thread we can always safely
747  * schedule ourselves, and a shortcut procedure is provided for that
748  * function.
749  *
750  * (non-blocking, self contained on a per cpu basis)
751  */
752 void
753 lwkt_schedule_self(void)
754 {
755     thread_t td = curthread;
756
757     crit_enter();
758     KASSERT(td->td_wait == NULL, ("lwkt_schedule_self(): td_wait not NULL!"));
759     _lwkt_enqueue(td);
760 #ifdef _KERNEL
761     if (td->td_proc && td->td_proc->p_stat == SSLEEP)
762         panic("SCHED SELF PANIC");
763 #endif
764     crit_exit();
765 }
766
767 /*
768  * Generic schedule.  Possibly schedule threads belonging to other cpus and
769  * deal with threads that might be blocked on a wait queue.
770  *
771  * YYY this is one of the best places to implement load balancing code.
772  * Load balancing can be accomplished by requesting other sorts of actions
773  * for the thread in question.
774  */
775 void
776 lwkt_schedule(thread_t td)
777 {
778 #ifdef  INVARIANTS
779     if ((td->td_flags & TDF_PREEMPT_LOCK) == 0 && td->td_proc 
780         && td->td_proc->p_stat == SSLEEP
781     ) {
782         printf("PANIC schedule curtd = %p (%d %d) target %p (%d %d)\n",
783             curthread,
784             curthread->td_proc ? curthread->td_proc->p_pid : -1,
785             curthread->td_proc ? curthread->td_proc->p_stat : -1,
786             td,
787             td->td_proc ? curthread->td_proc->p_pid : -1,
788             td->td_proc ? curthread->td_proc->p_stat : -1
789         );
790         panic("SCHED PANIC");
791     }
792 #endif
793     crit_enter();
794     if (td == curthread) {
795         _lwkt_enqueue(td);
796     } else {
797         lwkt_wait_t w;
798
799         /*
800          * If the thread is on a wait list we have to send our scheduling
801          * request to the owner of the wait structure.  Otherwise we send
802          * the scheduling request to the cpu owning the thread.  Races
803          * are ok, the target will forward the message as necessary (the
804          * message may chase the thread around before it finally gets
805          * acted upon).
806          *
807          * (remember, wait structures use stable storage)
808          */
809         if ((w = td->td_wait) != NULL) {
810             if (lwkt_trytoken(&w->wa_token)) {
811                 TAILQ_REMOVE(&w->wa_waitq, td, td_threadq);
812                 --w->wa_count;
813                 td->td_wait = NULL;
814 #ifdef SMP
815                 if (td->td_gd == mycpu) {
816                     _lwkt_enqueue(td);
817                     if (td->td_preemptable)
818                         td->td_preemptable(td, TDPRI_CRIT*2); /* YYY +token */
819                     else if (_lwkt_wantresched(td, curthread))
820                         need_resched();
821                 } else {
822                     lwkt_send_ipiq(td->td_gd, (ipifunc_t)lwkt_schedule, td);
823                 }
824 #else
825                 _lwkt_enqueue(td);
826                 if (td->td_preemptable)
827                     td->td_preemptable(td, TDPRI_CRIT*2); /* YYY +token */
828                 else if (_lwkt_wantresched(td, curthread))
829                     need_resched();
830 #endif
831                 lwkt_reltoken(&w->wa_token);
832             } else {
833                 lwkt_send_ipiq(w->wa_token.t_cpu, (ipifunc_t)lwkt_schedule, td);
834             }
835         } else {
836             /*
837              * If the wait structure is NULL and we own the thread, there
838              * is no race (since we are in a critical section).  If we
839              * do not own the thread there might be a race but the
840              * target cpu will deal with it.
841              */
842 #ifdef SMP
843             if (td->td_gd == mycpu) {
844                 _lwkt_enqueue(td);
845                 if (td->td_preemptable) {
846                     td->td_preemptable(td, TDPRI_CRIT);
847                 } else if (_lwkt_wantresched(td, curthread)) {
848                     need_resched();
849                 }
850             } else {
851                 lwkt_send_ipiq(td->td_gd, (ipifunc_t)lwkt_schedule, td);
852             }
853 #else
854             _lwkt_enqueue(td);
855             if (td->td_preemptable) {
856                 td->td_preemptable(td, TDPRI_CRIT);
857             } else if (_lwkt_wantresched(td, curthread)) {
858                 need_resched();
859             }
860 #endif
861         }
862     }
863     crit_exit();
864 }
865
866 /*
867  * Managed acquisition.  This code assumes that the MP lock is held for
868  * the tdallq operation and that the thread has been descheduled from its
869  * original cpu.  We also have to wait for the thread to be entirely switched
870  * out on its original cpu (this is usually fast enough that we never loop)
871  * since the LWKT system does not have to hold the MP lock while switching
872  * and the target may have released it before switching.
873  */
874 void
875 lwkt_acquire(thread_t td)
876 {
877     struct globaldata *gd;
878
879     gd = td->td_gd;
880     KKASSERT((td->td_flags & TDF_RUNQ) == 0);
881     while (td->td_flags & TDF_RUNNING)  /* XXX spin */
882         ;
883     if (gd != mycpu) {
884         crit_enter();
885         TAILQ_REMOVE(&gd->gd_tdallq, td, td_allq);      /* protected by BGL */
886         gd = mycpu;
887         td->td_gd = gd;
888         TAILQ_INSERT_TAIL(&gd->gd_tdallq, td, td_allq); /* protected by BGL */
889         crit_exit();
890     }
891 }
892
893 /*
894  * Deschedule a thread.
895  *
896  * (non-blocking, self contained on a per cpu basis)
897  */
898 void
899 lwkt_deschedule_self(void)
900 {
901     thread_t td = curthread;
902
903     crit_enter();
904     KASSERT(td->td_wait == NULL, ("lwkt_schedule_self(): td_wait not NULL!"));
905     _lwkt_dequeue(td);
906     crit_exit();
907 }
908
909 /*
910  * Generic deschedule.  Descheduling threads other then your own should be
911  * done only in carefully controlled circumstances.  Descheduling is 
912  * asynchronous.  
913  *
914  * This function may block if the cpu has run out of messages.
915  */
916 void
917 lwkt_deschedule(thread_t td)
918 {
919     crit_enter();
920     if (td == curthread) {
921         _lwkt_dequeue(td);
922     } else {
923         if (td->td_gd == mycpu) {
924             _lwkt_dequeue(td);
925         } else {
926             lwkt_send_ipiq(td->td_gd, (ipifunc_t)lwkt_deschedule, td);
927         }
928     }
929     crit_exit();
930 }
931
932 /*
933  * Set the target thread's priority.  This routine does not automatically
934  * switch to a higher priority thread, LWKT threads are not designed for
935  * continuous priority changes.  Yield if you want to switch.
936  *
937  * We have to retain the critical section count which uses the high bits
938  * of the td_pri field.  The specified priority may also indicate zero or
939  * more critical sections by adding TDPRI_CRIT*N.
940  */
941 void
942 lwkt_setpri(thread_t td, int pri)
943 {
944     KKASSERT(pri >= 0);
945     KKASSERT(td->td_gd == mycpu);
946     crit_enter();
947     if (td->td_flags & TDF_RUNQ) {
948         _lwkt_dequeue(td);
949         td->td_pri = (td->td_pri & ~TDPRI_MASK) + pri;
950         _lwkt_enqueue(td);
951     } else {
952         td->td_pri = (td->td_pri & ~TDPRI_MASK) + pri;
953     }
954     crit_exit();
955 }
956
957 void
958 lwkt_setpri_self(int pri)
959 {
960     thread_t td = curthread;
961
962     KKASSERT(pri >= 0 && pri <= TDPRI_MAX);
963     crit_enter();
964     if (td->td_flags & TDF_RUNQ) {
965         _lwkt_dequeue(td);
966         td->td_pri = (td->td_pri & ~TDPRI_MASK) + pri;
967         _lwkt_enqueue(td);
968     } else {
969         td->td_pri = (td->td_pri & ~TDPRI_MASK) + pri;
970     }
971     crit_exit();
972 }
973
974 struct proc *
975 lwkt_preempted_proc(void)
976 {
977     thread_t td = curthread;
978     while (td->td_preempted)
979         td = td->td_preempted;
980     return(td->td_proc);
981 }
982
983 #if 0
984
985 /*
986  * This function deschedules the current thread and blocks on the specified
987  * wait queue.  We obtain ownership of the wait queue in order to block
988  * on it.  A generation number is used to interlock the wait queue in case
989  * it gets signalled while we are blocked waiting on the token.
990  *
991  * Note: alternatively we could dequeue our thread and then message the
992  * target cpu owning the wait queue.  YYY implement as sysctl.
993  *
994  * Note: wait queue signals normally ping-pong the cpu as an optimization.
995  */
996
997 void
998 lwkt_block(lwkt_wait_t w, const char *wmesg, int *gen)
999 {
1000     thread_t td = curthread;
1001
1002     lwkt_gettoken(&w->wa_token);
1003     if (w->wa_gen == *gen) {
1004         _lwkt_dequeue(td);
1005         TAILQ_INSERT_TAIL(&w->wa_waitq, td, td_threadq);
1006         ++w->wa_count;
1007         td->td_wait = w;
1008         td->td_wmesg = wmesg;
1009 again:
1010         lwkt_switch();
1011         lwkt_regettoken(&w->wa_token);
1012         if (td->td_wmesg != NULL) {
1013             _lwkt_dequeue(td);
1014             goto again;
1015         }
1016     }
1017     /* token might be lost, doesn't matter for gen update */
1018     *gen = w->wa_gen;
1019     lwkt_reltoken(&w->wa_token);
1020 }
1021
1022 /*
1023  * Signal a wait queue.  We gain ownership of the wait queue in order to
1024  * signal it.  Once a thread is removed from the wait queue we have to
1025  * deal with the cpu owning the thread.
1026  *
1027  * Note: alternatively we could message the target cpu owning the wait
1028  * queue.  YYY implement as sysctl.
1029  */
1030 void
1031 lwkt_signal(lwkt_wait_t w, int count)
1032 {
1033     thread_t td;
1034     int count;
1035
1036     lwkt_gettoken(&w->wa_token);
1037     ++w->wa_gen;
1038     if (count < 0)
1039         count = w->wa_count;
1040     while ((td = TAILQ_FIRST(&w->wa_waitq)) != NULL && count) {
1041         --count;
1042         --w->wa_count;
1043         TAILQ_REMOVE(&w->wa_waitq, td, td_threadq);
1044         td->td_wait = NULL;
1045         td->td_wmesg = NULL;
1046         if (td->td_gd == mycpu) {
1047             _lwkt_enqueue(td);
1048         } else {
1049             lwkt_send_ipiq(td->td_gd, (ipifunc_t)lwkt_schedule, td);
1050         }
1051         lwkt_regettoken(&w->wa_token);
1052     }
1053     lwkt_reltoken(&w->wa_token);
1054 }
1055
1056 #endif
1057
1058 /*
1059  * Create a kernel process/thread/whatever.  It shares it's address space
1060  * with proc0 - ie: kernel only.
1061  *
1062  * NOTE!  By default new threads are created with the MP lock held.  A 
1063  * thread which does not require the MP lock should release it by calling
1064  * rel_mplock() at the start of the new thread.
1065  */
1066 int
1067 lwkt_create(void (*func)(void *), void *arg,
1068     struct thread **tdp, thread_t template, int tdflags, int cpu,
1069     const char *fmt, ...)
1070 {
1071     thread_t td;
1072     __va_list ap;
1073
1074     td = lwkt_alloc_thread(template, cpu);
1075     if (tdp)
1076         *tdp = td;
1077     cpu_set_thread_handler(td, lwkt_exit, func, arg);
1078     td->td_flags |= TDF_VERBOSE | tdflags;
1079 #ifdef SMP
1080     td->td_mpcount = 1;
1081 #endif
1082
1083     /*
1084      * Set up arg0 for 'ps' etc
1085      */
1086     __va_start(ap, fmt);
1087     vsnprintf(td->td_comm, sizeof(td->td_comm), fmt, ap);
1088     __va_end(ap);
1089
1090     /*
1091      * Schedule the thread to run
1092      */
1093     if ((td->td_flags & TDF_STOPREQ) == 0)
1094         lwkt_schedule(td);
1095     else
1096         td->td_flags &= ~TDF_STOPREQ;
1097     return 0;
1098 }
1099
1100 /*
1101  * kthread_* is specific to the kernel and is not needed by userland.
1102  */
1103 #ifdef _KERNEL
1104
1105 /*
1106  * Destroy an LWKT thread.   Warning!  This function is not called when
1107  * a process exits, cpu_proc_exit() directly calls cpu_thread_exit() and
1108  * uses a different reaping mechanism.
1109  */
1110 void
1111 lwkt_exit(void)
1112 {
1113     thread_t td = curthread;
1114
1115     if (td->td_flags & TDF_VERBOSE)
1116         printf("kthread %p %s has exited\n", td, td->td_comm);
1117     caps_exit(td);
1118     crit_enter();
1119     lwkt_deschedule_self();
1120     ++mycpu->gd_tdfreecount;
1121     TAILQ_INSERT_TAIL(&mycpu->gd_tdfreeq, td, td_threadq);
1122     cpu_thread_exit();
1123 }
1124
1125 /*
1126  * Create a kernel process/thread/whatever.  It shares it's address space
1127  * with proc0 - ie: kernel only.  5.x compatible.
1128  *
1129  * NOTE!  By default kthreads are created with the MP lock held.  A
1130  * thread which does not require the MP lock should release it by calling
1131  * rel_mplock() at the start of the new thread.
1132  */
1133 int
1134 kthread_create(void (*func)(void *), void *arg,
1135     struct thread **tdp, const char *fmt, ...)
1136 {
1137     thread_t td;
1138     __va_list ap;
1139
1140     td = lwkt_alloc_thread(NULL, -1);
1141     if (tdp)
1142         *tdp = td;
1143     cpu_set_thread_handler(td, kthread_exit, func, arg);
1144     td->td_flags |= TDF_VERBOSE;
1145 #ifdef SMP
1146     td->td_mpcount = 1;
1147 #endif
1148
1149     /*
1150      * Set up arg0 for 'ps' etc
1151      */
1152     __va_start(ap, fmt);
1153     vsnprintf(td->td_comm, sizeof(td->td_comm), fmt, ap);
1154     __va_end(ap);
1155
1156     /*
1157      * Schedule the thread to run
1158      */
1159     lwkt_schedule(td);
1160     return 0;
1161 }
1162
1163 /*
1164  * Destroy an LWKT thread.   Warning!  This function is not called when
1165  * a process exits, cpu_proc_exit() directly calls cpu_thread_exit() and
1166  * uses a different reaping mechanism.
1167  *
1168  * XXX duplicates lwkt_exit()
1169  */
1170 void
1171 kthread_exit(void)
1172 {
1173     lwkt_exit();
1174 }
1175
1176 #endif /* _KERNEL */
1177
1178 void
1179 crit_panic(void)
1180 {
1181     thread_t td = curthread;
1182     int lpri = td->td_pri;
1183
1184     td->td_pri = 0;
1185     panic("td_pri is/would-go negative! %p %d", td, lpri);
1186 }
1187