All of lore.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 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.