s390/fpu: improve kernel_fpu_[begin|end]
authorMartin Schwidefsky <schwidefsky@de.ibm.com>
Mon, 22 Aug 2016 10:06:21 +0000 (12:06 +0200)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Mon, 29 Aug 2016 09:05:01 +0000 (11:05 +0200)
commit7f79695cc1b6aa6d80a861780d9f8ce75d3dddcb
treedd34f15ed90df7e9920e29b753aa2ff0cf6feff3
parent0eab11c7e0d30de14a15ccd8269eef238321a8e1
s390/fpu: improve kernel_fpu_[begin|end]

In case of nested user of the FPU or vector registers in the kernel
the current code uses the mask of the FPU/vector registers of the
previous contexts to decide which registers to save and restore.
E.g. if the previous context used KERNEL_VXR_V0V7 and the next
context wants to use KERNEL_VXR_V24V31 the first 8 vector registers
are stored to the FPU state structure. But this is not necessary
as the next context does not use these registers.

Rework the FPU/vector register save and restore code. The new code
does a few things differently:
1) A lowcore field is used instead of a per-cpu variable.
2) The kernel_fpu_end function now has two parameters just like
   kernel_fpu_begin. The register flags are required by both
   functions to save / restore the minimal register set.
3) The inline functions kernel_fpu_begin/kernel_fpu_end now do the
   update of the register masks. If the user space FPU registers
   have already been stored neither save_fpu_regs nor the
   __kernel_fpu_begin/__kernel_fpu_end functions have to be called
   for the first context. In this case kernel_fpu_begin adds 7
   instructions and kernel_fpu_end adds 4 instructions.
3) The inline assemblies in __kernel_fpu_begin / __kernel_fpu_end
   to save / restore the vector registers are simplified a bit.

Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
arch/s390/crypto/crc32-vx.c
arch/s390/include/asm/fpu/api.h
arch/s390/include/asm/lowcore.h
arch/s390/kernel/fpu.c
arch/s390/kernel/sysinfo.c