On 2018-09-17 10:37:20 [+0200], Paolo Bonzini wrote: > > . This is (again) > > untested since I have no box with this PKRU feature. This only available > > on Intel's Xeon Scalable, right? > > It is available on QEMU too (the slower JIT thing without KVM, i.e. use > /usr/bin/qemu-system-x86_64 instead of /usr/bin/qemu-kvm or /usr/bin/kvm). okay. I managed to get the kernel to report this flag as available now. > > - if (preload) > > - __fpregs_load_activate(new_fpu, cpu); > > + if (!preload) > > + return; > > + > > + __fpregs_load_activate(new_fpu, cpu); > > + > > +#ifdef CONFIG_X86_INTEL_MEMORY_PROTECTION_KEYS > > + /* Protection keys need to be in place right at context switch time. */ > > + if (boot_cpu_has(X86_FEATURE_OSPKE)) { > > + if (new_fpu->pkru != __read_pkru()) > > + __write_pkru(new_fpu->pkru); > > + } > > +#endif > > I think this would be before the "if (preload)"? I did not find an explicit loading of pkru except this "xrestore" which happens on "preload". From what I saw, preload was always set except for kernel threads. Based on that, it looks to me like it can be skipped if there is no FPU/kernel thread. > > > > if (boot_cpu_has(X86_FEATURE_OSPKE)) > > - copy_init_pkru_to_fpregs(); > > + pkru_set_init_value(); > > } > > > > Likewise, move this to fpu__clear and outside "if > (static_cpu_has(X86_FEATURE_FPU))"? okay. But if there is no FPU we did not save/restore the pkru value. Is this supposed to be an improvement? > Also, a __read_pkru() seems to be missing in switch_fpu_prepare. But the value is stored during write_pkru(). So the copy that is saved should be identical to the value that would be read, correct? > > Thanks, > > Paolo Sebastian