public inbox for kvm@vger.kernel.org
 help / color / mirror / Atom feed
From: Paolo Bonzini <pbonzini@redhat.com>
To: "Radim Krčmář" <rkrcmar@redhat.com>,
	linux-kernel@vger.kernel.org, kvm@vger.kernel.org
Cc: Wanpeng Li <kernellwp@gmail.com>
Subject: Re: [PATCH v2 3/3] KVM: VMX: refactor setup of global page-sized bitmaps
Date: Fri, 30 Sep 2016 10:32:09 +0200	[thread overview]
Message-ID: <0cc80da7-b85c-0018-e8fb-9259b6cc2f32@redhat.com> (raw)
In-Reply-To: <20160929204133.1259-4-rkrcmar@redhat.com>



On 29/09/2016 22:41, Radim Krčmář wrote:
> We've had 10 page-sized bitmaps that were being allocated and freed one
> by one when we could just use a cycle.
> 
> Signed-off-by: Radim Krčmář <rkrcmar@redhat.com>
> ---
>  arch/x86/kvm/vmx.c | 120 +++++++++++++++++------------------------------------
>  1 file changed, 38 insertions(+), 82 deletions(-)

Yes. :)

Paolo

> diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
> index 159cc65755ec..bfd41149c377 100644
> --- a/arch/x86/kvm/vmx.c
> +++ b/arch/x86/kvm/vmx.c
> @@ -921,16 +921,32 @@ static DEFINE_PER_CPU(struct desc_ptr, host_gdt);
>  static DEFINE_PER_CPU(struct list_head, blocked_vcpu_on_cpu);
>  static DEFINE_PER_CPU(spinlock_t, blocked_vcpu_on_cpu_lock);
>  
> -static unsigned long *vmx_io_bitmap_a;
> -static unsigned long *vmx_io_bitmap_b;
> -static unsigned long *vmx_msr_bitmap_legacy;
> -static unsigned long *vmx_msr_bitmap_longmode;
> -static unsigned long *vmx_msr_bitmap_legacy_x2apic_apicv;
> -static unsigned long *vmx_msr_bitmap_longmode_x2apic_apicv;
> -static unsigned long *vmx_msr_bitmap_legacy_x2apic;
> -static unsigned long *vmx_msr_bitmap_longmode_x2apic;
> -static unsigned long *vmx_vmread_bitmap;
> -static unsigned long *vmx_vmwrite_bitmap;
> +enum {
> +	VMX_IO_BITMAP_A,
> +	VMX_IO_BITMAP_B,
> +	VMX_MSR_BITMAP_LEGACY,
> +	VMX_MSR_BITMAP_LONGMODE,
> +	VMX_MSR_BITMAP_LEGACY_X2APIC_APICV,
> +	VMX_MSR_BITMAP_LONGMODE_X2APIC_APICV,
> +	VMX_MSR_BITMAP_LEGACY_X2APIC,
> +	VMX_MSR_BITMAP_LONGMODE_X2APIC,
> +	VMX_VMREAD_BITMAP,
> +	VMX_VMWRITE_BITMAP,
> +	VMX_BITMAP_NR
> +};
> +
> +static unsigned long *vmx_bitmap[VMX_BITMAP_NR];
> +
> +#define vmx_io_bitmap_a                      (vmx_bitmap[VMX_IO_BITMAP_A])
> +#define vmx_io_bitmap_b                      (vmx_bitmap[VMX_IO_BITMAP_B])
> +#define vmx_msr_bitmap_legacy                (vmx_bitmap[VMX_MSR_BITMAP_LEGACY])
> +#define vmx_msr_bitmap_longmode              (vmx_bitmap[VMX_MSR_BITMAP_LONGMODE])
> +#define vmx_msr_bitmap_legacy_x2apic_apicv   (vmx_bitmap[VMX_MSR_BITMAP_LEGACY_X2APIC_APICV])
> +#define vmx_msr_bitmap_longmode_x2apic_apicv (vmx_bitmap[VMX_MSR_BITMAP_LONGMODE_X2APIC_APICV])
> +#define vmx_msr_bitmap_legacy_x2apic         (vmx_bitmap[VMX_MSR_BITMAP_LEGACY_X2APIC])
> +#define vmx_msr_bitmap_longmode_x2apic       (vmx_bitmap[VMX_MSR_BITMAP_LONGMODE_X2APIC])
> +#define vmx_vmread_bitmap                    (vmx_bitmap[VMX_VMREAD_BITMAP])
> +#define vmx_vmwrite_bitmap                   (vmx_bitmap[VMX_VMWRITE_BITMAP])
>  
>  static bool cpu_has_load_ia32_efer;
>  static bool cpu_has_load_perf_global_ctrl;
> @@ -6313,50 +6329,13 @@ static __init int hardware_setup(void)
>  	for (i = 0; i < ARRAY_SIZE(vmx_msr_index); ++i)
>  		kvm_define_shared_msr(i, vmx_msr_index[i]);
>  
> -	vmx_io_bitmap_a = (unsigned long *)__get_free_page(GFP_KERNEL);
> -	if (!vmx_io_bitmap_a)
> -		return r;
> +	for (i = 0; i < VMX_BITMAP_NR; i++) {
> +		vmx_bitmap[i] = (unsigned long *)__get_free_page(GFP_KERNEL);
> +		if (!vmx_bitmap[i])
> +			goto out;
> +	}
>  
>  	vmx_io_bitmap_b = (unsigned long *)__get_free_page(GFP_KERNEL);
> -	if (!vmx_io_bitmap_b)
> -		goto out;
> -
> -	vmx_msr_bitmap_legacy = (unsigned long *)__get_free_page(GFP_KERNEL);
> -	if (!vmx_msr_bitmap_legacy)
> -		goto out1;
> -
> -	vmx_msr_bitmap_legacy_x2apic_apicv =
> -				(unsigned long *)__get_free_page(GFP_KERNEL);
> -	if (!vmx_msr_bitmap_legacy_x2apic_apicv)
> -		goto out2;
> -
> -	vmx_msr_bitmap_legacy_x2apic =
> -				(unsigned long *)__get_free_page(GFP_KERNEL);
> -	if (!vmx_msr_bitmap_legacy_x2apic)
> -		goto out3;
> -
> -	vmx_msr_bitmap_longmode = (unsigned long *)__get_free_page(GFP_KERNEL);
> -	if (!vmx_msr_bitmap_longmode)
> -		goto out4;
> -
> -	vmx_msr_bitmap_longmode_x2apic_apicv =
> -				(unsigned long *)__get_free_page(GFP_KERNEL);
> -	if (!vmx_msr_bitmap_longmode_x2apic_apicv)
> -		goto out5;
> -
> -	vmx_msr_bitmap_longmode_x2apic =
> -				(unsigned long *)__get_free_page(GFP_KERNEL);
> -	if (!vmx_msr_bitmap_longmode_x2apic)
> -		goto out6;
> -
> -	vmx_vmread_bitmap = (unsigned long *)__get_free_page(GFP_KERNEL);
> -	if (!vmx_vmread_bitmap)
> -		goto out7;
> -
> -	vmx_vmwrite_bitmap = (unsigned long *)__get_free_page(GFP_KERNEL);
> -	if (!vmx_vmwrite_bitmap)
> -		goto out8;
> -
>  	memset(vmx_vmread_bitmap, 0xff, PAGE_SIZE);
>  	memset(vmx_vmwrite_bitmap, 0xff, PAGE_SIZE);
>  
> @@ -6374,7 +6353,7 @@ static __init int hardware_setup(void)
>  
>  	if (setup_vmcs_config(&vmcs_config) < 0) {
>  		r = -EIO;
> -		goto out9;
> +		goto out;
>  	}
>  
>  	if (boot_cpu_has(X86_FEATURE_NX))
> @@ -6516,42 +6495,19 @@ static __init int hardware_setup(void)
>  
>  	return alloc_kvm_area();
>  
> -out9:
> -	free_page((unsigned long)vmx_vmwrite_bitmap);
> -out8:
> -	free_page((unsigned long)vmx_vmread_bitmap);
> -out7:
> -	free_page((unsigned long)vmx_msr_bitmap_longmode_x2apic);
> -out6:
> -	free_page((unsigned long)vmx_msr_bitmap_longmode_x2apic_apicv);
> -out5:
> -	free_page((unsigned long)vmx_msr_bitmap_longmode);
> -out4:
> -	free_page((unsigned long)vmx_msr_bitmap_legacy_x2apic);
> -out3:
> -	free_page((unsigned long)vmx_msr_bitmap_legacy_x2apic_apicv);
> -out2:
> -	free_page((unsigned long)vmx_msr_bitmap_legacy);
> -out1:
> -	free_page((unsigned long)vmx_io_bitmap_b);
>  out:
> -	free_page((unsigned long)vmx_io_bitmap_a);
> +	for (i = 0; i < VMX_BITMAP_NR; i++)
> +		free_page((unsigned long)vmx_bitmap[i]);
>  
>      return r;
>  }
>  
>  static __exit void hardware_unsetup(void)
>  {
> -	free_page((unsigned long)vmx_msr_bitmap_legacy_x2apic_apicv);
> -	free_page((unsigned long)vmx_msr_bitmap_legacy_x2apic);
> -	free_page((unsigned long)vmx_msr_bitmap_longmode_x2apic_apicv);
> -	free_page((unsigned long)vmx_msr_bitmap_longmode_x2apic);
> -	free_page((unsigned long)vmx_msr_bitmap_legacy);
> -	free_page((unsigned long)vmx_msr_bitmap_longmode);
> -	free_page((unsigned long)vmx_io_bitmap_b);
> -	free_page((unsigned long)vmx_io_bitmap_a);
> -	free_page((unsigned long)vmx_vmwrite_bitmap);
> -	free_page((unsigned long)vmx_vmread_bitmap);
> +	int i;
> +
> +	for (i = 0; i < VMX_BITMAP_NR; i++)
> +		free_page((unsigned long)vmx_bitmap[i]);
>  
>  	free_kvm_area();
>  }
> 

      reply	other threads:[~2016-09-30  8:32 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-09-29 20:41 [PATCH v2 0/3] KVM: VMX: refactor global page-sized bitmaps Radim Krčmář
2016-09-29 20:41 ` [PATCH v2 1/3] KVM: VMX: remove functions that enable msr intercepts Radim Krčmář
2016-09-29 20:41 ` [PATCH v2 2/3] KVM: VMX: join functions that disable x2apic " Radim Krčmář
2016-09-30  8:29   ` Paolo Bonzini
2016-10-07 12:30     ` Radim Krčmář
2016-10-07 23:43       ` Wanpeng Li
2016-09-29 20:41 ` [PATCH v2 3/3] KVM: VMX: refactor setup of global page-sized bitmaps Radim Krčmář
2016-09-30  8:32   ` Paolo Bonzini [this message]

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=0cc80da7-b85c-0018-e8fb-9259b6cc2f32@redhat.com \
    --to=pbonzini@redhat.com \
    --cc=kernellwp@gmail.com \
    --cc=kvm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=rkrcmar@redhat.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox