All of lore.kernel.org
 help / color / mirror / Atom feed
From: Gleb Natapov <gleb@redhat.com>
To: Marcelo Tosatti <mtosatti@redhat.com>
Cc: kvm <kvm@vger.kernel.org>, Andy Lutomirski <luto@amacapital.net>,
	Mike Galbraith <bitbucket@online.de>
Subject: Re: KVM: x86: use dynamic percpu allocations for shared msrs area
Date: Tue, 8 Jan 2013 11:16:42 +0200	[thread overview]
Message-ID: <20130108091642.GH21250@redhat.com> (raw)
In-Reply-To: <20130103134139.GA1787@amt.cnet>

On Thu, Jan 03, 2013 at 11:41:39AM -0200, Marcelo Tosatti wrote:
> 
> Andy, Mike, can you confirm whether this fixes the percpu allocation
> failures when loading kvm.ko? TIA
> 
> ----
> 
> Use dynamic percpu allocations for the shared msrs structure, 
> to avoid using the limited reserved percpu space.
> 
> Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
> 
Reviewed-by: Gleb Natapov <gleb@redhat.com>

> diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
> index 1c9c834..5229a67 100644
> --- a/arch/x86/kvm/x86.c
> +++ b/arch/x86/kvm/x86.c
> @@ -120,7 +120,7 @@ struct kvm_shared_msrs {
>  };
>  
>  static struct kvm_shared_msrs_global __read_mostly shared_msrs_global;
> -static DEFINE_PER_CPU(struct kvm_shared_msrs, shared_msrs);
> +static struct kvm_shared_msrs __percpu *shared_msrs;
>  
>  struct kvm_stats_debugfs_item debugfs_entries[] = {
>  	{ "pf_fixed", VCPU_STAT(pf_fixed) },
> @@ -191,10 +191,10 @@ static void kvm_on_user_return(struct user_return_notifier *urn)
>  
>  static void shared_msr_update(unsigned slot, u32 msr)
>  {
> -	struct kvm_shared_msrs *smsr;
>  	u64 value;
> +	unsigned int cpu = smp_processor_id();
> +	struct kvm_shared_msrs *smsr = per_cpu_ptr(shared_msrs, cpu);
>  
> -	smsr = &__get_cpu_var(shared_msrs);
>  	/* only read, and nobody should modify it at this time,
>  	 * so don't need lock */
>  	if (slot >= shared_msrs_global.nr) {
> @@ -226,7 +226,8 @@ static void kvm_shared_msr_cpu_online(void)
>  
>  void kvm_set_shared_msr(unsigned slot, u64 value, u64 mask)
>  {
> -	struct kvm_shared_msrs *smsr = &__get_cpu_var(shared_msrs);
> +	unsigned int cpu = smp_processor_id();
> +	struct kvm_shared_msrs *smsr = per_cpu_ptr(shared_msrs, cpu);
>  
>  	if (((value ^ smsr->values[slot].curr) & mask) == 0)
>  		return;
> @@ -242,7 +243,8 @@ EXPORT_SYMBOL_GPL(kvm_set_shared_msr);
>  
>  static void drop_user_return_notifiers(void *ignore)
>  {
> -	struct kvm_shared_msrs *smsr = &__get_cpu_var(shared_msrs);
> +	unsigned int cpu = smp_processor_id();
> +	struct kvm_shared_msrs *smsr = per_cpu_ptr(shared_msrs, cpu);
>  
>  	if (smsr->registered)
>  		kvm_on_user_return(&smsr->urn);
> @@ -5233,9 +5235,16 @@ int kvm_arch_init(void *opaque)
>  		goto out;
>  	}
>  
> +	r = -ENOMEM;
> +	shared_msrs = alloc_percpu(struct kvm_shared_msrs);
> +	if (!shared_msrs) {
> +		printk(KERN_ERR "kvm: failed to allocate percpu kvm_shared_msrs\n");
> +		goto out;
> +	}
> +
>  	r = kvm_mmu_module_init();
>  	if (r)
> -		goto out;
> +		goto out_free_percpu;
>  
>  	kvm_set_mmio_spte_mask();
>  	kvm_init_msr_list();
> @@ -5258,6 +5267,8 @@ int kvm_arch_init(void *opaque)
>  
>  	return 0;
>  
> +out_free_percpu:
> +	free_percpu(shared_msrs);
>  out:
>  	return r;
>  }
> @@ -5275,6 +5286,7 @@ void kvm_arch_exit(void)
>  #endif
>  	kvm_x86_ops = NULL;
>  	kvm_mmu_module_exit();
> +	free_percpu(shared_msrs);
>  }
>  
>  int kvm_emulate_halt(struct kvm_vcpu *vcpu)
> --
> To unsubscribe from this list: send the line "unsubscribe kvm" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

--
			Gleb.

  parent reply	other threads:[~2013-01-08  9:16 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-01-03 13:41 KVM: x86: use dynamic percpu allocations for shared msrs area Marcelo Tosatti
2013-01-04  5:19 ` Mike Galbraith
2013-01-08  9:16 ` Gleb Natapov [this message]
2013-02-01 22:48 ` Andy Lutomirski

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=20130108091642.GH21250@redhat.com \
    --to=gleb@redhat.com \
    --cc=bitbucket@online.de \
    --cc=kvm@vger.kernel.org \
    --cc=luto@amacapital.net \
    --cc=mtosatti@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.