diff options
author | davidxu <davidxu@FreeBSD.org> | 2005-08-08 14:20:10 +0000 |
---|---|---|
committer | davidxu <davidxu@FreeBSD.org> | 2005-08-08 14:20:10 +0000 |
commit | fee0e762f42a8f6f4569dc42ae7c610d16e614f5 (patch) | |
tree | 50c7377b955eb6edee3ba21ae23dc03caa58d254 /sys | |
parent | 98f63133a9867a23f4caf0e10d4e921008fbefc4 (diff) | |
download | FreeBSD-src-fee0e762f42a8f6f4569dc42ae7c610d16e614f5.zip FreeBSD-src-fee0e762f42a8f6f4569dc42ae7c610d16e614f5.tar.gz |
Try best to keep a preempted thread at front of run queue, this seems
improved performance a bit for some workloads, but still seeing interactive
lagging unless cpu idling race is fixed.
Diffstat (limited to 'sys')
-rw-r--r-- | sys/kern/sched_ule.c | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/sys/kern/sched_ule.c b/sys/kern/sched_ule.c index 886ce81..233890f 100644 --- a/sys/kern/sched_ule.c +++ b/sys/kern/sched_ule.c @@ -123,6 +123,7 @@ struct kse { #define KEF_HOLD 0x0008 /* Thread is temporarily bound. */ #define KEF_REMOVED 0x0010 /* Thread was removed while ASSIGNED */ #define KEF_INTERNAL 0x0020 /* Thread added due to migration. */ +#define KEF_PREEMPTED 0x0040 /* Thread was preempted */ #define KEF_DIDRUN 0x02000 /* Thread actually ran. */ #define KEF_EXIT 0x04000 /* Thread is being killed. */ @@ -205,7 +206,8 @@ static struct kg_sched kg_sched0; #define SCHED_INTERACTIVE(kg) \ (sched_interact_score(kg) < SCHED_INTERACT_THRESH) #define SCHED_CURR(kg, ke) \ - ((ke->ke_thread->td_flags & TDF_BORROWING) || SCHED_INTERACTIVE(kg)) + ((ke->ke_thread->td_flags & TDF_BORROWING) || \ + (ke->ke_flags & KEF_PREEMPTED) || SCHED_INTERACTIVE(kg)) /* * Cpu percentage computation macros and defines. @@ -350,6 +352,8 @@ kseq_runq_add(struct kseq *kseq, struct kse *ke, int flags) ke->ke_flags |= KEF_XFERABLE; } #endif + if (ke->ke_flags & KEF_PREEMPTED) + flags |= SRQ_PREEMPTED; runq_add(ke->ke_runq, ke, flags); } @@ -1734,6 +1738,7 @@ restart: #endif kseq_runq_rem(kseq, ke); ke->ke_state = KES_THREAD; + ke->ke_flags &= ~KEF_PREEMPTED; return (ke); } #ifdef SMP @@ -1781,6 +1786,8 @@ sched_add(struct thread *td, int flags) ("sched_add: process swapped out")); KASSERT(ke->ke_runq == NULL, ("sched_add: KSE %p is still assigned to a run queue", ke)); + if (flags & SRQ_PREEMPTED) + ke->ke_flags |= KEF_PREEMPTED; switch (class) { case PRI_ITHD: case PRI_REALTIME: @@ -1871,6 +1878,7 @@ sched_rem(struct thread *td) mtx_assert(&sched_lock, MA_OWNED); ke = td->td_kse; SLOT_RELEASE(td->td_ksegrp); + ke->ke_flags &= ~KEF_PREEMPTED; if (ke->ke_flags & KEF_ASSIGNED) { ke->ke_flags |= KEF_REMOVED; return; |