Re: [PATCH] KVM: VMX: Move vmx_vcpu_run()'s VM-Enter asm blob to a helper function

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




On 1/15/19 8:10 PM, Sean Christopherson wrote:
> ...along with the function's STACK_FRAME_NON_STANDARD tag.  Moving the
> asm blob results in a significantly smaller amount of code that is
> marked with STACK_FRAME_NON_STANDARD, which makes it far less likely
> that gcc will split the function and trigger a spurious objtool warning.
> As a bonus, removing STACK_FRAME_NON_STANDARD from vmx_vcpu_run() allows
> the bulk of code to be properly checked by objtool.
> 
> Because %rbp is not loaded via VMCS fields, vmx_vcpu_run() must manually
> save/restore the host's RBP and load the guest's RBP prior to calling
> vmx_vmenter().  Modifying %rbp triggers objtool's stack validation code,
> and so vmx_vcpu_run() is tagged with STACK_FRAME_NON_STANDARD since it's
> impossible to avoid modifying %rbp.
> 
> Unfortunately, vmx_vcpu_run() is also a gigantic function that gcc will
> split into separate functions, e.g. so that pieces of the function can
> be inlined.  Splitting the function means that the compiled Elf file
> will contain one or more vmx_vcpu_run.part.* functions in addition to
> a vmx_vcpu_run function.  Depending on where the function is split,
> objtool may warn about a "call without frame pointer save/setup" in
> vmx_vcpu_run.part.* since objtool's stack validation looks for exact
> names when whitelisting functions tagged with STACK_FRAME_NON_STANDARD.
> 
> Up until recently, the undesirable function splitting was effectively
> blocked because vmx_vcpu_run() was tagged with __noclone.  At the time,
> __noclone had an unintended side effect that put vmx_vcpu_run() into a
> separate optimization unit, which in turn prevented gcc from inlining
> the function (or any of its own function calls) and thus eliminated gcc's
> motivation to split the function.  Removing the __noclone attribute
> allowed gcc to optimize vmx_vcpu_run(), exposing the objtool warning.
> 
> Kudos to Qian Cai for root causing that the fnsplit optimization is what
> caused objtool to complain.
> 
> Fixes: 453eafbe65f7 ("KVM: VMX: Move VM-Enter + VM-Exit handling to non-inline sub-routines")
> Cc: Qian Cai <cai@xxxxxx>
> Cc: Josh Poimboeuf <jpoimboe@xxxxxxxxxx>
> Reported-by: kbuild test robot <lkp@xxxxxxxxx>
> Signed-off-by: Sean Christopherson <sean.j.christopherson@xxxxxxxxx>

Tested-by: Qian Cai <cai@xxxxxx>



[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux