[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH for 4.5] x86/VPMU: Clear last_vcpu when destroying VPMU
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 <boris.ostrovsky@xxxxxxxxxx> --- 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 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |