From mboxrd@z Thu Jan 1 00:00:00 1970 From: Boris Ostrovsky Subject: Re: [PATCH for 4.5] x86/VPMU: Clear last_vcpu when destroying VPMU Date: Sat, 13 Dec 2014 15:51:50 -0500 Message-ID: <548CA6E6.9050604@oracle.com> References: <1418419248-2863-1-git-send-email-boris.ostrovsky@oracle.com> <20141213190808.GA2842@laptop.dumpdata.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii"; Format="flowed" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <20141213190808.GA2842@laptop.dumpdata.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: Konrad Rzeszutek Wilk Cc: keir@xen.org, jbeulich@suse.com, xen-devel@lists.xen.org List-Id: xen-devel@lists.xenproject.org On 12/13/2014 02:08 PM, Konrad Rzeszutek Wilk wrote: > 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 I would like to send a slightly better patch on Monday (along the same lines but trying to avoid unnecessary IPIs if not needed). -boris >> --- >> 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 >>