On Tue, Dec 14 2021 at 15:09, Wei W. Wang wrote: > On Tuesday, December 14, 2021 10:50 AM, Thomas Gleixner wrote: >> + * Return: 0 on success, error code otherwise */ int >> +__fpu_update_guest_features(struct fpu_guest *guest_fpu, u64 xcr0, u64 >> +xfd) { > > I think there would be one issue for the "host write on restore" case. > The current QEMU based host restore uses the following sequence: > 1) restore xsave > 2) restore xcr0 > 3) restore XFD MSR This needs to be fixed. Ordering clearly needs to be: XFD, XCR0, XSTATE > At the time of "1) restore xsave", KVM already needs fpstate expansion > before restoring the xsave data. > So the 2 APIs here might not be usable for this usage. > Our current solution to fpstate expansion at KVM_SET_XSAVE (i.e. step 1) above) is: > > kvm_load_guest_fpu(vcpu); > guest_fpu->realloc_request = realloc_request; > kvm_put_guest_fpu(vcpu); > > "realloc_request" above is generated from the "xstate_header" received from userspace. That's a horrible hack. Please fix the ordering in QEMU. Trying to accomodate for nonsensical use cases in the kernel is just wrong. That's like you expect the following to work: u8 *p = mmap(NULL, 4096, ....); p[8192] = x; It rightfully explodes in your face and you can keep the pieces. Having ordering constraints vs. these 3 involved parts is just sensible. Thanks, tglx