From: Andy Lutomirski > Sent: 20 March 2018 14:57 ... > I'd rather see us finally finish the work that Rik started to rework > this differently. I'd like kernel_fpu_begin() to look like: > > if (test_thread_flag(TIF_NEED_FPU_RESTORE)) { > return; // we're already okay. maybe we need to check > in_interrupt() or something, though? > } else { > XSAVES/XSAVEOPT/XSAVE; > set_thread_flag(TIF_NEED_FPU_RESTORE): > } > > and kernel_fpu_end() does nothing at all.
I guess it might need to set (clear?) the CFLAGS bit for a process that isn't using the fpu at all - which seems a sensible feature. > We take the full performance hit for a *single* kernel_fpu_begin() on > an otherwise short syscall or interrupt, but there's no additional > cost for more of them or for long-enough-running things that we > schedule in the middle. It might be worth adding a parameter to kernel_fpu_begin() to indicate which registers are needed, and a return value to say what has been granted. Then a driver could request AVX2 (for example) and use a fallback path if the register set isn't available (for any reason). A call from an ISR could always fail. > As I remember, the main hangup was that this interacts a bit oddly > with PKRU, but that's manageable. WTF PKRU ?? Dvaid