[PATCH v8 4/6] KVM: PPC: Book3S HV: Nested support in H_RPT_INVALIDATE

Michael Ellerman mpe at ellerman.id.au
Wed Jun 23 16:47:12 AEST 2021


Bharata B Rao <bharata at linux.ibm.com> writes:
> On Tue, Jun 22, 2021 at 10:05:45AM +0530, Bharata B Rao wrote:
>> On Mon, Jun 21, 2021 at 10:12:42AM -0700, Nathan Chancellor wrote:
>> > I have not seen this reported yet so apologies if it has and there is a
>> > fix I am missing:
>> > 
>> > arch/powerpc/kvm/book3s_hv_nested.c:1334:11: error: variable 'ap' is uninitialized when used here [-Werror,-Wuninitialized]
>> >                                                            ap, start, end);
>> >                                                            ^~
>> > arch/powerpc/kvm/book3s_hv_nested.c:1276:25: note: initialize the variable 'ap' to silence this warning
>> >         unsigned long psize, ap;
>> >                                ^
>> >                                 = 0
>> 
>> Thanks for catching this, this wasn't caught in my environment.
>> 
>> I will repost the series with proper initialization to ap.
>
> Michael,
>
> Here is the fix for this on top of powerpc/next. If it is easier
> and cleaner to fold this into the original series and re-post
> the whole series against any updated tree, let me know.

Thanks. I squashed this in.

cheers

> From 2e7198e28c0d1137f3230d4645e9cfddaccf4987 Mon Sep 17 00:00:00 2001
> From: Bharata B Rao <bharata at linux.ibm.com>
> Date: Tue, 22 Jun 2021 12:07:01 +0530
> Subject: [PATCH 1/1] KVM: PPC: Book3S HV: Use proper ap value in
>  H_RPT_INVALIDATE
>
> The ap value that is used when performing range based partition
> scoped invalidations for the nested guests wasn't initialized
> correctly.
>
> Fix this and while we are here, reorganize the routine that does
> this invalidation for better readability.
>
> Fixes: 0e67d866cb32 ("KVM: PPC: Book3S HV: Nested support in H_RPT_INVALIDATE")
> Signed-off-by: Bharata B Rao <bharata at linux.ibm.com>
> ---
>  arch/powerpc/kvm/book3s_hv_nested.c | 90 +++++++++++++----------------
>  1 file changed, 40 insertions(+), 50 deletions(-)
>
> diff --git a/arch/powerpc/kvm/book3s_hv_nested.c b/arch/powerpc/kvm/book3s_hv_nested.c
> index d78efb5f5bb3..3a06ac0b53e2 100644
> --- a/arch/powerpc/kvm/book3s_hv_nested.c
> +++ b/arch/powerpc/kvm/book3s_hv_nested.c
> @@ -1222,27 +1222,6 @@ long kvmhv_do_nested_tlbie(struct kvm_vcpu *vcpu)
>  	return H_SUCCESS;
>  }
>  
> -static long do_tlb_invalidate_nested_tlb(struct kvm_vcpu *vcpu,
> -					 unsigned long lpid,
> -					 unsigned long page_size,
> -					 unsigned long ap,
> -					 unsigned long start,
> -					 unsigned long end)
> -{
> -	unsigned long addr = start;
> -	int ret;
> -
> -	do {
> -		ret = kvmhv_emulate_tlbie_tlb_addr(vcpu, lpid, ap,
> -						   get_epn(addr));
> -		if (ret)
> -			return ret;
> -		addr += page_size;
> -	} while (addr < end);
> -
> -	return ret;
> -}
> -
>  static long do_tlb_invalidate_nested_all(struct kvm_vcpu *vcpu,
>  					 unsigned long lpid, unsigned long ric)
>  {
> @@ -1263,6 +1242,42 @@ static long do_tlb_invalidate_nested_all(struct kvm_vcpu *vcpu,
>   */
>  static unsigned long tlb_range_flush_page_ceiling __read_mostly = 33;
>  
> +static long do_tlb_invalidate_nested_tlb(struct kvm_vcpu *vcpu,
> +					 unsigned long lpid,
> +					 unsigned long pg_sizes,
> +					 unsigned long start,
> +					 unsigned long end)
> +{
> +	int ret = H_P4;
> +	unsigned long addr, nr_pages;
> +	struct mmu_psize_def *def;
> +	unsigned long psize, ap, page_size;
> +	bool flush_lpid;
> +
> +	for (psize = 0; psize < MMU_PAGE_COUNT; psize++) {
> +		def = &mmu_psize_defs[psize];
> +		if (!(pg_sizes & def->h_rpt_pgsize))
> +			continue;
> +
> +		nr_pages = (end - start) >> def->shift;
> +		flush_lpid = nr_pages > tlb_range_flush_page_ceiling;
> +		if (flush_lpid)
> +			return do_tlb_invalidate_nested_all(vcpu, lpid,
> +							RIC_FLUSH_TLB);
> +		addr = start;
> +		ap = mmu_get_ap(psize);
> +		page_size = 1UL << def->shift;
> +		do {
> +			ret = kvmhv_emulate_tlbie_tlb_addr(vcpu, lpid, ap,
> +						   get_epn(addr));
> +			if (ret)
> +				return H_P4;
> +			addr += page_size;
> +		} while (addr < end);
> +	}
> +	return ret;
> +}
> +
>  /*
>   * Performs partition-scoped invalidations for nested guests
>   * as part of H_RPT_INVALIDATE hcall.
> @@ -1271,10 +1286,6 @@ long do_h_rpt_invalidate_pat(struct kvm_vcpu *vcpu, unsigned long lpid,
>  			     unsigned long type, unsigned long pg_sizes,
>  			     unsigned long start, unsigned long end)
>  {
> -	struct kvm_nested_guest *gp;
> -	long ret;
> -	unsigned long psize, ap;
> -
>  	/*
>  	 * If L2 lpid isn't valid, we need to return H_PARAMETER.
>  	 *
> @@ -1284,8 +1295,7 @@ long do_h_rpt_invalidate_pat(struct kvm_vcpu *vcpu, unsigned long lpid,
>  	 * H_ENTER_NESTED call. Since we can't differentiate this case from
>  	 * the invalid case, we ignore such flush requests and return success.
>  	 */
> -	gp = kvmhv_find_nested(vcpu->kvm, lpid);
> -	if (!gp)
> +	if (!kvmhv_find_nested(vcpu->kvm, lpid))
>  		return H_SUCCESS;
>  
>  	/*
> @@ -1313,29 +1323,9 @@ long do_h_rpt_invalidate_pat(struct kvm_vcpu *vcpu, unsigned long lpid,
>  	if (start == 0 && end == -1)
>  		return do_tlb_invalidate_nested_all(vcpu, lpid, RIC_FLUSH_TLB);
>  
> -	if (type & H_RPTI_TYPE_TLB) {
> -		struct mmu_psize_def *def;
> -		bool flush_lpid;
> -		unsigned long nr_pages;
> -
> -		for (psize = 0; psize < MMU_PAGE_COUNT; psize++) {
> -			def = &mmu_psize_defs[psize];
> -			if (!(pg_sizes & def->h_rpt_pgsize))
> -				continue;
> -
> -			nr_pages = (end - start) >> def->shift;
> -			flush_lpid = nr_pages > tlb_range_flush_page_ceiling;
> -			if (flush_lpid)
> -				return do_tlb_invalidate_nested_all(vcpu, lpid,
> -								RIC_FLUSH_TLB);
> -
> -			ret = do_tlb_invalidate_nested_tlb(vcpu, lpid,
> -							   (1UL << def->shift),
> -							   ap, start, end);
> -			if (ret)
> -				return H_P4;
> -		}
> -	}
> +	if (type & H_RPTI_TYPE_TLB)
> +		return do_tlb_invalidate_nested_tlb(vcpu, lpid, pg_sizes,
> +						    start, end);
>  	return H_SUCCESS;
>  }
>  
> -- 
> 2.31.1


More information about the Linuxppc-dev mailing list