Currently fpu management is only lazy in one direction. When we switch into a task, we may avoid loading the fpu state in the hope that the task will never use it. If we guess right we save an fpu load/save cycle; if not, a Device not Available exception will remind us to load the fpu. However, in the other direction, fpu management is eager. When we switch out of an fpu-using task, we always save its fpu state. This is wasteful if the task(s) that run until we switch back in all don't use the fpu, since we could have kept the task's fpu on the cpu all this time and saved an fpu save/load cycle. This can be quite common with threaded interrupts, but will also happen with normal kernel threads and even normal user tasks. This patch series converts task fpu management to be fully lazy. When switching out of a task, we keep its fpu state on the cpu, only flushing it if some other task needs the fpu. Open issues/TODO: - patch 2 enables interrupts during #NM. There's a comment that says it shouldn't be done, presumably because of old-style #FERR handling. Need to fix one way or the other (dropping #FERR support, eagerly saving state when #FERR is detected, or dropping the entire optimization on i386) - flush fpu state on cpu offlining (trivial) - make sure the AMD FXSAVE workaround still works correctly - reduce IPIs by flushing fpu state when we know a task is being migrated (guidance from scheduler folk appreciated) - preemptible kernel_fpu_begin() to improve latency on raid and crypto setups (will post patches) - lazy host-side kvm fpu management (will post patches) - accelerate signal delivery by allocating signal handlers their own fpu state, and letting them run with the normal task's fpu until they use an fp instruction (will generously leave to interested parties) Avi Kivity (4): x86, fpu: merge __save_init_fpu() implementations x86, fpu: run device not available trap with interrupts enabled x86, fpu: Let the fpu remember which cpu it is active on x86, fpu: don't save fpu state when switching from a task arch/x86/include/asm/i387.h | 126 +++++++++++++++++++++++++++++++++----- arch/x86/include/asm/processor.h | 4 + arch/x86/kernel/i387.c | 3 + arch/x86/kernel/process.c | 1 + arch/x86/kernel/process_32.c | 12 +++- arch/x86/kernel/process_64.c | 13 +++-- arch/x86/kernel/traps.c | 13 ++--- 7 files changed, 139 insertions(+), 33 deletions(-) -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html