From mboxrd@z Thu Jan 1 00:00:00 1970 From: Avi Kivity Subject: Re: [PATCH 2/4] KVM: Extended shared_msr_global to per CPU Date: Thu, 17 Dec 2009 12:32:08 +0200 Message-ID: <4B2A08A8.7080603@redhat.com> References: <4B28A6A2.3090802@redhat.com> <1261042355-32381-1-git-send-email-sheng@linux.intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Cc: Marcelo Tosatti , kvm@vger.kernel.org To: Sheng Yang Return-path: Received: from mx1.redhat.com ([209.132.183.28]:28706 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751350AbZLQKcM (ORCPT ); Thu, 17 Dec 2009 05:32:12 -0500 In-Reply-To: <1261042355-32381-1-git-send-email-sheng@linux.intel.com> Sender: kvm-owner@vger.kernel.org List-ID: On 12/17/2009 11:32 AM, Sheng Yang wrote: > shared_msr_global saved host value of relevant MSRs, but it have an > assumption that all MSRs it tracked shared the value across the different > CPUs. It's not true with some MSRs, e.g. MSR_TSC_AUX. > > Extend it to per CPU to provide the support of MSR_TSC_AUX, and more > alike MSRs. > > Notice now the shared_msr_global still have one assumption: it can only deal > with the MSRs that won't change in host after KVM module loaded. > > Signed-off-by: Sheng Yang > --- > > How about this? > > Move the all initialization to hardware_enable(). And only initialized once > for each cpu. > > > -void kvm_define_shared_msr(unsigned slot, u32 msr) > +static void shared_msr_update(unsigned slot, u32 msr) > { > - int cpu; > + struct kvm_shared_msrs *smsr; > u64 value; > > + 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) { > + printk(KERN_ERR "kvm: invalid MSR slot!"); > + return; > + } > + if (smsr->values[slot].initialized) > + return; > I don't think .initialized is worthwhile. shared_msr_update is run very rarely. > + smsr->values[slot].initialized = true; > + put_cpu_var(shared_msrs); > If you use __get_cpu_var(), you need to remove put_cpu_var(). -- error compiling committee.c: too many arguments to function