Re: [RFC PATCH] KVM: PPC: Book3s HV: Allow setting GTSE for the nested guest

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

 



Fabiano Rosas <farosas@xxxxxxxxxxxxx> writes:

> We're currently getting a Program Interrupt inside the nested guest
> kernel when running with GTSE disabled in the nested hypervisor. We
> allow any guest a cmdline override of GTSE for migration purposes. The
> nested guest does not know it needs to use the option and tries to run
> 'tlbie' with LPCR_GTSE=0.
>
> The details are a bit more intricate:
>
> QEMU always sets GTSE=1 in OV5 even before calling KVM. At prom_init,
> guests use the OV5 value to set MMU_FTR_GTSE. This setting can be
> overridden by 'radix_hcall_invalidate=on' in the kernel cmdline. The
> option itself depends on the availability of
> FW_FEATURE_RPT_INVALIDATE, which it tied to QEMU's cap-rpt-invalidate
> capability.
>
> The MMU_FTR_GTSE flag leads guests to set PROC_TABLE_GTSE in their
> process tables and after H_REGISTER_PROC_TBL, both QEMU and KVM will
> set LPCR_GTSE=1 for that guest. Unless the guest uses the cmdline
> override, in which case:
>
>   MMU_FTR_GTSE=0 -> PROC_TABLE_GTSE=0 -> LPCR_GTSE=0
>
> We don't allow the nested hypervisor to set some LPCR bits for its
> nested guests, so if the nested HV has LPCR_GTSE=0, its nested guests
> will also have LPCR_GTSE=0. But since the only thing that can really
> flip GTSE is the cmdline override, if a nested guest runs without it,
> then the sequence goes:
>
>   MMU_FTR_GTSE=1 -> PROC_TABLE_GTSE=1 -> LPCR_GTSE=0.
>
> With LPCR_GTSE=0 the HW will treat 'tlbie' as HV privileged.
>
> This patch allows a nested HV to set LPCR_GTSE for its nested guests
> so the LPCR setting will match what the nested guest sees in OV5.

This needs a Fixes: tag?

I am not sure what is broken. If L1 doesn't support GTSE, then it should
publish the same to L2 and L2 should not use tlbie. That was working
before? Or is it that the kernel command to disable gtse when used with
L2 kernel is broken? 

>
> Signed-off-by: Fabiano Rosas <farosas@xxxxxxxxxxxxx>
> ---
>  arch/powerpc/kvm/book3s_hv_nested.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/arch/powerpc/kvm/book3s_hv_nested.c b/arch/powerpc/kvm/book3s_hv_nested.c
> index 9d373f8963ee..5b9008d89f90 100644
> --- a/arch/powerpc/kvm/book3s_hv_nested.c
> +++ b/arch/powerpc/kvm/book3s_hv_nested.c
> @@ -262,7 +262,7 @@ static void load_l2_hv_regs(struct kvm_vcpu *vcpu,
>  	 * Don't let L1 change LPCR bits for the L2 except these:
>  	 */
>  	mask = LPCR_DPFD | LPCR_ILE | LPCR_TC | LPCR_AIL | LPCR_LD |
> -		LPCR_LPES | LPCR_MER;
> +		LPCR_LPES | LPCR_MER | LPCR_GTSE;
>  
>  	/*
>  	 * Additional filtering is required depending on hardware
> -- 
> 2.34.1



[Index of Archives]     [KVM Development]     [KVM ARM]     [KVM ia64]     [Linux Virtualization]     [Linux USB Devel]     [Linux Video]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux