2 * Copyright (c) 2012 The DragonFly Project. All rights reserved.
3 * Copyright (c) 1999 Peter Wemm <peter@FreeBSD.org>. All rights reserved.
5 * This code is derived from software contributed to The DragonFly Project
6 * by Matthew Dillon <dillon@backplane.com>,
7 * by Mihai Carabas <mihai.carabas@gmail.com>
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in the
17 * documentation and/or other materials provided with the distribution.
19 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
23 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32 #include <sys/param.h>
33 #include <sys/systm.h>
34 #include <sys/kernel.h>
36 #include <sys/queue.h>
38 #include <sys/rtprio.h>
40 #include <sys/sysctl.h>
41 #include <sys/resourcevar.h>
42 #include <sys/spinlock.h>
43 #include <sys/cpu_topology.h>
44 #include <sys/thread2.h>
45 #include <sys/spinlock2.h>
46 #include <sys/mplock2.h>
50 #include <machine/cpu.h>
51 #include <machine/smp.h>
54 * Priorities. Note that with 32 run queues per scheduler each queue
55 * represents four priority levels.
59 #define PRIMASK (MAXPRI - 1)
60 #define PRIBASE_REALTIME 0
61 #define PRIBASE_NORMAL MAXPRI
62 #define PRIBASE_IDLE (MAXPRI * 2)
63 #define PRIBASE_THREAD (MAXPRI * 3)
64 #define PRIBASE_NULL (MAXPRI * 4)
66 #define NQS 32 /* 32 run queues. */
67 #define PPQ (MAXPRI / NQS) /* priorities per queue */
68 #define PPQMASK (PPQ - 1)
71 * NICEPPQ - number of nice units per priority queue
73 * ESTCPUPPQ - number of estcpu units per priority queue
74 * ESTCPUMAX - number of estcpu units
78 #define ESTCPUMAX (ESTCPUPPQ * NQS)
79 #define BATCHMAX (ESTCPUFREQ * 30)
80 #define PRIO_RANGE (PRIO_MAX - PRIO_MIN + 1)
82 #define ESTCPULIM(v) min((v), ESTCPUMAX)
86 #define lwp_priority lwp_usdata.bsd4.priority
87 #define lwp_rqindex lwp_usdata.bsd4.rqindex
88 #define lwp_estcpu lwp_usdata.bsd4.estcpu
89 #define lwp_batch lwp_usdata.bsd4.batch
90 #define lwp_rqtype lwp_usdata.bsd4.rqtype
92 static void bsd4_acquire_curproc(struct lwp
*lp
);
93 static void bsd4_release_curproc(struct lwp
*lp
);
94 static void bsd4_select_curproc(globaldata_t gd
);
95 static void bsd4_setrunqueue(struct lwp
*lp
);
96 static void bsd4_schedulerclock(struct lwp
*lp
, sysclock_t period
,
98 static void bsd4_recalculate_estcpu(struct lwp
*lp
);
99 static void bsd4_resetpriority(struct lwp
*lp
);
100 static void bsd4_forking(struct lwp
*plp
, struct lwp
*lp
);
101 static void bsd4_exiting(struct lwp
*lp
, struct proc
*);
102 static void bsd4_uload_update(struct lwp
*lp
);
103 static void bsd4_yield(struct lwp
*lp
);
104 static void bsd4_need_user_resched_remote(void *dummy
);
105 static int bsd4_batchy_looser_pri_test(struct lwp
* lp
);
106 static struct lwp
*bsd4_chooseproc_locked_cache_coherent(struct lwp
*chklp
);
107 static void bsd4_kick_helper(struct lwp
*lp
);
108 static struct lwp
*bsd4_chooseproc_locked(struct lwp
*chklp
);
109 static void bsd4_remrunqueue_locked(struct lwp
*lp
);
110 static void bsd4_setrunqueue_locked(struct lwp
*lp
);
112 struct usched usched_bsd4
= {
114 "bsd4", "Original DragonFly Scheduler",
115 NULL
, /* default registration */
116 NULL
, /* default deregistration */
117 bsd4_acquire_curproc
,
118 bsd4_release_curproc
,
121 bsd4_recalculate_estcpu
,
126 NULL
, /* setcpumask not supported */
130 struct usched_bsd4_pcpu
{
131 struct thread helper_thread
;
134 struct lwp
*uschedcp
;
135 struct lwp
*old_uschedcp
;
139 typedef struct usched_bsd4_pcpu
*bsd4_pcpu_t
;
142 * We have NQS (32) run queues per scheduling class. For the normal
143 * class, there are 128 priorities scaled onto these 32 queues. New
144 * processes are added to the last entry in each queue, and processes
145 * are selected for running by taking them from the head and maintaining
146 * a simple FIFO arrangement. Realtime and Idle priority processes have
147 * and explicit 0-31 priority which maps directly onto their class queue
148 * index. When a queue has something in it, the corresponding bit is
149 * set in the queuebits variable, allowing a single read to determine
150 * the state of all 32 queues and then a ffs() to find the first busy
153 static struct rq bsd4_queues
[NQS
];
154 static struct rq bsd4_rtqueues
[NQS
];
155 static struct rq bsd4_idqueues
[NQS
];
156 static u_int32_t bsd4_queuebits
;
157 static u_int32_t bsd4_rtqueuebits
;
158 static u_int32_t bsd4_idqueuebits
;
159 static cpumask_t bsd4_curprocmask
= -1; /* currently running a user process */
160 static cpumask_t bsd4_rdyprocmask
; /* ready to accept a user process */
161 static int bsd4_runqcount
;
162 static volatile int bsd4_scancpu
;
163 static struct spinlock bsd4_spin
;
164 static struct usched_bsd4_pcpu bsd4_pcpu
[MAXCPU
];
165 static struct sysctl_ctx_list usched_bsd4_sysctl_ctx
;
166 static struct sysctl_oid
*usched_bsd4_sysctl_tree
;
168 /* Debug info exposed through debug.* sysctl */
170 SYSCTL_INT(_debug
, OID_AUTO
, bsd4_runqcount
, CTLFLAG_RD
,
172 "Number of run queues");
174 static int usched_bsd4_debug
= -1;
175 SYSCTL_INT(_debug
, OID_AUTO
, bsd4_scdebug
, CTLFLAG_RW
,
176 &usched_bsd4_debug
, 0,
177 "Print debug information for this pid");
179 static int usched_bsd4_pid_debug
= -1;
180 SYSCTL_INT(_debug
, OID_AUTO
, bsd4_pid_debug
, CTLFLAG_RW
,
181 &usched_bsd4_pid_debug
, 0,
182 "Print KTR debug information for this pid");
184 /* Tunning usched_bsd4 - configurable through kern.usched_bsd4.* */
185 static int usched_bsd4_smt
= 0;
186 static int usched_bsd4_cache_coherent
= 0;
187 static int usched_bsd4_upri_affinity
= 16; /* 32 queues - half-way */
188 static int usched_bsd4_queue_checks
= 5;
189 static int usched_bsd4_stick_to_level
= 0;
190 static long usched_bsd4_kicks
;
191 static int usched_bsd4_rrinterval
= (ESTCPUFREQ
+ 9) / 10;
192 static int usched_bsd4_decay
= 8;
193 static int usched_bsd4_batch_time
= 10;
195 /* KTR debug printings */
197 KTR_INFO_MASTER_EXTERN(usched
);
199 #if !defined(KTR_USCHED_BSD4)
200 #define KTR_USCHED_BSD4 KTR_ALL
203 KTR_INFO(KTR_USCHED_BSD4
, usched
, bsd4_acquire_curproc_urw
, 0,
204 "USCHED_BSD4(bsd4_acquire_curproc in user_reseched_wanted "
205 "after release: pid %d, cpuid %d, curr_cpuid %d)",
206 pid_t pid
, int cpuid
, int curr
);
207 KTR_INFO(KTR_USCHED_BSD4
, usched
, bsd4_acquire_curproc_before_loop
, 0,
208 "USCHED_BSD4(bsd4_acquire_curproc before loop: pid %d, cpuid %d, "
210 pid_t pid
, int cpuid
, int curr
);
211 KTR_INFO(KTR_USCHED_BSD4
, usched
, bsd4_acquire_curproc_not
, 0,
212 "USCHED_BSD4(bsd4_acquire_curproc couldn't acquire after "
213 "bsd4_setrunqueue: pid %d, cpuid %d, curr_lp pid %d, curr_cpuid %d)",
214 pid_t pid
, int cpuid
, pid_t curr_pid
, int curr_cpuid
);
215 KTR_INFO(KTR_USCHED_BSD4
, usched
, bsd4_acquire_curproc_switch
, 0,
216 "USCHED_BSD4(bsd4_acquire_curproc after lwkt_switch: pid %d, "
217 "cpuid %d, curr_cpuid %d)",
218 pid_t pid
, int cpuid
, int curr
);
220 KTR_INFO(KTR_USCHED_BSD4
, usched
, bsd4_release_curproc
, 0,
221 "USCHED_BSD4(bsd4_release_curproc before select: pid %d, "
222 "cpuid %d, curr_cpuid %d)",
223 pid_t pid
, int cpuid
, int curr
);
225 KTR_INFO(KTR_USCHED_BSD4
, usched
, bsd4_select_curproc
, 0,
226 "USCHED_BSD4(bsd4_release_curproc before select: pid %d, "
227 "cpuid %d, old_pid %d, old_cpuid %d, curr_cpuid %d)",
228 pid_t pid
, int cpuid
, pid_t old_pid
, int old_cpuid
, int curr
);
230 KTR_INFO(KTR_USCHED_BSD4
, usched
, batchy_test_false
, 0,
231 "USCHED_BSD4(batchy_looser_pri_test false: pid %d, "
232 "cpuid %d, verify_mask %lu)",
233 pid_t pid
, int cpuid
, cpumask_t mask
);
234 KTR_INFO(KTR_USCHED_BSD4
, usched
, batchy_test_true
, 0,
235 "USCHED_BSD4(batchy_looser_pri_test true: pid %d, "
236 "cpuid %d, verify_mask %lu)",
237 pid_t pid
, int cpuid
, cpumask_t mask
);
239 KTR_INFO(KTR_USCHED_BSD4
, usched
, bsd4_setrunqueue_fc_smt
, 0,
240 "USCHED_BSD4(bsd4_setrunqueue free cpus smt: pid %d, cpuid %d, "
241 "mask %lu, curr_cpuid %d)",
242 pid_t pid
, int cpuid
, cpumask_t mask
, int curr
);
243 KTR_INFO(KTR_USCHED_BSD4
, usched
, bsd4_setrunqueue_fc_non_smt
, 0,
244 "USCHED_BSD4(bsd4_setrunqueue free cpus check non_smt: pid %d, "
245 "cpuid %d, mask %lu, curr_cpuid %d)",
246 pid_t pid
, int cpuid
, cpumask_t mask
, int curr
);
247 KTR_INFO(KTR_USCHED_BSD4
, usched
, bsd4_setrunqueue_rc
, 0,
248 "USCHED_BSD4(bsd4_setrunqueue running cpus check: pid %d, "
249 "cpuid %d, mask %lu, curr_cpuid %d)",
250 pid_t pid
, int cpuid
, cpumask_t mask
, int curr
);
251 KTR_INFO(KTR_USCHED_BSD4
, usched
, bsd4_setrunqueue_found
, 0,
252 "USCHED_BSD4(bsd4_setrunqueue found cpu: pid %d, cpuid %d, "
253 "mask %lu, found_cpuid %d, curr_cpuid %d)",
254 pid_t pid
, int cpuid
, cpumask_t mask
, int found_cpuid
, int curr
);
255 KTR_INFO(KTR_USCHED_BSD4
, usched
, bsd4_setrunqueue_not_found
, 0,
256 "USCHED_BSD4(bsd4_setrunqueue not found cpu: pid %d, cpuid %d, "
257 "try_cpuid %d, curr_cpuid %d)",
258 pid_t pid
, int cpuid
, int try_cpuid
, int curr
);
259 KTR_INFO(KTR_USCHED_BSD4
, usched
, bsd4_setrunqueue_found_best_cpuid
, 0,
260 "USCHED_BSD4(bsd4_setrunqueue found cpu: pid %d, cpuid %d, "
261 "mask %lu, found_cpuid %d, curr_cpuid %d)",
262 pid_t pid
, int cpuid
, cpumask_t mask
, int found_cpuid
, int curr
);
264 KTR_INFO(KTR_USCHED_BSD4
, usched
, chooseproc
, 0,
265 "USCHED_BSD4(chooseproc: pid %d, old_cpuid %d, curr_cpuid %d)",
266 pid_t pid
, int old_cpuid
, int curr
);
267 KTR_INFO(KTR_USCHED_BSD4
, usched
, chooseproc_cc
, 0,
268 "USCHED_BSD4(chooseproc_cc: pid %d, old_cpuid %d, curr_cpuid %d)",
269 pid_t pid
, int old_cpuid
, int curr
);
270 KTR_INFO(KTR_USCHED_BSD4
, usched
, chooseproc_cc_not_good
, 0,
271 "USCHED_BSD4(chooseproc_cc not good: pid %d, old_cpumask %lu, "
272 "sibling_mask %lu, curr_cpumask %lu)",
273 pid_t pid
, cpumask_t old_cpumask
, cpumask_t sibling_mask
, cpumask_t curr
);
274 KTR_INFO(KTR_USCHED_BSD4
, usched
, chooseproc_cc_elected
, 0,
275 "USCHED_BSD4(chooseproc_cc elected: pid %d, old_cpumask %lu, "
276 "sibling_mask %lu, curr_cpumask: %lu)",
277 pid_t pid
, cpumask_t old_cpumask
, cpumask_t sibling_mask
, cpumask_t curr
);
279 KTR_INFO(KTR_USCHED_BSD4
, usched
, sched_thread_no_process
, 0,
280 "USCHED_BSD4(sched_thread %d no process scheduled: pid %d, old_cpuid %d)",
281 int id
, pid_t pid
, int cpuid
);
282 KTR_INFO(KTR_USCHED_BSD4
, usched
, sched_thread_process
, 0,
283 "USCHED_BSD4(sched_thread %d process scheduled: pid %d, old_cpuid %d)",
284 int id
, pid_t pid
, int cpuid
);
285 KTR_INFO(KTR_USCHED_BSD4
, usched
, sched_thread_no_process_found
, 0,
286 "USCHED_BSD4(sched_thread %d no process found; tmpmask %lu)",
287 int id
, cpumask_t tmpmask
);
290 * Initialize the run queues at boot time.
293 bsd4_rqinit(void *dummy
)
297 spin_init(&bsd4_spin
);
298 for (i
= 0; i
< NQS
; i
++) {
299 TAILQ_INIT(&bsd4_queues
[i
]);
300 TAILQ_INIT(&bsd4_rtqueues
[i
]);
301 TAILQ_INIT(&bsd4_idqueues
[i
]);
303 atomic_clear_cpumask(&bsd4_curprocmask
, 1);
305 SYSINIT(runqueue
, SI_BOOT2_USCHED
, SI_ORDER_FIRST
, bsd4_rqinit
, NULL
)
308 * BSD4_ACQUIRE_CURPROC
310 * This function is called when the kernel intends to return to userland.
311 * It is responsible for making the thread the current designated userland
312 * thread for this cpu, blocking if necessary.
314 * The kernel will not depress our LWKT priority until after we return,
315 * in case we have to shove over to another cpu.
317 * We must determine our thread's disposition before we switch away. This
318 * is very sensitive code.
320 * WARNING! THIS FUNCTION IS ALLOWED TO CAUSE THE CURRENT THREAD TO MIGRATE
321 * TO ANOTHER CPU! Because most of the kernel assumes that no migration will
322 * occur, this function is called only under very controlled circumstances.
327 bsd4_acquire_curproc(struct lwp
*lp
)
337 * Make sure we aren't sitting on a tsleep queue.
340 crit_enter_quick(td
);
341 if (td
->td_flags
& TDF_TSLEEPQ
)
343 bsd4_recalculate_estcpu(lp
);
346 * If a reschedule was requested give another thread the
349 if (user_resched_wanted()) {
350 clear_user_resched();
351 bsd4_release_curproc(lp
);
353 KTR_COND_LOG(usched_bsd4_acquire_curproc_urw
,
354 lp
->lwp_proc
->p_pid
== usched_bsd4_pid_debug
,
356 lp
->lwp_thread
->td_gd
->gd_cpuid
,
361 * Loop until we are the current user thread
364 dd
= &bsd4_pcpu
[gd
->gd_cpuid
];
366 KTR_COND_LOG(usched_bsd4_acquire_curproc_before_loop
,
367 lp
->lwp_proc
->p_pid
== usched_bsd4_pid_debug
,
369 lp
->lwp_thread
->td_gd
->gd_cpuid
,
374 * Process any pending events and higher priority threads.
379 * Become the currently scheduled user thread for this cpu
380 * if we can do so trivially.
382 * We can steal another thread's current thread designation
383 * on this cpu since if we are running that other thread
384 * must not be, so we can safely deschedule it.
386 if (dd
->uschedcp
== lp
) {
388 * We are already the current lwp (hot path).
390 dd
->upri
= lp
->lwp_priority
;
391 } else if (dd
->uschedcp
== NULL
) {
393 * We can trivially become the current lwp.
395 atomic_set_cpumask(&bsd4_curprocmask
, gd
->gd_cpumask
);
397 dd
->upri
= lp
->lwp_priority
;
398 } else if (dd
->upri
> lp
->lwp_priority
) {
400 * We can steal the current cpu's lwp designation
401 * away simply by replacing it. The other thread
402 * will stall when it tries to return to userland.
405 dd
->upri
= lp
->lwp_priority
;
407 lwkt_deschedule(olp->lwp_thread);
408 bsd4_setrunqueue(olp);
412 * We cannot become the current lwp, place the lp
413 * on the bsd4 run-queue and deschedule ourselves.
415 * When we are reactivated we will have another
418 lwkt_deschedule(lp
->lwp_thread
);
420 bsd4_setrunqueue(lp
);
422 KTR_COND_LOG(usched_bsd4_acquire_curproc_not
,
423 lp
->lwp_proc
->p_pid
== usched_bsd4_pid_debug
,
425 lp
->lwp_thread
->td_gd
->gd_cpuid
,
426 dd
->uschedcp
->lwp_proc
->p_pid
,
433 * Reload after a switch or setrunqueue/switch possibly
434 * moved us to another cpu.
437 dd
= &bsd4_pcpu
[gd
->gd_cpuid
];
439 KTR_COND_LOG(usched_bsd4_acquire_curproc_switch
,
440 lp
->lwp_proc
->p_pid
== usched_bsd4_pid_debug
,
442 lp
->lwp_thread
->td_gd
->gd_cpuid
,
445 } while (dd
->uschedcp
!= lp
);
448 KKASSERT((lp
->lwp_mpflags
& LWP_MP_ONRUNQ
) == 0);
452 * BSD4_RELEASE_CURPROC
454 * This routine detaches the current thread from the userland scheduler,
455 * usually because the thread needs to run or block in the kernel (at
456 * kernel priority) for a while.
458 * This routine is also responsible for selecting a new thread to
459 * make the current thread.
461 * NOTE: This implementation differs from the dummy example in that
462 * bsd4_select_curproc() is able to select the current process, whereas
463 * dummy_select_curproc() is not able to select the current process.
464 * This means we have to NULL out uschedcp.
466 * Additionally, note that we may already be on a run queue if releasing
467 * via the lwkt_switch() in bsd4_setrunqueue().
473 bsd4_release_curproc(struct lwp
*lp
)
475 globaldata_t gd
= mycpu
;
476 bsd4_pcpu_t dd
= &bsd4_pcpu
[gd
->gd_cpuid
];
478 if (dd
->uschedcp
== lp
) {
480 KKASSERT((lp
->lwp_mpflags
& LWP_MP_ONRUNQ
) == 0);
482 KTR_COND_LOG(usched_bsd4_release_curproc
,
483 lp
->lwp_proc
->p_pid
== usched_bsd4_pid_debug
,
485 lp
->lwp_thread
->td_gd
->gd_cpuid
,
488 dd
->uschedcp
= NULL
; /* don't let lp be selected */
489 dd
->upri
= PRIBASE_NULL
;
490 atomic_clear_cpumask(&bsd4_curprocmask
, gd
->gd_cpumask
);
491 dd
->old_uschedcp
= lp
; /* used only for KTR debug prints */
492 bsd4_select_curproc(gd
);
498 * BSD4_SELECT_CURPROC
500 * Select a new current process for this cpu and clear any pending user
501 * reschedule request. The cpu currently has no current process.
503 * This routine is also responsible for equal-priority round-robining,
504 * typically triggered from bsd4_schedulerclock(). In our dummy example
505 * all the 'user' threads are LWKT scheduled all at once and we just
506 * call lwkt_switch().
508 * The calling process is not on the queue and cannot be selected.
514 bsd4_select_curproc(globaldata_t gd
)
516 bsd4_pcpu_t dd
= &bsd4_pcpu
[gd
->gd_cpuid
];
518 int cpuid
= gd
->gd_cpuid
;
522 spin_lock(&bsd4_spin
);
523 if(usched_bsd4_cache_coherent
)
524 nlp
= bsd4_chooseproc_locked_cache_coherent(dd
->uschedcp
);
526 nlp
= bsd4_chooseproc_locked(dd
->uschedcp
);
530 KTR_COND_LOG(usched_bsd4_select_curproc
,
531 nlp
->lwp_proc
->p_pid
== usched_bsd4_pid_debug
,
532 nlp
->lwp_proc
->p_pid
,
533 nlp
->lwp_thread
->td_gd
->gd_cpuid
,
534 dd
->old_uschedcp
->lwp_proc
->p_pid
,
535 dd
->old_uschedcp
->lwp_thread
->td_gd
->gd_cpuid
,
538 atomic_set_cpumask(&bsd4_curprocmask
, CPUMASK(cpuid
));
539 dd
->upri
= nlp
->lwp_priority
;
541 dd
->rrcount
= 0; /* reset round robin */
542 spin_unlock(&bsd4_spin
);
543 lwkt_acquire(nlp
->lwp_thread
);
544 lwkt_schedule(nlp
->lwp_thread
);
546 spin_unlock(&bsd4_spin
);
550 } else if (bsd4_runqcount
&& (bsd4_rdyprocmask
& CPUMASK(cpuid
))) {
551 atomic_clear_cpumask(&bsd4_rdyprocmask
, CPUMASK(cpuid
));
552 spin_unlock(&bsd4_spin
);
553 lwkt_schedule(&dd
->helper_thread
);
555 spin_unlock(&bsd4_spin
);
562 * batchy_looser_pri_test() - determine if a process is batchy or not
563 * relative to the other processes running in the system
566 bsd4_batchy_looser_pri_test(struct lwp
* lp
)
569 bsd4_pcpu_t other_dd
;
572 /* Current running processes */
573 mask
= bsd4_curprocmask
& smp_active_mask
574 & usched_global_cpumask
;
577 cpu
= BSFCPUMASK(mask
);
578 other_dd
= &bsd4_pcpu
[cpu
];
579 if (other_dd
->upri
- lp
->lwp_priority
> usched_bsd4_upri_affinity
* PPQ
) {
581 KTR_COND_LOG(usched_batchy_test_false
,
582 lp
->lwp_proc
->p_pid
== usched_bsd4_pid_debug
,
584 lp
->lwp_thread
->td_gd
->gd_cpuid
,
585 (unsigned long)mask
);
589 mask
&= ~CPUMASK(cpu
);
592 KTR_COND_LOG(usched_batchy_test_true
,
593 lp
->lwp_proc
->p_pid
== usched_bsd4_pid_debug
,
595 lp
->lwp_thread
->td_gd
->gd_cpuid
,
596 (unsigned long)mask
);
605 * Place the specified lwp on the user scheduler's run queue. This routine
606 * must be called with the thread descheduled. The lwp must be runnable.
608 * The thread may be the current thread as a special case.
613 bsd4_setrunqueue(struct lwp
*lp
)
622 * First validate the process state relative to the current cpu.
623 * We don't need the spinlock for this, just a critical section.
624 * We are in control of the process.
627 KASSERT(lp
->lwp_stat
== LSRUN
, ("setrunqueue: lwp not LSRUN"));
628 KASSERT((lp
->lwp_mpflags
& LWP_MP_ONRUNQ
) == 0,
629 ("lwp %d/%d already on runq! flag %08x/%08x", lp
->lwp_proc
->p_pid
,
630 lp
->lwp_tid
, lp
->lwp_proc
->p_flags
, lp
->lwp_flags
));
631 KKASSERT((lp
->lwp_thread
->td_flags
& TDF_RUNQ
) == 0);
634 * Note: gd and dd are relative to the target thread's last cpu,
635 * NOT our current cpu.
637 gd
= lp
->lwp_thread
->td_gd
;
638 dd
= &bsd4_pcpu
[gd
->gd_cpuid
];
641 * This process is not supposed to be scheduled anywhere or assigned
642 * as the current process anywhere. Assert the condition.
644 KKASSERT(dd
->uschedcp
!= lp
);
647 * XXX fixme. Could be part of a remrunqueue/setrunqueue
648 * operation when the priority is recalculated, so TDF_MIGRATING
649 * may already be set.
651 if ((lp
->lwp_thread
->td_flags
& TDF_MIGRATING
) == 0)
652 lwkt_giveaway(lp
->lwp_thread
);
655 * We lose control of lp the moment we release the spinlock after
656 * having placed lp on the queue. i.e. another cpu could pick it
657 * up and it could exit, or its priority could be further adjusted,
658 * or something like that.
660 spin_lock(&bsd4_spin
);
661 bsd4_setrunqueue_locked(lp
);
662 lp
->lwp_rebal_ticks
= sched_ticks
;
665 * Kick the scheduler helper on one of the other cpu's
666 * and request a reschedule if appropriate.
668 * NOTE: We check all cpus whos rdyprocmask is set. First we
669 * look for cpus without designated lps, then we look for
670 * cpus with designated lps with a worse priority than our
675 if (usched_bsd4_smt
) {
678 * SMT heuristic - Try to schedule on a free physical core.
679 * If no physical core found than choose the one that has
680 * an interactive thread.
684 int min_prio
= MAXPRI
* MAXPRI
;
687 cpuid
= (bsd4_scancpu
& 0xFFFF) % ncpus
;
688 mask
= ~bsd4_curprocmask
& bsd4_rdyprocmask
& lp
->lwp_cpumask
&
689 smp_active_mask
& usched_global_cpumask
;
691 KTR_COND_LOG(usched_bsd4_setrunqueue_fc_smt
,
692 lp
->lwp_proc
->p_pid
== usched_bsd4_pid_debug
,
694 lp
->lwp_thread
->td_gd
->gd_cpuid
,
699 tmpmask
= ~(CPUMASK(cpuid
) - 1);
701 cpuid
= BSFCPUMASK(mask
& tmpmask
);
703 cpuid
= BSFCPUMASK(mask
);
704 gd
= globaldata_find(cpuid
);
705 dd
= &bsd4_pcpu
[cpuid
];
707 if ((dd
->upri
& ~PPQMASK
) >= (lp
->lwp_priority
& ~PPQMASK
)) {
708 if (dd
->cpunode
->parent_node
->members
& ~dd
->cpunode
->members
& mask
) {
710 KTR_COND_LOG(usched_bsd4_setrunqueue_found
,
711 lp
->lwp_proc
->p_pid
== usched_bsd4_pid_debug
,
713 lp
->lwp_thread
->td_gd
->gd_cpuid
,
720 sibling
= BSFCPUMASK(dd
->cpunode
->parent_node
->members
&
721 ~dd
->cpunode
->members
);
722 if (min_prio
> bsd4_pcpu
[sibling
].upri
) {
723 min_prio
= bsd4_pcpu
[sibling
].upri
;
728 mask
&= ~CPUMASK(cpuid
);
731 if (best_cpuid
!= -1) {
733 gd
= globaldata_find(cpuid
);
734 dd
= &bsd4_pcpu
[cpuid
];
736 KTR_COND_LOG(usched_bsd4_setrunqueue_found_best_cpuid
,
737 lp
->lwp_proc
->p_pid
== usched_bsd4_pid_debug
,
739 lp
->lwp_thread
->td_gd
->gd_cpuid
,
747 /* Fallback to the original heuristic */
748 cpuid
= (bsd4_scancpu
& 0xFFFF) % ncpus
;
749 mask
= ~bsd4_curprocmask
& bsd4_rdyprocmask
& lp
->lwp_cpumask
&
750 smp_active_mask
& usched_global_cpumask
;
752 KTR_COND_LOG(usched_bsd4_setrunqueue_fc_non_smt
,
753 lp
->lwp_proc
->p_pid
== usched_bsd4_pid_debug
,
755 lp
->lwp_thread
->td_gd
->gd_cpuid
,
760 tmpmask
= ~(CPUMASK(cpuid
) - 1);
762 cpuid
= BSFCPUMASK(mask
& tmpmask
);
764 cpuid
= BSFCPUMASK(mask
);
765 gd
= globaldata_find(cpuid
);
766 dd
= &bsd4_pcpu
[cpuid
];
768 if ((dd
->upri
& ~PPQMASK
) >= (lp
->lwp_priority
& ~PPQMASK
)) {
770 KTR_COND_LOG(usched_bsd4_setrunqueue_found
,
771 lp
->lwp_proc
->p_pid
== usched_bsd4_pid_debug
,
773 lp
->lwp_thread
->td_gd
->gd_cpuid
,
780 mask
&= ~CPUMASK(cpuid
);
785 * Then cpus which might have a currently running lp
787 mask
= bsd4_curprocmask
& bsd4_rdyprocmask
&
788 lp
->lwp_cpumask
& smp_active_mask
& usched_global_cpumask
;
790 KTR_COND_LOG(usched_bsd4_setrunqueue_rc
,
791 lp
->lwp_proc
->p_pid
== usched_bsd4_pid_debug
,
793 lp
->lwp_thread
->td_gd
->gd_cpuid
,
798 tmpmask
= ~(CPUMASK(cpuid
) - 1);
800 cpuid
= BSFCPUMASK(mask
& tmpmask
);
802 cpuid
= BSFCPUMASK(mask
);
803 gd
= globaldata_find(cpuid
);
804 dd
= &bsd4_pcpu
[cpuid
];
806 if ((dd
->upri
& ~PPQMASK
) > (lp
->lwp_priority
& ~PPQMASK
)) {
808 KTR_COND_LOG(usched_bsd4_setrunqueue_found
,
809 lp
->lwp_proc
->p_pid
== usched_bsd4_pid_debug
,
811 lp
->lwp_thread
->td_gd
->gd_cpuid
,
818 mask
&= ~CPUMASK(cpuid
);
822 * If we cannot find a suitable cpu we reload from bsd4_scancpu
823 * and round-robin. Other cpus will pickup as they release their
824 * current lwps or become ready.
826 * Avoid a degenerate system lockup case if usched_global_cpumask
827 * is set to 0 or otherwise does not cover lwp_cpumask.
829 * We only kick the target helper thread in this case, we do not
830 * set the user resched flag because
832 cpuid
= (bsd4_scancpu
& 0xFFFF) % ncpus
;
833 if ((CPUMASK(cpuid
) & usched_global_cpumask
) == 0) {
836 gd
= globaldata_find(cpuid
);
837 dd
= &bsd4_pcpu
[cpuid
];
839 KTR_COND_LOG(usched_bsd4_setrunqueue_not_found
,
840 lp
->lwp_proc
->p_pid
== usched_bsd4_pid_debug
,
842 lp
->lwp_thread
->td_gd
->gd_cpuid
,
848 spin_unlock(&bsd4_spin
);
849 if ((dd
->upri
& ~PPQMASK
) > (lp
->lwp_priority
& ~PPQMASK
)) {
850 if (dd
->uschedcp
== NULL
) {
851 wakeup_mycpu(&dd
->helper_thread
);
857 atomic_clear_cpumask(&bsd4_rdyprocmask
, CPUMASK(cpuid
));
858 spin_unlock(&bsd4_spin
);
859 if ((dd
->upri
& ~PPQMASK
) > (lp
->lwp_priority
& ~PPQMASK
))
860 lwkt_send_ipiq(gd
, bsd4_need_user_resched_remote
, NULL
);
862 wakeup(&dd
->helper_thread
);
868 * This routine is called from a systimer IPI. It MUST be MP-safe and
869 * the BGL IS NOT HELD ON ENTRY. This routine is called at ESTCPUFREQ on
872 * This routine is called on every sched tick. If the currently running
873 * thread belongs to this scheduler it will be called with a non-NULL lp,
874 * otherwise it will be called with a NULL lp.
880 bsd4_schedulerclock(struct lwp
*lp
, sysclock_t period
, sysclock_t cpstamp
)
882 globaldata_t gd
= mycpu
;
883 bsd4_pcpu_t dd
= &bsd4_pcpu
[gd
->gd_cpuid
];
886 * No impl if no lp running.
892 * Do we need to round-robin? We round-robin 10 times a second.
893 * This should only occur for cpu-bound batch processes.
895 if (++dd
->rrcount
>= usched_bsd4_rrinterval
) {
901 * Adjust estcpu upward using a real time equivalent calculation.
903 lp
->lwp_estcpu
= ESTCPULIM(lp
->lwp_estcpu
+ ESTCPUMAX
/ ESTCPUFREQ
+ 1);
906 * Spinlocks also hold a critical section so there should not be
909 KKASSERT(gd
->gd_spinlocks
== 0);
911 bsd4_resetpriority(lp
);
915 * Called from acquire and from kern_synch's one-second timer (one of the
916 * callout helper threads) with a critical section held.
918 * Decay p_estcpu based on the number of ticks we haven't been running
919 * and our p_nice. As the load increases each process observes a larger
920 * number of idle ticks (because other processes are running in them).
921 * This observation leads to a larger correction which tends to make the
922 * system more 'batchy'.
924 * Note that no recalculation occurs for a process which sleeps and wakes
925 * up in the same tick. That is, a system doing thousands of context
926 * switches per second will still only do serious estcpu calculations
927 * ESTCPUFREQ times per second.
933 bsd4_recalculate_estcpu(struct lwp
*lp
)
935 globaldata_t gd
= mycpu
;
942 * We have to subtract periodic to get the last schedclock
943 * timeout time, otherwise we would get the upcoming timeout.
944 * Keep in mind that a process can migrate between cpus and
945 * while the scheduler clock should be very close, boundary
946 * conditions could lead to a small negative delta.
948 cpbase
= gd
->gd_schedclock
.time
- gd
->gd_schedclock
.periodic
;
950 if (lp
->lwp_slptime
> 1) {
952 * Too much time has passed, do a coarse correction.
954 lp
->lwp_estcpu
= lp
->lwp_estcpu
>> 1;
955 bsd4_resetpriority(lp
);
956 lp
->lwp_cpbase
= cpbase
;
958 lp
->lwp_batch
-= ESTCPUFREQ
;
959 if (lp
->lwp_batch
< 0)
961 } else if (lp
->lwp_cpbase
!= cpbase
) {
963 * Adjust estcpu if we are in a different tick. Don't waste
964 * time if we are in the same tick.
966 * First calculate the number of ticks in the measurement
967 * interval. The ttlticks calculation can wind up 0 due to
968 * a bug in the handling of lwp_slptime (as yet not found),
969 * so make sure we do not get a divide by 0 panic.
971 ttlticks
= (cpbase
- lp
->lwp_cpbase
) /
972 gd
->gd_schedclock
.periodic
;
973 if ((ssysclock_t
)ttlticks
< 0) {
975 lp
->lwp_cpbase
= cpbase
;
979 updatepcpu(lp
, lp
->lwp_cpticks
, ttlticks
);
982 * Calculate the percentage of one cpu used factoring in ncpus
983 * and the load and adjust estcpu. Handle degenerate cases
984 * by adding 1 to bsd4_runqcount.
986 * estcpu is scaled by ESTCPUMAX.
988 * bsd4_runqcount is the excess number of user processes
989 * that cannot be immediately scheduled to cpus. We want
990 * to count these as running to avoid range compression
991 * in the base calculation (which is the actual percentage
994 estcpu
= (lp
->lwp_cpticks
* ESTCPUMAX
) *
995 (bsd4_runqcount
+ ncpus
) / (ncpus
* ttlticks
);
998 * If estcpu is > 50% we become more batch-like
999 * If estcpu is <= 50% we become less batch-like
1001 * It takes 30 cpu seconds to traverse the entire range.
1003 if (estcpu
> ESTCPUMAX
/ 2) {
1004 lp
->lwp_batch
+= ttlticks
;
1005 if (lp
->lwp_batch
> BATCHMAX
)
1006 lp
->lwp_batch
= BATCHMAX
;
1008 lp
->lwp_batch
-= ttlticks
;
1009 if (lp
->lwp_batch
< 0)
1013 if (usched_bsd4_debug
== lp
->lwp_proc
->p_pid
) {
1014 kprintf("pid %d lwp %p estcpu %3d %3d bat %d cp %d/%d",
1015 lp
->lwp_proc
->p_pid
, lp
,
1016 estcpu
, lp
->lwp_estcpu
,
1018 lp
->lwp_cpticks
, ttlticks
);
1022 * Adjust lp->lwp_esetcpu. The decay factor determines how
1023 * quickly lwp_estcpu collapses to its realtime calculation.
1024 * A slower collapse gives us a more accurate number but
1025 * can cause a cpu hog to eat too much cpu before the
1026 * scheduler decides to downgrade it.
1028 * NOTE: p_nice is accounted for in bsd4_resetpriority(),
1029 * and not here, but we must still ensure that a
1030 * cpu-bound nice -20 process does not completely
1031 * override a cpu-bound nice +20 process.
1033 * NOTE: We must use ESTCPULIM() here to deal with any
1036 decay_factor
= usched_bsd4_decay
;
1037 if (decay_factor
< 1)
1039 if (decay_factor
> 1024)
1040 decay_factor
= 1024;
1042 lp
->lwp_estcpu
= ESTCPULIM(
1043 (lp
->lwp_estcpu
* decay_factor
+ estcpu
) /
1044 (decay_factor
+ 1));
1046 if (usched_bsd4_debug
== lp
->lwp_proc
->p_pid
)
1047 kprintf(" finalestcpu %d\n", lp
->lwp_estcpu
);
1048 bsd4_resetpriority(lp
);
1049 lp
->lwp_cpbase
+= ttlticks
* gd
->gd_schedclock
.periodic
;
1050 lp
->lwp_cpticks
= 0;
1055 * Compute the priority of a process when running in user mode.
1056 * Arrange to reschedule if the resulting priority is better
1057 * than that of the current process.
1059 * This routine may be called with any process.
1061 * This routine is called by fork1() for initial setup with the process
1062 * of the run queue, and also may be called normally with the process on or
1063 * off the run queue.
1068 bsd4_resetpriority(struct lwp
*lp
)
1078 * Calculate the new priority and queue type
1081 spin_lock(&bsd4_spin
);
1083 newrqtype
= lp
->lwp_rtprio
.type
;
1086 case RTP_PRIO_REALTIME
:
1088 newpriority
= PRIBASE_REALTIME
+
1089 (lp
->lwp_rtprio
.prio
& PRIMASK
);
1091 case RTP_PRIO_NORMAL
:
1093 * Detune estcpu based on batchiness. lwp_batch ranges
1094 * from 0 to BATCHMAX. Limit estcpu for the sake of
1095 * the priority calculation to between 50% and 100%.
1097 estcpu
= lp
->lwp_estcpu
* (lp
->lwp_batch
+ BATCHMAX
) /
1101 * p_nice piece Adds (0-40) * 2 0-80
1102 * estcpu Adds 16384 * 4 / 512 0-128
1104 newpriority
= (lp
->lwp_proc
->p_nice
- PRIO_MIN
) * PPQ
/ NICEPPQ
;
1105 newpriority
+= estcpu
* PPQ
/ ESTCPUPPQ
;
1106 newpriority
= newpriority
* MAXPRI
/ (PRIO_RANGE
* PPQ
/
1107 NICEPPQ
+ ESTCPUMAX
* PPQ
/ ESTCPUPPQ
);
1108 newpriority
= PRIBASE_NORMAL
+ (newpriority
& PRIMASK
);
1111 newpriority
= PRIBASE_IDLE
+ (lp
->lwp_rtprio
.prio
& PRIMASK
);
1113 case RTP_PRIO_THREAD
:
1114 newpriority
= PRIBASE_THREAD
+ (lp
->lwp_rtprio
.prio
& PRIMASK
);
1117 panic("Bad RTP_PRIO %d", newrqtype
);
1122 * The newpriority incorporates the queue type so do a simple masked
1123 * check to determine if the process has moved to another queue. If
1124 * it has, and it is currently on a run queue, then move it.
1126 * td_upri has normal sense (higher values are more desireable), so
1129 lp
->lwp_thread
->td_upri
= -(newpriority
& ~PPQMASK
);
1130 if ((lp
->lwp_priority
^ newpriority
) & ~PPQMASK
) {
1131 lp
->lwp_priority
= newpriority
;
1132 if (lp
->lwp_mpflags
& LWP_MP_ONRUNQ
) {
1133 bsd4_remrunqueue_locked(lp
);
1134 lp
->lwp_rqtype
= newrqtype
;
1135 lp
->lwp_rqindex
= (newpriority
& PRIMASK
) / PPQ
;
1136 bsd4_setrunqueue_locked(lp
);
1139 lp
->lwp_rqtype
= newrqtype
;
1140 lp
->lwp_rqindex
= (newpriority
& PRIMASK
) / PPQ
;
1143 reschedcpu
= lp
->lwp_thread
->td_gd
->gd_cpuid
;
1145 lp
->lwp_priority
= newpriority
;
1151 * Determine if we need to reschedule the target cpu. This only
1152 * occurs if the LWP is already on a scheduler queue, which means
1153 * that idle cpu notification has already occured. At most we
1154 * need only issue a need_user_resched() on the appropriate cpu.
1156 * The LWP may be owned by a CPU different from the current one,
1157 * in which case dd->uschedcp may be modified without an MP lock
1158 * or a spinlock held. The worst that happens is that the code
1159 * below causes a spurious need_user_resched() on the target CPU
1160 * and dd->pri to be wrong for a short period of time, both of
1161 * which are harmless.
1163 * If checkpri is 0 we are adjusting the priority of the current
1164 * process, possibly higher (less desireable), so ignore the upri
1165 * check which will fail in that case.
1167 if (reschedcpu
>= 0) {
1168 dd
= &bsd4_pcpu
[reschedcpu
];
1169 if ((bsd4_rdyprocmask
& CPUMASK(reschedcpu
)) &&
1171 (dd
->upri
& ~PRIMASK
) > (lp
->lwp_priority
& ~PRIMASK
))) {
1172 if (reschedcpu
== mycpu
->gd_cpuid
) {
1173 spin_unlock(&bsd4_spin
);
1174 need_user_resched();
1176 spin_unlock(&bsd4_spin
);
1177 atomic_clear_cpumask(&bsd4_rdyprocmask
,
1178 CPUMASK(reschedcpu
));
1179 lwkt_send_ipiq(lp
->lwp_thread
->td_gd
,
1180 bsd4_need_user_resched_remote
,
1184 spin_unlock(&bsd4_spin
);
1187 spin_unlock(&bsd4_spin
);
1197 bsd4_yield(struct lwp
*lp
)
1200 /* FUTURE (or something similar) */
1201 switch(lp
->lwp_rqtype
) {
1202 case RTP_PRIO_NORMAL
:
1203 lp
->lwp_estcpu
= ESTCPULIM(lp
->lwp_estcpu
+ ESTCPUINCR
);
1209 need_user_resched();
1213 * Called from fork1() when a new child process is being created.
1215 * Give the child process an initial estcpu that is more batch then
1216 * its parent and dock the parent for the fork (but do not
1217 * reschedule the parent). This comprises the main part of our batch
1218 * detection heuristic for both parallel forking and sequential execs.
1220 * XXX lwp should be "spawning" instead of "forking"
1225 bsd4_forking(struct lwp
*plp
, struct lwp
*lp
)
1228 * Put the child 4 queue slots (out of 32) higher than the parent
1229 * (less desireable than the parent).
1231 lp
->lwp_estcpu
= ESTCPULIM(plp
->lwp_estcpu
+ ESTCPUPPQ
* 4);
1234 * The batch status of children always starts out centerline
1235 * and will inch-up or inch-down as appropriate. It takes roughly
1236 * ~15 seconds of >50% cpu to hit the limit.
1238 lp
->lwp_batch
= BATCHMAX
/ 2;
1241 * Dock the parent a cost for the fork, protecting us from fork
1242 * bombs. If the parent is forking quickly make the child more
1245 plp
->lwp_estcpu
= ESTCPULIM(plp
->lwp_estcpu
+ ESTCPUPPQ
/ 16);
1249 * Called when a lwp is being removed from this scheduler, typically
1250 * during lwp_exit().
1253 bsd4_exiting(struct lwp
*lp
, struct proc
*child_proc
)
1258 bsd4_uload_update(struct lwp
*lp
)
1263 * chooseproc() is called when a cpu needs a user process to LWKT schedule,
1264 * it selects a user process and returns it. If chklp is non-NULL and chklp
1265 * has a better or equal priority then the process that would otherwise be
1266 * chosen, NULL is returned.
1268 * Until we fix the RUNQ code the chklp test has to be strict or we may
1269 * bounce between processes trying to acquire the current process designation.
1271 * MPSAFE - must be called with bsd4_spin exclusive held. The spinlock is
1272 * left intact through the entire routine.
1276 bsd4_chooseproc_locked(struct lwp
*chklp
)
1280 u_int32_t
*which
, *which2
;
1287 rtqbits
= bsd4_rtqueuebits
;
1288 tsqbits
= bsd4_queuebits
;
1289 idqbits
= bsd4_idqueuebits
;
1290 cpumask
= mycpu
->gd_cpumask
;
1295 pri
= bsfl(rtqbits
);
1296 q
= &bsd4_rtqueues
[pri
];
1297 which
= &bsd4_rtqueuebits
;
1299 } else if (tsqbits
) {
1300 pri
= bsfl(tsqbits
);
1301 q
= &bsd4_queues
[pri
];
1302 which
= &bsd4_queuebits
;
1304 } else if (idqbits
) {
1305 pri
= bsfl(idqbits
);
1306 q
= &bsd4_idqueues
[pri
];
1307 which
= &bsd4_idqueuebits
;
1312 lp
= TAILQ_FIRST(q
);
1313 KASSERT(lp
, ("chooseproc: no lwp on busy queue"));
1315 while ((lp
->lwp_cpumask
& cpumask
) == 0) {
1316 lp
= TAILQ_NEXT(lp
, lwp_procq
);
1318 *which2
&= ~(1 << pri
);
1324 * If the passed lwp <chklp> is reasonably close to the selected
1325 * lwp <lp>, return NULL (indicating that <chklp> should be kept).
1327 * Note that we must error on the side of <chklp> to avoid bouncing
1328 * between threads in the acquire code.
1331 if (chklp
->lwp_priority
< lp
->lwp_priority
+ PPQ
)
1336 * If the chosen lwp does not reside on this cpu spend a few
1337 * cycles looking for a better candidate at the same priority level.
1338 * This is a fallback check, setrunqueue() tries to wakeup the
1339 * correct cpu and is our front-line affinity.
1341 if (lp
->lwp_thread
->td_gd
!= mycpu
&&
1342 (chklp
= TAILQ_NEXT(lp
, lwp_procq
)) != NULL
1344 if (chklp
->lwp_thread
->td_gd
== mycpu
) {
1349 KTR_COND_LOG(usched_chooseproc
,
1350 lp
->lwp_proc
->p_pid
== usched_bsd4_pid_debug
,
1351 lp
->lwp_proc
->p_pid
,
1352 lp
->lwp_thread
->td_gd
->gd_cpuid
,
1355 TAILQ_REMOVE(q
, lp
, lwp_procq
);
1358 *which
&= ~(1 << pri
);
1359 KASSERT((lp
->lwp_mpflags
& LWP_MP_ONRUNQ
) != 0, ("not on runq6!"));
1360 atomic_clear_int(&lp
->lwp_mpflags
, LWP_MP_ONRUNQ
);
1366 * chooseproc() - with a cache coherence heuristic. Try to pull a process that
1367 * has its home on the current CPU> If the process doesn't have its home here
1368 * and is a batchy one (see batcy_looser_pri_test), we can wait for a
1369 * sched_tick, may be its home will become free and pull it in. Anyway,
1370 * we can't wait more than one tick. If that tick expired, we pull in that
1371 * process, no matter what.
1375 bsd4_chooseproc_locked_cache_coherent(struct lwp
*chklp
)
1379 u_int32_t
*which
, *which2
;
1387 struct lwp
* min_level_lwp
= NULL
;
1388 struct rq
*min_q
= NULL
;
1390 cpu_node_t
* cpunode
= NULL
;
1391 u_int32_t min_level
= MAXCPU
; /* number of levels < MAXCPU */
1392 u_int32_t
*min_which
= NULL
;
1393 u_int32_t min_pri
= 0;
1394 u_int32_t level
= 0;
1396 rtqbits
= bsd4_rtqueuebits
;
1397 tsqbits
= bsd4_queuebits
;
1398 idqbits
= bsd4_idqueuebits
;
1399 cpumask
= mycpu
->gd_cpumask
;
1401 /* Get the mask coresponding to the sysctl configured level */
1402 cpunode
= bsd4_pcpu
[mycpu
->gd_cpuid
].cpunode
;
1403 level
= usched_bsd4_stick_to_level
;
1405 cpunode
= cpunode
->parent_node
;
1408 /* The cpus which can ellect a process */
1409 siblings
= cpunode
->members
;
1414 pri
= bsfl(rtqbits
);
1415 q
= &bsd4_rtqueues
[pri
];
1416 which
= &bsd4_rtqueuebits
;
1418 } else if (tsqbits
) {
1419 pri
= bsfl(tsqbits
);
1420 q
= &bsd4_queues
[pri
];
1421 which
= &bsd4_queuebits
;
1423 } else if (idqbits
) {
1424 pri
= bsfl(idqbits
);
1425 q
= &bsd4_idqueues
[pri
];
1426 which
= &bsd4_idqueuebits
;
1430 * No more left and we didn't reach the checks limit.
1432 bsd4_kick_helper(min_level_lwp
);
1435 lp
= TAILQ_FIRST(q
);
1436 KASSERT(lp
, ("chooseproc: no lwp on busy queue"));
1439 * Limit the number of checks/queue to a configurable value to
1440 * minimize the contention (we are in a locked region
1442 while (checks
< usched_bsd4_queue_checks
) {
1443 if ((lp
->lwp_cpumask
& cpumask
) == 0 ||
1444 ((siblings
& lp
->lwp_thread
->td_gd
->gd_cpumask
) == 0 &&
1445 (lp
->lwp_rebal_ticks
== sched_ticks
||
1446 lp
->lwp_rebal_ticks
== (int)(sched_ticks
- 1)) &&
1447 bsd4_batchy_looser_pri_test(lp
))) {
1449 KTR_COND_LOG(usched_chooseproc_cc_not_good
,
1450 lp
->lwp_proc
->p_pid
== usched_bsd4_pid_debug
,
1451 lp
->lwp_proc
->p_pid
,
1452 (unsigned long)lp
->lwp_thread
->td_gd
->gd_cpumask
,
1453 (unsigned long)siblings
,
1454 (unsigned long)cpumask
);
1456 cpunode
= bsd4_pcpu
[lp
->lwp_thread
->td_gd
->gd_cpuid
].cpunode
;
1459 if (cpunode
->members
& cpumask
)
1461 cpunode
= cpunode
->parent_node
;
1464 if (level
< min_level
||
1465 (level
== min_level
&& min_level_lwp
&&
1466 lp
->lwp_priority
< min_level_lwp
->lwp_priority
)) {
1467 bsd4_kick_helper(min_level_lwp
);
1474 bsd4_kick_helper(lp
);
1476 lp
= TAILQ_NEXT(lp
, lwp_procq
);
1478 *which2
&= ~(1 << pri
);
1482 KTR_COND_LOG(usched_chooseproc_cc_elected
,
1483 lp
->lwp_proc
->p_pid
== usched_bsd4_pid_debug
,
1484 lp
->lwp_proc
->p_pid
,
1485 (unsigned long)lp
->lwp_thread
->td_gd
->gd_cpumask
,
1486 (unsigned long)siblings
,
1487 (unsigned long)cpumask
);
1495 * Checks exhausted, we tried to defer too many threads, so schedule
1496 * the best of the worst.
1502 KASSERT(lp
, ("chooseproc: at least the first lp was good"));
1507 * If the passed lwp <chklp> is reasonably close to the selected
1508 * lwp <lp>, return NULL (indicating that <chklp> should be kept).
1510 * Note that we must error on the side of <chklp> to avoid bouncing
1511 * between threads in the acquire code.
1514 if (chklp
->lwp_priority
< lp
->lwp_priority
+ PPQ
) {
1515 bsd4_kick_helper(lp
);
1520 KTR_COND_LOG(usched_chooseproc_cc
,
1521 lp
->lwp_proc
->p_pid
== usched_bsd4_pid_debug
,
1522 lp
->lwp_proc
->p_pid
,
1523 lp
->lwp_thread
->td_gd
->gd_cpuid
,
1526 TAILQ_REMOVE(q
, lp
, lwp_procq
);
1529 *which
&= ~(1 << pri
);
1530 KASSERT((lp
->lwp_mpflags
& LWP_MP_ONRUNQ
) != 0, ("not on runq6!"));
1531 atomic_clear_int(&lp
->lwp_mpflags
, LWP_MP_ONRUNQ
);
1537 * If we aren't willing to schedule a ready process on our cpu, give it's
1538 * target cpu a kick rather than wait for the next tick.
1540 * Called with bsd4_spin held.
1544 bsd4_kick_helper(struct lwp
*lp
)
1551 gd
= lp
->lwp_thread
->td_gd
;
1552 dd
= &bsd4_pcpu
[gd
->gd_cpuid
];
1553 if ((smp_active_mask
& usched_global_cpumask
&
1554 bsd4_rdyprocmask
& gd
->gd_cpumask
) == 0) {
1557 ++usched_bsd4_kicks
;
1558 atomic_clear_cpumask(&bsd4_rdyprocmask
, gd
->gd_cpumask
);
1559 if ((dd
->upri
& ~PPQMASK
) > (lp
->lwp_priority
& ~PPQMASK
)) {
1560 lwkt_send_ipiq(gd
, bsd4_need_user_resched_remote
, NULL
);
1562 wakeup(&dd
->helper_thread
);
1568 bsd4_need_user_resched_remote(void *dummy
)
1570 globaldata_t gd
= mycpu
;
1571 bsd4_pcpu_t dd
= &bsd4_pcpu
[gd
->gd_cpuid
];
1573 need_user_resched();
1575 /* Call wakeup_mycpu to avoid sending IPIs to other CPUs */
1576 wakeup_mycpu(&dd
->helper_thread
);
1580 * bsd4_remrunqueue_locked() removes a given process from the run queue
1581 * that it is on, clearing the queue busy bit if it becomes empty.
1583 * Note that user process scheduler is different from the LWKT schedule.
1584 * The user process scheduler only manages user processes but it uses LWKT
1585 * underneath, and a user process operating in the kernel will often be
1586 * 'released' from our management.
1588 * MPSAFE - bsd4_spin must be held exclusively on call
1591 bsd4_remrunqueue_locked(struct lwp
*lp
)
1597 KKASSERT(lp
->lwp_mpflags
& LWP_MP_ONRUNQ
);
1598 atomic_clear_int(&lp
->lwp_mpflags
, LWP_MP_ONRUNQ
);
1600 KKASSERT(bsd4_runqcount
>= 0);
1602 pri
= lp
->lwp_rqindex
;
1603 switch(lp
->lwp_rqtype
) {
1604 case RTP_PRIO_NORMAL
:
1605 q
= &bsd4_queues
[pri
];
1606 which
= &bsd4_queuebits
;
1608 case RTP_PRIO_REALTIME
:
1610 q
= &bsd4_rtqueues
[pri
];
1611 which
= &bsd4_rtqueuebits
;
1614 q
= &bsd4_idqueues
[pri
];
1615 which
= &bsd4_idqueuebits
;
1618 panic("remrunqueue: invalid rtprio type");
1621 TAILQ_REMOVE(q
, lp
, lwp_procq
);
1622 if (TAILQ_EMPTY(q
)) {
1623 KASSERT((*which
& (1 << pri
)) != 0,
1624 ("remrunqueue: remove from empty queue"));
1625 *which
&= ~(1 << pri
);
1630 * bsd4_setrunqueue_locked()
1632 * Add a process whos rqtype and rqindex had previously been calculated
1633 * onto the appropriate run queue. Determine if the addition requires
1634 * a reschedule on a cpu and return the cpuid or -1.
1636 * NOTE: Lower priorities are better priorities.
1638 * MPSAFE - bsd4_spin must be held exclusively on call
1641 bsd4_setrunqueue_locked(struct lwp
*lp
)
1647 KKASSERT((lp
->lwp_mpflags
& LWP_MP_ONRUNQ
) == 0);
1648 atomic_set_int(&lp
->lwp_mpflags
, LWP_MP_ONRUNQ
);
1651 pri
= lp
->lwp_rqindex
;
1653 switch(lp
->lwp_rqtype
) {
1654 case RTP_PRIO_NORMAL
:
1655 q
= &bsd4_queues
[pri
];
1656 which
= &bsd4_queuebits
;
1658 case RTP_PRIO_REALTIME
:
1660 q
= &bsd4_rtqueues
[pri
];
1661 which
= &bsd4_rtqueuebits
;
1664 q
= &bsd4_idqueues
[pri
];
1665 which
= &bsd4_idqueuebits
;
1668 panic("remrunqueue: invalid rtprio type");
1673 * Add to the correct queue and set the appropriate bit. If no
1674 * lower priority (i.e. better) processes are in the queue then
1675 * we want a reschedule, calculate the best cpu for the job.
1677 * Always run reschedules on the LWPs original cpu.
1679 TAILQ_INSERT_TAIL(q
, lp
, lwp_procq
);
1684 * For SMP systems a user scheduler helper thread is created for each
1685 * cpu and is used to allow one cpu to wakeup another for the purposes of
1686 * scheduling userland threads from setrunqueue().
1688 * UP systems do not need the helper since there is only one cpu.
1690 * We can't use the idle thread for this because we might block.
1691 * Additionally, doing things this way allows us to HLT idle cpus
1697 sched_thread(void *dummy
)
1709 cpuid
= gd
->gd_cpuid
; /* doesn't change */
1710 mask
= gd
->gd_cpumask
; /* doesn't change */
1711 dd
= &bsd4_pcpu
[cpuid
];
1714 * Since we are woken up only when no user processes are scheduled
1715 * on a cpu, we can run at an ultra low priority.
1717 lwkt_setpri_self(TDPRI_USER_SCHEDULER
);
1719 tsleep(&dd
->helper_thread
, 0, "sched_thread_sleep", 0);
1723 * We use the LWKT deschedule-interlock trick to avoid racing
1724 * bsd4_rdyprocmask. This means we cannot block through to the
1725 * manual lwkt_switch() call we make below.
1728 tsleep_interlock(&dd
->helper_thread
, 0);
1729 spin_lock(&bsd4_spin
);
1730 atomic_set_cpumask(&bsd4_rdyprocmask
, mask
);
1732 clear_user_resched(); /* This satisfied the reschedule request */
1733 dd
->rrcount
= 0; /* Reset the round-robin counter */
1735 if ((bsd4_curprocmask
& mask
) == 0) {
1737 * No thread is currently scheduled.
1739 KKASSERT(dd
->uschedcp
== NULL
);
1740 if ((nlp
= bsd4_chooseproc_locked(NULL
)) != NULL
) {
1741 KTR_COND_LOG(usched_sched_thread_no_process
,
1742 nlp
->lwp_proc
->p_pid
== usched_bsd4_pid_debug
,
1744 nlp
->lwp_proc
->p_pid
,
1745 nlp
->lwp_thread
->td_gd
->gd_cpuid
);
1747 atomic_set_cpumask(&bsd4_curprocmask
, mask
);
1748 dd
->upri
= nlp
->lwp_priority
;
1750 dd
->rrcount
= 0; /* reset round robin */
1751 spin_unlock(&bsd4_spin
);
1752 lwkt_acquire(nlp
->lwp_thread
);
1753 lwkt_schedule(nlp
->lwp_thread
);
1755 spin_unlock(&bsd4_spin
);
1757 } else if (bsd4_runqcount
) {
1758 if ((nlp
= bsd4_chooseproc_locked(dd
->uschedcp
)) != NULL
) {
1759 KTR_COND_LOG(usched_sched_thread_process
,
1760 nlp
->lwp_proc
->p_pid
== usched_bsd4_pid_debug
,
1762 nlp
->lwp_proc
->p_pid
,
1763 nlp
->lwp_thread
->td_gd
->gd_cpuid
);
1765 dd
->upri
= nlp
->lwp_priority
;
1767 dd
->rrcount
= 0; /* reset round robin */
1768 spin_unlock(&bsd4_spin
);
1769 lwkt_acquire(nlp
->lwp_thread
);
1770 lwkt_schedule(nlp
->lwp_thread
);
1773 * CHAINING CONDITION TRAIN
1775 * We could not deal with the scheduler wakeup
1776 * request on this cpu, locate a ready scheduler
1777 * with no current lp assignment and chain to it.
1779 * This ensures that a wakeup race which fails due
1780 * to priority test does not leave other unscheduled
1781 * cpus idle when the runqueue is not empty.
1783 tmpmask
= ~bsd4_curprocmask
&
1784 bsd4_rdyprocmask
& smp_active_mask
;
1786 tmpid
= BSFCPUMASK(tmpmask
);
1787 tmpdd
= &bsd4_pcpu
[tmpid
];
1788 atomic_clear_cpumask(&bsd4_rdyprocmask
,
1790 spin_unlock(&bsd4_spin
);
1791 wakeup(&tmpdd
->helper_thread
);
1793 spin_unlock(&bsd4_spin
);
1796 KTR_LOG(usched_sched_thread_no_process_found
,
1797 gd
->gd_cpuid
, (unsigned long)tmpmask
);
1801 * The runq is empty.
1803 spin_unlock(&bsd4_spin
);
1807 * We're descheduled unless someone scheduled us. Switch away.
1808 * Exiting the critical section will cause splz() to be called
1809 * for us if interrupts and such are pending.
1812 tsleep(&dd
->helper_thread
, PINTERLOCKED
, "schslp", 0);
1816 /* sysctl stick_to_level parameter */
1818 sysctl_usched_bsd4_stick_to_level(SYSCTL_HANDLER_ARGS
)
1822 new_val
= usched_bsd4_stick_to_level
;
1824 error
= sysctl_handle_int(oidp
, &new_val
, 0, req
);
1825 if (error
!= 0 || req
->newptr
== NULL
)
1827 if (new_val
> cpu_topology_levels_number
- 1 || new_val
< 0)
1829 usched_bsd4_stick_to_level
= new_val
;
1834 * Setup our scheduler helpers. Note that curprocmask bit 0 has already
1835 * been cleared by rqinit() and we should not mess with it further.
1838 sched_thread_cpu_init(void)
1842 int smt_not_supported
= 0;
1843 int cache_coherent_not_supported
= 0;
1846 kprintf("Start scheduler helpers on cpus:\n");
1848 sysctl_ctx_init(&usched_bsd4_sysctl_ctx
);
1849 usched_bsd4_sysctl_tree
=
1850 SYSCTL_ADD_NODE(&usched_bsd4_sysctl_ctx
,
1851 SYSCTL_STATIC_CHILDREN(_kern
), OID_AUTO
,
1852 "usched_bsd4", CTLFLAG_RD
, 0, "");
1854 for (i
= 0; i
< ncpus
; ++i
) {
1855 bsd4_pcpu_t dd
= &bsd4_pcpu
[i
];
1856 cpumask_t mask
= CPUMASK(i
);
1858 if ((mask
& smp_active_mask
) == 0)
1861 dd
->cpunode
= get_cpu_node_by_cpuid(i
);
1863 if (dd
->cpunode
== NULL
) {
1864 smt_not_supported
= 1;
1865 cache_coherent_not_supported
= 1;
1867 kprintf ("\tcpu%d - WARNING: No CPU NODE "
1868 "found for cpu\n", i
);
1870 switch (dd
->cpunode
->type
) {
1873 kprintf ("\tcpu%d - HyperThreading "
1874 "available. Core siblings: ",
1878 smt_not_supported
= 1;
1881 kprintf ("\tcpu%d - No HT available, "
1882 "multi-core/physical "
1883 "cpu. Physical siblings: ",
1887 smt_not_supported
= 1;
1890 kprintf ("\tcpu%d - No HT available, "
1891 "single-core/physical cpu. "
1892 "Package Siblings: ",
1896 /* Let's go for safe defaults here */
1897 smt_not_supported
= 1;
1898 cache_coherent_not_supported
= 1;
1900 kprintf ("\tcpu%d - Unknown cpunode->"
1901 "type=%u. Siblings: ",
1903 (u_int
)dd
->cpunode
->type
);
1908 if (dd
->cpunode
->parent_node
!= NULL
) {
1909 CPUSET_FOREACH(cpuid
, dd
->cpunode
->parent_node
->members
)
1910 kprintf("cpu%d ", cpuid
);
1913 kprintf(" no siblings\n");
1918 lwkt_create(sched_thread
, NULL
, NULL
, &dd
->helper_thread
,
1919 0, i
, "usched %d", i
);
1922 * Allow user scheduling on the target cpu. cpu #0 has already
1923 * been enabled in rqinit().
1926 atomic_clear_cpumask(&bsd4_curprocmask
, mask
);
1927 atomic_set_cpumask(&bsd4_rdyprocmask
, mask
);
1928 dd
->upri
= PRIBASE_NULL
;
1932 /* usched_bsd4 sysctl configurable parameters */
1934 SYSCTL_ADD_INT(&usched_bsd4_sysctl_ctx
,
1935 SYSCTL_CHILDREN(usched_bsd4_sysctl_tree
),
1936 OID_AUTO
, "rrinterval", CTLFLAG_RW
,
1937 &usched_bsd4_rrinterval
, 0, "");
1938 SYSCTL_ADD_INT(&usched_bsd4_sysctl_ctx
,
1939 SYSCTL_CHILDREN(usched_bsd4_sysctl_tree
),
1940 OID_AUTO
, "decay", CTLFLAG_RW
,
1941 &usched_bsd4_decay
, 0, "Extra decay when not running");
1942 SYSCTL_ADD_INT(&usched_bsd4_sysctl_ctx
,
1943 SYSCTL_CHILDREN(usched_bsd4_sysctl_tree
),
1944 OID_AUTO
, "batch_time", CTLFLAG_RW
,
1945 &usched_bsd4_batch_time
, 0, "Min batch counter value");
1946 SYSCTL_ADD_LONG(&usched_bsd4_sysctl_ctx
,
1947 SYSCTL_CHILDREN(usched_bsd4_sysctl_tree
),
1948 OID_AUTO
, "kicks", CTLFLAG_RW
,
1949 &usched_bsd4_kicks
, "Number of kickstarts");
1951 /* Add enable/disable option for SMT scheduling if supported */
1952 if (smt_not_supported
) {
1953 usched_bsd4_smt
= 0;
1954 SYSCTL_ADD_STRING(&usched_bsd4_sysctl_ctx
,
1955 SYSCTL_CHILDREN(usched_bsd4_sysctl_tree
),
1956 OID_AUTO
, "smt", CTLFLAG_RD
,
1957 "NOT SUPPORTED", 0, "SMT NOT SUPPORTED");
1959 usched_bsd4_smt
= 1;
1960 SYSCTL_ADD_INT(&usched_bsd4_sysctl_ctx
,
1961 SYSCTL_CHILDREN(usched_bsd4_sysctl_tree
),
1962 OID_AUTO
, "smt", CTLFLAG_RW
,
1963 &usched_bsd4_smt
, 0, "Enable SMT scheduling");
1967 * Add enable/disable option for cache coherent scheduling
1970 if (cache_coherent_not_supported
) {
1971 usched_bsd4_cache_coherent
= 0;
1972 SYSCTL_ADD_STRING(&usched_bsd4_sysctl_ctx
,
1973 SYSCTL_CHILDREN(usched_bsd4_sysctl_tree
),
1974 OID_AUTO
, "cache_coherent", CTLFLAG_RD
,
1976 "Cache coherence NOT SUPPORTED");
1978 usched_bsd4_cache_coherent
= 1;
1979 SYSCTL_ADD_INT(&usched_bsd4_sysctl_ctx
,
1980 SYSCTL_CHILDREN(usched_bsd4_sysctl_tree
),
1981 OID_AUTO
, "cache_coherent", CTLFLAG_RW
,
1982 &usched_bsd4_cache_coherent
, 0,
1983 "Enable/Disable cache coherent scheduling");
1985 SYSCTL_ADD_INT(&usched_bsd4_sysctl_ctx
,
1986 SYSCTL_CHILDREN(usched_bsd4_sysctl_tree
),
1987 OID_AUTO
, "upri_affinity", CTLFLAG_RW
,
1988 &usched_bsd4_upri_affinity
, 1,
1989 "Number of PPQs in user priority check");
1991 SYSCTL_ADD_INT(&usched_bsd4_sysctl_ctx
,
1992 SYSCTL_CHILDREN(usched_bsd4_sysctl_tree
),
1993 OID_AUTO
, "queue_checks", CTLFLAG_RW
,
1994 &usched_bsd4_queue_checks
, 5,
1995 "LWPs to check from a queue before giving up");
1997 SYSCTL_ADD_PROC(&usched_bsd4_sysctl_ctx
,
1998 SYSCTL_CHILDREN(usched_bsd4_sysctl_tree
),
1999 OID_AUTO
, "stick_to_level",
2000 CTLTYPE_INT
| CTLFLAG_RW
,
2001 NULL
, sizeof usched_bsd4_stick_to_level
,
2002 sysctl_usched_bsd4_stick_to_level
, "I",
2003 "Stick a process to this level. See sysctl"
2004 "paremter hw.cpu_topology.level_description");
2007 SYSINIT(uschedtd
, SI_BOOT2_USCHED
, SI_ORDER_SECOND
,
2008 sched_thread_cpu_init
, NULL
)