From 5151eeb194da7edef5eafdd2e5f87a33819f1eaa Mon Sep 17 00:00:00 2001 From: David Xu Date: Thu, 29 Jun 2006 12:29:20 +0000 Subject: [PATCH] Fix a bug when accumulating run time, if a thread calls yield() syscall, its run time may be lost. --- sys/kern/sched_core.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/sys/kern/sched_core.c b/sys/kern/sched_core.c index 9ce90c88d51..f0c4fc27d29 100644 --- a/sys/kern/sched_core.c +++ b/sys/kern/sched_core.c @@ -957,6 +957,7 @@ sched_switch(struct thread *td, struct thread *newtd, int flags) mtx_assert(&sched_lock, MA_OWNED); + now = sched_timestamp(); ke = td->td_kse; kg = td->td_ksegrp; ksq = KSEQ_SELF(); @@ -969,6 +970,7 @@ sched_switch(struct thread *td, struct thread *newtd, int flags) if (td == PCPU_GET(idlethread)) { TD_SET_CAN_RUN(td); } else { + sched_update_runtime(ke, now); /* We are ending our run so make our slot available again */ SLOT_RELEASE(td->td_ksegrp); kseq_load_rem(ksq, ke); @@ -999,16 +1001,14 @@ sched_switch(struct thread *td, struct thread *newtd, int flags) */ SLOT_USE(newtd->td_ksegrp); newtd->td_kse->ke_flags |= KEF_DIDRUN; + newtd->td_kse->ke_timestamp = now; TD_SET_RUNNING(newtd); kseq_load_add(ksq, newtd->td_kse); - now = newtd->td_kse->ke_timestamp = sched_timestamp(); } else { newtd = choosethread(); /* sched_choose sets ke_timestamp, just reuse it */ - now = newtd->td_kse->ke_timestamp; } if (td != newtd) { - sched_update_runtime(ke, now); ke->ke_lastran = tick; #ifdef HWPMC_HOOKS @@ -1074,9 +1074,9 @@ sched_wakeup(struct thread *td) if (ke->ke_flags & KEF_SLEEP) { ke->ke_flags &= ~KEF_SLEEP; if (sched_is_timeshare(kg)) { - kseq = KSEQ_CPU(td->td_lastcpu); - now = sched_timestamp(); sched_commit_runtime(ke); + now = sched_timestamp(); + kseq = KSEQ_CPU(td->td_lastcpu); #ifdef SMP if (kseq != mykseq) now = now - mykseq->ksq_last_timestamp +