Messages in this thread | | | Subject | Re: [PATCH 17/21] x86/fpu: Use proper mask to replace full instruction mask | From | Dave Hansen <> | Date | Mon, 22 Jun 2020 11:05:32 -0700 |
| |
On 6/22/20 10:47 AM, Liang, Kan wrote: >> I'm wondering if we should just take these copy_*regs_to_*() functions >> and uninline them. Yeah, they are basically wrapping one instruction, >> but it might literally be the most heavyweight instruction in the >> whole ISA. > > Thanks for the suggestions, but I'm not sure if I follow these methods. > > I don't think simply removing the "inline" key word for the > copy_xregs_to_kernel() functions would help here. > Do you mean exporting the copy_*regs_to_*()?
The thing that worries me here is exporting "internal" FPU state like xfeatures_mask_all. I'm much happier exporting a function with a much more defined purpose.
So, yes, I'm suggesting exporting the functions, *not* the data structures.
>> Or, maybe just make an out-of-line version for KVM to call? > > I think the out-of-line version for KVM still needs the > xfeatures_mask_all. Because the size of vcpu's XSAVE buffer > (&vcpu->arch.guest_fpu) is the same as other kernel XSAVE buffers, such > as task->fpu. The xfeatures_mask_all is required for KVM to filter out > the dynamic supervisor feature as well. I think even if we make an > out-of-line version for KVM, we still have to export the > xfeatures_mask_all for KVM.
No.
You do this in a .h file:
extern void notinline_copy_xregs_to_kernel(struct xregs_state *xstate);
And then this in a .c file:
void notinline_copy_xregs_to_kernel(struct xregs_state *xstate) { copy_xregs_to_kernel(xstate); } EXPORT_SYMBOL_GPL(notinline_copy_xregs_to_kernel);
KVM now calls notinline_copy_xregs_to_kernel() (not what it should really be called). It does *not* need 'xfeatures_mask_all' exported in this case. That preserves the inlining for core kernel users.
It's not the prettiest situation, but it is straightforward.
| |