Message ID | 20190621093843.220980-3-marc.zyngier@arm.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | KVM: arm64: ARMv8.3 Nested Virtualization support | expand |
On Fri, Jun 21, 2019 at 10:37:46AM +0100, Marc Zyngier wrote: > Having __load_guest_stage2 in kvm_hyp.h is quickly going to trigger > a circular include problem. In order to avoid this, let's move > it to kvm_mmu.h, where it will be a better fit anyway. > > In the process, drop the __hyp_text annotation, which doesn't help > as the function is marked as __always_inline. Does GCC always inline things marked __always_inline? I seem to remember some gotchas in this area, but I may be being paranoid. If this still only called from hyp, I'd be tempted to heep the __hyp_text annotation just to be on the safe side. [...] Cheers ---Dave
On 24/06/2019 12:19, Dave Martin wrote: > On Fri, Jun 21, 2019 at 10:37:46AM +0100, Marc Zyngier wrote: >> Having __load_guest_stage2 in kvm_hyp.h is quickly going to trigger >> a circular include problem. In order to avoid this, let's move >> it to kvm_mmu.h, where it will be a better fit anyway. >> >> In the process, drop the __hyp_text annotation, which doesn't help >> as the function is marked as __always_inline. > > Does GCC always inline things marked __always_inline? > > I seem to remember some gotchas in this area, but I may be being > paranoid. Yes, this is a strong guarantee. Things like static keys rely on that, for example. > > If this still only called from hyp, I'd be tempted to heep the > __hyp_text annotation just to be on the safe side. The trouble with that is that re-introduces the circular dependency with kvm_hyp.h that this patch is trying to break... Thanks, M.
On Wed, Jul 03, 2019 at 10:30:03AM +0100, Marc Zyngier wrote: > On 24/06/2019 12:19, Dave Martin wrote: > > On Fri, Jun 21, 2019 at 10:37:46AM +0100, Marc Zyngier wrote: > >> Having __load_guest_stage2 in kvm_hyp.h is quickly going to trigger > >> a circular include problem. In order to avoid this, let's move > >> it to kvm_mmu.h, where it will be a better fit anyway. > >> > >> In the process, drop the __hyp_text annotation, which doesn't help > >> as the function is marked as __always_inline. > > > > Does GCC always inline things marked __always_inline? > > > > I seem to remember some gotchas in this area, but I may be being > > paranoid. > > Yes, this is a strong guarantee. Things like static keys rely on that, > for example. > > > > > If this still only called from hyp, I'd be tempted to heep the > > __hyp_text annotation just to be on the safe side. > > The trouble with that is that re-introduces the circular dependency with > kvm_hyp.h that this patch is trying to break... Ah, right. I guess it's easier to put up with this, then. Cheers ---Dave
diff --git a/arch/arm64/include/asm/kvm_hyp.h b/arch/arm64/include/asm/kvm_hyp.h index ce99c2daff04..e8044f265824 100644 --- a/arch/arm64/include/asm/kvm_hyp.h +++ b/arch/arm64/include/asm/kvm_hyp.h @@ -21,7 +21,6 @@ #include <linux/compiler.h> #include <linux/kvm_host.h> #include <asm/alternative.h> -#include <asm/kvm_mmu.h> #include <asm/sysreg.h> #define __hyp_text __section(.hyp.text) notrace @@ -116,22 +115,5 @@ void deactivate_traps_vhe_put(void); u64 __guest_enter(struct kvm_vcpu *vcpu, struct kvm_cpu_context *host_ctxt); void __noreturn __hyp_do_panic(unsigned long, ...); -/* - * Must be called from hyp code running at EL2 with an updated VTTBR - * and interrupts disabled. - */ -static __always_inline void __hyp_text __load_guest_stage2(struct kvm *kvm) -{ - write_sysreg(kvm->arch.vtcr, vtcr_el2); - write_sysreg(kvm_get_vttbr(kvm), vttbr_el2); - - /* - * ARM erratum 1165522 requires the actual execution of the above - * before we can switch to the EL1/EL0 translation regime used by - * the guest. - */ - asm(ALTERNATIVE("nop", "isb", ARM64_WORKAROUND_1165522)); -} - #endif /* __ARM64_KVM_HYP_H__ */ diff --git a/arch/arm64/include/asm/kvm_mmu.h b/arch/arm64/include/asm/kvm_mmu.h index ebeefcf835e8..3120ef948fa4 100644 --- a/arch/arm64/include/asm/kvm_mmu.h +++ b/arch/arm64/include/asm/kvm_mmu.h @@ -614,5 +614,22 @@ static __always_inline u64 kvm_get_vttbr(struct kvm *kvm) return kvm_phys_to_vttbr(baddr) | vmid_field | cnp; } +/* + * Must be called from hyp code running at EL2 with an updated VTTBR + * and interrupts disabled. + */ +static __always_inline void __load_guest_stage2(struct kvm *kvm) +{ + write_sysreg(kvm->arch.vtcr, vtcr_el2); + write_sysreg(kvm_get_vttbr(kvm), vttbr_el2); + + /* + * ARM erratum 1165522 requires the actual execution of the above + * before we can switch to the EL1/EL0 translation regime used by + * the guest. + */ + asm(ALTERNATIVE("nop", "isb", ARM64_WORKAROUND_1165522)); +} + #endif /* __ASSEMBLY__ */ #endif /* __ARM64_KVM_MMU_H__ */
Having __load_guest_stage2 in kvm_hyp.h is quickly going to trigger a circular include problem. In order to avoid this, let's move it to kvm_mmu.h, where it will be a better fit anyway. In the process, drop the __hyp_text annotation, which doesn't help as the function is marked as __always_inline. Signed-off-by: Marc Zyngier <marc.zyngier@arm.com> --- arch/arm64/include/asm/kvm_hyp.h | 18 ------------------ arch/arm64/include/asm/kvm_mmu.h | 17 +++++++++++++++++ 2 files changed, 17 insertions(+), 18 deletions(-)