[PATCH 5/6 v6] kvm: booke: clear host tlb reference flag on guest tlb invalidation

Scott Wood scottwood at freescale.com
Sat Sep 21 04:50:09 EST 2013


On Fri, 2013-09-20 at 09:55 +0530, Bharat Bhushan wrote:
> On booke, "struct tlbe_ref" contains host tlb mapping information
> (pfn: for guest-pfn to pfn, flags: attribute associated with this mapping)
> for a guest tlb entry. So when a guest creates a TLB entry then
> "struct tlbe_ref" is set to point to valid "pfn" and set attributes in
> "flags" field of the above said structure. When a guest TLB entry is
> invalidated then flags field of corresponding "struct tlbe_ref" is
> updated to point that this is no more valid, also we selectively clear
> some other attribute bits, example: if E500_TLB_BITMAP was set then we clear
> E500_TLB_BITMAP, if E500_TLB_TLB0 is set then we clear this.
> 
> Ideally we should clear complete "flags" as this entry is invalid and does not
> have anything to re-used. The other part of the problem is that when we use
> the same entry again then also we do not clear (started doing or-ing etc).
> 
> So far it was working because the selectively clearing mentioned above
> actually clears "flags" what was set during TLB mapping. But the problem
> starts coming when we add more attributes to this then we need to selectively
> clear them and which is not needed.
> 
> This patch we do both
>         - Clear "flags" when invalidating;
>         - Clear "flags" when reusing same entry later
> 
> Signed-off-by: Bharat Bhushan <bharat.bhushan at freescale.com>
> ---
> v5->v6
>  - Fix flag clearing comment

The changes between v5 and v6 are not just about comments...

> 
>  arch/powerpc/kvm/e500_mmu_host.c |   16 ++++++++--------
>  1 files changed, 8 insertions(+), 8 deletions(-)
> 
> diff --git a/arch/powerpc/kvm/e500_mmu_host.c b/arch/powerpc/kvm/e500_mmu_host.c
> index 1c6a9d7..7370e1c 100644
> --- a/arch/powerpc/kvm/e500_mmu_host.c
> +++ b/arch/powerpc/kvm/e500_mmu_host.c
> @@ -230,15 +230,15 @@ void inval_gtlbe_on_host(struct kvmppc_vcpu_e500 *vcpu_e500, int tlbsel,
>  		ref->flags &= ~(E500_TLB_TLB0 | E500_TLB_VALID);
>  	}
>  
> -	/* Already invalidated in between */
> -	if (!(ref->flags & E500_TLB_VALID))
> -		return;
> -
> -	/* Guest tlbe is backed by at most one host tlbe per shadow pid. */
> -	kvmppc_e500_tlbil_one(vcpu_e500, gtlbe);
> +	/*
> +	 * Check whether TLB entry is already invalidated in between
> +	 * Guest tlbe is backed by at most one host tlbe per shadow pid.
> +	 */
> +	if (ref->flags & E500_TLB_VALID)
> +		kvmppc_e500_tlbil_one(vcpu_e500, gtlbe);

I'd phrase this combined comment as "If it's still valid, it's a TLB0
entry, and thus backed by at most one host tlbe per shadow pid".

Otherwise looks good.

-Scott





More information about the Linuxppc-dev mailing list