| From 51696f39cbee5bb684e7959c0c98b5f54548aa34 Mon Sep 17 00:00:00 2001 |
| From: Nathan Chancellor <nathan@kernel.org> |
| Date: Mon, 21 Jun 2021 11:24:40 -0700 |
| Subject: KVM: PPC: Book3S HV: Workaround high stack usage with clang |
| |
| From: Nathan Chancellor <nathan@kernel.org> |
| |
| commit 51696f39cbee5bb684e7959c0c98b5f54548aa34 upstream. |
| |
| LLVM does not emit optimal byteswap assembly, which results in high |
| stack usage in kvmhv_enter_nested_guest() due to the inlining of |
| byteswap_pt_regs(). With LLVM 12.0.0: |
| |
| arch/powerpc/kvm/book3s_hv_nested.c:289:6: error: stack frame size of |
| 2512 bytes in function 'kvmhv_enter_nested_guest' [-Werror,-Wframe-larger-than=] |
| long kvmhv_enter_nested_guest(struct kvm_vcpu *vcpu) |
| ^ |
| 1 error generated. |
| |
| While this gets fixed in LLVM, mark byteswap_pt_regs() as |
| noinline_for_stack so that it does not get inlined and break the build |
| due to -Werror by default in arch/powerpc/. Not inlining saves |
| approximately 800 bytes with LLVM 12.0.0: |
| |
| arch/powerpc/kvm/book3s_hv_nested.c:290:6: warning: stack frame size of |
| 1728 bytes in function 'kvmhv_enter_nested_guest' [-Wframe-larger-than=] |
| long kvmhv_enter_nested_guest(struct kvm_vcpu *vcpu) |
| ^ |
| 1 warning generated. |
| |
| Cc: stable@vger.kernel.org # v4.20+ |
| Reported-by: kernel test robot <lkp@intel.com> |
| Signed-off-by: Nathan Chancellor <nathan@kernel.org> |
| Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> |
| Link: https://github.com/ClangBuiltLinux/linux/issues/1292 |
| Link: https://bugs.llvm.org/show_bug.cgi?id=49610 |
| Link: https://lore.kernel.org/r/202104031853.vDT0Qjqj-lkp@intel.com/ |
| Link: https://gist.github.com/ba710e3703bf45043a31e2806c843ffd |
| Link: https://lore.kernel.org/r/20210621182440.990242-1-nathan@kernel.org |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| arch/powerpc/kvm/book3s_hv_nested.c | 3 ++- |
| 1 file changed, 2 insertions(+), 1 deletion(-) |
| |
| --- a/arch/powerpc/kvm/book3s_hv_nested.c |
| +++ b/arch/powerpc/kvm/book3s_hv_nested.c |
| @@ -51,7 +51,8 @@ void kvmhv_save_hv_regs(struct kvm_vcpu |
| hr->ppr = vcpu->arch.ppr; |
| } |
| |
| -static void byteswap_pt_regs(struct pt_regs *regs) |
| +/* Use noinline_for_stack due to https://bugs.llvm.org/show_bug.cgi?id=49610 */ |
| +static noinline_for_stack void byteswap_pt_regs(struct pt_regs *regs) |
| { |
| unsigned long *addr = (unsigned long *) regs; |
| |