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