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 <boris.ostrov...@oracle.com>
Release-Acked-by: Konrad Rzeszutek Wilk <konrad.w...@oracle.com>
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
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel