diff options
author | jhb <jhb@FreeBSD.org> | 2012-01-03 21:03:28 +0000 |
---|---|---|
committer | jhb <jhb@FreeBSD.org> | 2012-01-03 21:03:28 +0000 |
commit | b759911211e03135d6bf5a0eaaf1f806eeeeff88 (patch) | |
tree | 89ea291cf034389fe88d6494a07b7354f8f61c8d /sys/kern/sched_4bsd.c | |
parent | 0c5a3f31efc71beb9a4e0e208ad135288a8142a5 (diff) | |
download | FreeBSD-src-b759911211e03135d6bf5a0eaaf1f806eeeeff88.zip FreeBSD-src-b759911211e03135d6bf5a0eaaf1f806eeeeff88.tar.gz |
Some small fixes to CPU accounting for threads:
- Only initialize the per-cpu switchticks and switchtime in sched_throw()
for the very first context switch on APs during boot. This avoids a
small gap between the middle of thread_exit() and sched_throw() where
time is not accounted to any thread.
- In thread_exit(), update the timestamp bookkeeping to track the changes
to mi_switch() introduced by td_rux so that the code once again matches
the comment claiming it is mimicing mi_switch(). Specifically, only
update the per-thread stats directly and depend on ruxagg() to update
p_rux rather than adjusting p_rux directly. While here, move the
timestamp bookkeeping as late in the function as possible.
Reviewed by: bde, kib
MFC after: 1 week
Diffstat (limited to 'sys/kern/sched_4bsd.c')
-rw-r--r-- | sys/kern/sched_4bsd.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/sys/kern/sched_4bsd.c b/sys/kern/sched_4bsd.c index 0fd6481..16cc033 100644 --- a/sys/kern/sched_4bsd.c +++ b/sys/kern/sched_4bsd.c @@ -1572,14 +1572,14 @@ sched_throw(struct thread *td) if (td == NULL) { mtx_lock_spin(&sched_lock); spinlock_exit(); + PCPU_SET(switchtime, cpu_ticks()); + PCPU_SET(switchticks, ticks); } else { lock_profile_release_lock(&sched_lock.lock_object); MPASS(td->td_lock == &sched_lock); } mtx_assert(&sched_lock, MA_OWNED); KASSERT(curthread->td_md.md_spinlock_count == 1, ("invalid count")); - PCPU_SET(switchtime, cpu_ticks()); - PCPU_SET(switchticks, ticks); cpu_throw(td, choosethread()); /* doesn't return */ } |