cvs commit: src/sys/amd64/amd64 cpu_switch.S machdep.c

Andrew Gallatin gallatin at cs.duke.edu
Tue Oct 18 08:54:44 PDT 2005


John Baldwin writes:
 > On Tuesday 18 October 2005 09:44 am, Andrew Gallatin wrote:
 > > David Xu [davidxu at FreeBSD.org] wrote:
 > > > davidxu     2005-10-17 23:10:31 UTC
 > > >
 > > >   FreeBSD src repository
 > > >
 > > >   Modified files:
 > > >     sys/amd64/amd64      cpu_switch.S machdep.c
 > > >   Log:
 > > >   Micro optimization for context switch. Eliminate code for saving
 > > > gs.base and fs.base. We always update pcb.pcb_gsbase and pcb.pcb_fsbase
 > > > when user wants to set them, in context switch routine, we only need to
 > > > write them into registers, we never have to read them out from registers
 > > > when thread is switched away. Since rdmsr is a serialization instruction,
 > > > micro benchmark shows it is worthy to do.
 > >
 > > Nice.  This reduces lmbench context switch latency by about 0.4us (7.2
 > > -> 6.8us), and reduces TCP loopback latency by about 0.9us (36.1 ->
 > > 35.2) on my dual core 3800+
 > >
 > > It is a shame we can't find a way to use the TSC as a timecounter on
 > > SMP systems.  It seems that about 40% of the context switch time is
 > > spent just waiting for the PIO read of the ACPI-fast or i8254 to
 > > return.
 > 
 > You can try it by just setting the kern.timecounter.smp_tsc=1 tunable on boot.

Yes, that's how I get my figure of 3us for PIO read, and 3.8us for the
rest of the context switch.  But its not currently practical on most
machines, since we don't sync the TSC between cpus, or do anything to
account for drift.

Drew



More information about the cvs-src mailing list