All of lore.kernel.org
 help / color / mirror / Atom feed
From: Paolo Bonzini <pbonzini@redhat.com>
To: Mingwei Zhang <mizhang@google.com>
Cc: Sean Christopherson <seanjc@google.com>,
	Vitaly Kuznetsov <vkuznets@redhat.com>,
	Wanpeng Li <wanpengli@tencent.com>,
	Jim Mattson <jmattson@google.com>, Joerg Roedel <joro@8bytes.org>,
	kvm@vger.kernel.org, linux-kernel@vger.kernel.org,
	Tom Lendacky <thomas.lendacky@amd.com>,
	Marc Orr <marcorr@google.com>,
	David Rientjes <rientjes@google.com>,
	Alper Gun <alpergun@google.com>,
	Dionna Glaze <dionnaglaze@google.com>,
	Vipin Sharma <vipinsh@google.com>,
	Peter Gonda <pgonda@google.com>
Subject: Re: [PATCH v2] KVM: SVM: improve the code readability for ASID management
Date: Tue, 3 Aug 2021 09:22:39 +0200	[thread overview]
Message-ID: <a737d476-05dc-5aea-99ec-8960fcb9fc2f@redhat.com> (raw)
In-Reply-To: <20210802180903.159381-1-mizhang@google.com>

On 02/08/21 20:09, Mingwei Zhang wrote:
> KVM SEV code uses bitmaps to manage ASID states. ASID 0 was always skipped
> because it is never used by VM. Thus, in existing code, ASID value and its
> bitmap postion always has an 'offset-by-1' relationship.
> 
> Both SEV and SEV-ES shares the ASID space, thus KVM uses a dynamic range
> [min_asid, max_asid] to handle SEV and SEV-ES ASIDs separately.
> 
> Existing code mixes the usage of ASID value and its bitmap position by
> using the same variable called 'min_asid'.
> 
> Fix the min_asid usage: ensure that its usage is consistent with its name;
> allocate extra size for ASID 0 to ensure that each ASID has the same value
> with its bitmap position. Add comments on ASID bitmap allocation to clarify
> the size change.
> 
> v1 -> v2:
>   - change ASID bitmap size to incorporate ASID 0 [sean]
>   - remove the 'fixes' line in commit message. [sean/joerg]
> 
> Signed-off-by: Mingwei Zhang <mizhang@google.com>
> Cc: Tom Lendacky <thomas.lendacky@amd.com>
> Cc: Marc Orr <marcorr@google.com>
> Cc: David Rientjes <rientjes@google.com>
> Cc: Alper Gun <alpergun@google.com>
> Cc: Dionna Glaze <dionnaglaze@google.com>
> Cc: Sean Christopherson <seanjc@google.com>
> Cc: Vipin Sharma <vipinsh@google.com>
> Cc: Peter Gonda <pgonda@google.com>
> Cc: Joerg Roedel <joro@8bytes.org>
> ---
>   arch/x86/kvm/svm/sev.c | 36 +++++++++++++++++++++---------------
>   1 file changed, 21 insertions(+), 15 deletions(-)
> 
> diff --git a/arch/x86/kvm/svm/sev.c b/arch/x86/kvm/svm/sev.c
> index 8d36f0c73071..42d46c30f313 100644
> --- a/arch/x86/kvm/svm/sev.c
> +++ b/arch/x86/kvm/svm/sev.c
> @@ -63,6 +63,7 @@ static DEFINE_MUTEX(sev_bitmap_lock);
>   unsigned int max_sev_asid;
>   static unsigned int min_sev_asid;
>   static unsigned long sev_me_mask;
> +static unsigned int nr_asids;
>   static unsigned long *sev_asid_bitmap;
>   static unsigned long *sev_reclaim_asid_bitmap;
>   
> @@ -77,11 +78,11 @@ struct enc_region {
>   /* Called with the sev_bitmap_lock held, or on shutdown  */
>   static int sev_flush_asids(int min_asid, int max_asid)
>   {
> -	int ret, pos, error = 0;
> +	int ret, asid, error = 0;
>   
>   	/* Check if there are any ASIDs to reclaim before performing a flush */
> -	pos = find_next_bit(sev_reclaim_asid_bitmap, max_asid, min_asid);
> -	if (pos >= max_asid)
> +	asid = find_next_bit(sev_reclaim_asid_bitmap, nr_asids, min_asid);
> +	if (asid > max_asid)
>   		return -EBUSY;
>   
>   	/*
> @@ -114,15 +115,15 @@ static bool __sev_recycle_asids(int min_asid, int max_asid)
>   
>   	/* The flush process will flush all reclaimable SEV and SEV-ES ASIDs */
>   	bitmap_xor(sev_asid_bitmap, sev_asid_bitmap, sev_reclaim_asid_bitmap,
> -		   max_sev_asid);
> -	bitmap_zero(sev_reclaim_asid_bitmap, max_sev_asid);
> +		   nr_asids);
> +	bitmap_zero(sev_reclaim_asid_bitmap, nr_asids);
>   
>   	return true;
>   }
>   
>   static int sev_asid_new(struct kvm_sev_info *sev)
>   {
> -	int pos, min_asid, max_asid, ret;
> +	int asid, min_asid, max_asid, ret;
>   	bool retry = true;
>   	enum misc_res_type type;
>   
> @@ -142,11 +143,11 @@ static int sev_asid_new(struct kvm_sev_info *sev)
>   	 * SEV-enabled guests must use asid from min_sev_asid to max_sev_asid.
>   	 * SEV-ES-enabled guest can use from 1 to min_sev_asid - 1.
>   	 */
> -	min_asid = sev->es_active ? 0 : min_sev_asid - 1;
> +	min_asid = sev->es_active ? 1 : min_sev_asid;
>   	max_asid = sev->es_active ? min_sev_asid - 1 : max_sev_asid;
>   again:
> -	pos = find_next_zero_bit(sev_asid_bitmap, max_sev_asid, min_asid);
> -	if (pos >= max_asid) {
> +	asid = find_next_zero_bit(sev_asid_bitmap, max_sev_asid, min_asid);
> +	if (asid > max_asid) {
>   		if (retry && __sev_recycle_asids(min_asid, max_asid)) {
>   			retry = false;
>   			goto again;
> @@ -156,11 +157,11 @@ static int sev_asid_new(struct kvm_sev_info *sev)
>   		goto e_uncharge;
>   	}
>   
> -	__set_bit(pos, sev_asid_bitmap);
> +	__set_bit(asid, sev_asid_bitmap);
>   
>   	mutex_unlock(&sev_bitmap_lock);
>   
> -	return pos + 1;
> +	return asid;
>   e_uncharge:
>   	misc_cg_uncharge(type, sev->misc_cg, 1);
>   	put_misc_cg(sev->misc_cg);
> @@ -1854,12 +1855,17 @@ void __init sev_hardware_setup(void)
>   	min_sev_asid = edx;
>   	sev_me_mask = 1UL << (ebx & 0x3f);
>   
> -	/* Initialize SEV ASID bitmaps */
> -	sev_asid_bitmap = bitmap_zalloc(max_sev_asid, GFP_KERNEL);
> +	/*
> +	 * Initialize SEV ASID bitmaps. Allocate space for ASID 0 in the bitmap,
> +	 * even though it's never used, so that the bitmap is indexed by the
> +	 * actual ASID.
> +	 */
> +	nr_asids = max_sev_asid + 1;
> +	sev_asid_bitmap = bitmap_zalloc(nr_asids, GFP_KERNEL);
>   	if (!sev_asid_bitmap)
>   		goto out;
>   
> -	sev_reclaim_asid_bitmap = bitmap_zalloc(max_sev_asid, GFP_KERNEL);
> +	sev_reclaim_asid_bitmap = bitmap_zalloc(nr_asids, GFP_KERNEL);
>   	if (!sev_reclaim_asid_bitmap) {
>   		bitmap_free(sev_asid_bitmap);
>   		sev_asid_bitmap = NULL;
> @@ -1904,7 +1910,7 @@ void sev_hardware_teardown(void)
>   		return;
>   
>   	/* No need to take sev_bitmap_lock, all VMs have been destroyed. */
> -	sev_flush_asids(0, max_sev_asid);
> +	sev_flush_asids(1, max_sev_asid);
>   
>   	bitmap_free(sev_asid_bitmap);
>   	bitmap_free(sev_reclaim_asid_bitmap);
> 

Queued, thanks.

Paolo


  reply	other threads:[~2021-08-03  7:22 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-08-02 18:09 [PATCH v2] KVM: SVM: improve the code readability for ASID management Mingwei Zhang
2021-08-03  7:22 ` Paolo Bonzini [this message]
2021-08-03 16:50 ` Sean Christopherson
2021-08-04 10:53   ` Paolo Bonzini

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=a737d476-05dc-5aea-99ec-8960fcb9fc2f@redhat.com \
    --to=pbonzini@redhat.com \
    --cc=alpergun@google.com \
    --cc=dionnaglaze@google.com \
    --cc=jmattson@google.com \
    --cc=joro@8bytes.org \
    --cc=kvm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=marcorr@google.com \
    --cc=mizhang@google.com \
    --cc=pgonda@google.com \
    --cc=rientjes@google.com \
    --cc=seanjc@google.com \
    --cc=thomas.lendacky@amd.com \
    --cc=vipinsh@google.com \
    --cc=vkuznets@redhat.com \
    --cc=wanpengli@tencent.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.