John Baldwin jhb at freebsd.org
Mon Jul 9 15:38:21 UTC 2012

On Sunday, July 08, 2012 11:02:25 am Konstantin Belousov wrote:
> Please find at
> http://people.freebsd.org/~kib/misc/xsaveopt.1.patch
> a patch to finally add suport for using XSAVEOPT for our amd64 context
> switch code. See Intel SDM for description of the XSAVEOPT instruction.
> Summary is that the instruction allows to not write parts of the FPU
> state which was not touched by the thread. Context switch then would
> write less to the PCB when thread is moved out from CPU. This is mainly
> to facilitate the ever-growing size of the FPU register file, in
> particular, AVX/YMM registers. Normal applications do not touch YMM, so
> saving them on each context switch if FPU was used is waste.
> Main complication is that any consumer of the ucontext_t still expect to
> see fully populated machine state, including the extended states which were
> not saved. Since CPU only avoids save when corresponding state is pristine,
> we can use the copy of initial state. CPUID provides an enumerator that
> allows OS to easily pick up neccesary area and copy over.
> I tried hard, but was unable to measure any statistically significant
> difference in the context switch times between XSAVE and XSAVEOPT using
> lmbench lat_ctx, on Core i7 2600K.

Hmm, I thought one of the ideas of xsaveopt was to let you just always execute
it during a context switch and dispense with the need for using the CR0_TS 
flag at all?  Maybe that isn't true though.  It would seem rather silly to
switch out the state if you don't need to (when preempting a thread that uses 
the FPU to run a thread that doesn't and then switching back for example).

John Baldwin

More information about the freebsd-amd64 mailing list