diff options
| author | David Xu <davidxu@FreeBSD.org> | 2006-12-23 00:39:56 +0000 |
|---|---|---|
| committer | David Xu <davidxu@FreeBSD.org> | 2006-12-23 00:39:56 +0000 |
| commit | 0ce9f6ebd7ba56f5c01c1457d8a337617ee5533d (patch) | |
| tree | 465b6e6587015c58aaad6faba6b26b8d37da8ac9 | |
| parent | 4b7a2c6f9400a35e180fe64c83fbdc56f80b82b4 (diff) | |
Notes
| -rw-r--r-- | sys/kern/kern_switch.c | 82 |
1 files changed, 52 insertions, 30 deletions
diff --git a/sys/kern/kern_switch.c b/sys/kern/kern_switch.c index b5c813059b3f..d1a3b34559d9 100644 --- a/sys/kern/kern_switch.c +++ b/sys/kern/kern_switch.c @@ -342,40 +342,52 @@ adjustrunqueue( struct thread *td, int newpri) static void maybe_preempt_in_ksegrp(struct thread *td) -#if !defined(SMP) +#if !defined(SMP) { - struct thread *running_thread; + struct thread *ctd; +#ifdef PREEMPTION + int cpri, pri; +#endif mtx_assert(&sched_lock, MA_OWNED); - running_thread = curthread; + ctd = curthread; - if (running_thread->td_ksegrp != td->td_ksegrp) +#ifdef PREEMPTION + KASSERT ((ctd->td_kse != NULL && ctd->td_kse->ke_thread == ctd), + ("thread has no (or wrong) sched-private part.")); + KASSERT((td->td_inhibitors == 0), + ("maybe_preempt: trying to run inhibitted thread")); + pri = td->td_priority; + cpri = ctd->td_priority; + if (panicstr != NULL || pri >= cpri || cold /* || dumping */ || + TD_IS_INHIBITED(ctd) || td->td_kse->ke_state != KES_THREAD) return; - - if (td->td_priority >= running_thread->td_priority) + if (ctd->td_ksegrp != td->td_ksegrp) return; -#ifdef PREEMPTION #ifndef FULL_PREEMPTION if (td->td_priority > PRI_MAX_ITHD) { - running_thread->td_flags |= TDF_NEEDRESCHED; + ctd->td_flags |= TDF_NEEDRESCHED; return; } #endif /* FULL_PREEMPTION */ - if (running_thread->td_critnest > 1) - running_thread->td_owepreempt = 1; - else - mi_switch(SW_INVOL, NULL); + if (ctd->td_critnest > 1) + ctd->td_owepreempt = 1; + else + mi_switch(SW_INVOL, NULL); #else /* PREEMPTION */ - running_thread->td_flags |= TDF_NEEDRESCHED; + ctd->td_flags |= TDF_NEEDRESCHED; #endif /* PREEMPTION */ return; } #else /* SMP */ { - struct thread *running_thread; + struct thread *ctd; +#ifdef PREEMPTION + int cpri, pri; +#endif int worst_pri; struct ksegrp *kg; cpumask_t cpumask,dontuse; @@ -384,11 +396,22 @@ maybe_preempt_in_ksegrp(struct thread *td) struct thread *cputhread; mtx_assert(&sched_lock, MA_OWNED); + ctd = curthread; - running_thread = curthread; +#ifdef PREEMPTION + KASSERT((ctd->td_kse != NULL && ctd->td_kse->ke_thread == ctd), + ("thread has no (or wrong) sched-private part.")); + KASSERT((td->td_inhibitors == 0), + ("maybe_preempt: trying to run inhibitted thread")); + pri = td->td_priority; + cpri = ctd->td_priority; + if (panicstr != NULL || pri >= cpri || cold /* || dumping */ || + TD_IS_INHIBITED(ctd) || td->td_kse->ke_state != KES_THREAD) + return; +#endif #if !defined(KSEG_PEEMPT_BEST_CPU) - if (running_thread->td_ksegrp != td->td_ksegrp) { + if (ctd->td_ksegrp != td->td_ksegrp) { #endif kg = td->td_ksegrp; @@ -436,10 +459,10 @@ maybe_preempt_in_ksegrp(struct thread *td) #if !defined(FULL_PREEMPTION) if (td->td_priority <= PRI_MAX_ITHD) #endif /* ! FULL_PREEMPTION */ - { - ipi_selected(best_pcpu->pc_cpumask, IPI_PREEMPT); - return; - } + { + ipi_selected(best_pcpu->pc_cpumask, IPI_PREEMPT); + return; + } #endif /* defined(IPI_PREEMPTION) && defined(PREEMPTION) */ if (PCPU_GET(cpuid) != best_pcpu->pc_cpuid) { @@ -448,26 +471,25 @@ maybe_preempt_in_ksegrp(struct thread *td) return; } #if !defined(KSEG_PEEMPT_BEST_CPU) - } + } #endif - if (td->td_priority >= running_thread->td_priority) + if (td->td_priority >= ctd->td_priority) return; #ifdef PREEMPTION #if !defined(FULL_PREEMPTION) - if (td->td_priority > PRI_MAX_ITHD) { - running_thread->td_flags |= TDF_NEEDRESCHED; - } + if (td->td_priority > PRI_MAX_ITHD) + ctd->td_flags |= TDF_NEEDRESCHED; #endif /* ! FULL_PREEMPTION */ - if (running_thread->td_critnest > 1) - running_thread->td_owepreempt = 1; - else - mi_switch(SW_INVOL, NULL); + if (ctd->td_critnest > 1) + ctd->td_owepreempt = 1; + else + mi_switch(SW_INVOL, NULL); #else /* PREEMPTION */ - running_thread->td_flags |= TDF_NEEDRESCHED; + ctd->td_flags |= TDF_NEEDRESCHED; #endif /* PREEMPTION */ return; } |
