From mboxrd@z Thu Jan 1 00:00:00 1970 From: Konrad Rzeszutek Wilk Subject: Re: [PATCH for 4.5] x86/VPMU: Clear last_vcpu when destroying VPMU Date: Sat, 13 Dec 2014 14:08:08 -0500 Message-ID: <20141213190808.GA2842@laptop.dumpdata.com> References: <1418419248-2863-1-git-send-email-boris.ostrovsky@oracle.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: Content-Disposition: inline In-Reply-To: <1418419248-2863-1-git-send-email-boris.ostrovsky@oracle.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: Boris Ostrovsky Cc: keir@xen.org, jbeulich@suse.com, xen-devel@lists.xen.org List-Id: xen-devel@lists.xenproject.org On Fri, Dec 12, 2014 at 04:20:48PM -0500, Boris Ostrovsky wrote: > We need to make sure that last_vcpu is not pointing to VCPU whose > VPMU is being destroyed. Otherwise we may try dereference it in > the future, when VCPU is gone. > > Signed-off-by: Boris Ostrovsky Release-Acked-by: Konrad Rzeszutek Wilk > --- > xen/arch/x86/hvm/vpmu.c | 22 ++++++++++++++++++++++ > 1 files changed, 22 insertions(+), 0 deletions(-) > > This needs to be backported to 4.3 and 4.4 as well > > diff --git a/xen/arch/x86/hvm/vpmu.c b/xen/arch/x86/hvm/vpmu.c > index 1df74c2..6d39680 100644 > --- a/xen/arch/x86/hvm/vpmu.c > +++ b/xen/arch/x86/hvm/vpmu.c > @@ -247,10 +247,32 @@ void vpmu_initialise(struct vcpu *v) > } > } > > +static void vpmu_clear_last(void *arg) > +{ > + struct vcpu *v = (struct vcpu *)arg; > + > + if ( this_cpu(last_vcpu) == v ) > + this_cpu(last_vcpu) = NULL; > +} > + > void vpmu_destroy(struct vcpu *v) > { > struct vpmu_struct *vpmu = vcpu_vpmu(v); > > + if ( vpmu_is_set(vpmu, VPMU_CONTEXT_ALLOCATED) ) > + { > + /* Need to clear last_vcpu in case it points to v */ > + if ( vpmu->last_pcpu != smp_processor_id() ) > + on_selected_cpus(cpumask_of(vpmu->last_pcpu), > + vpmu_clear_last, (void *)v, 1); > + else > + { > + local_irq_disable(); > + vpmu_clear_last((void *)v); > + local_irq_enable(); > + } > + } > + > if ( vpmu->arch_vpmu_ops && vpmu->arch_vpmu_ops->arch_vpmu_destroy ) > vpmu->arch_vpmu_ops->arch_vpmu_destroy(v); > } > -- > 1.7.1 >