| 
         
xen-devel
[Xen-devel] [PATCH 08/13] xen/pvticketlock: disable interrupts	while blo
 
| 
To:  | 
"H. Peter Anvin" <hpa@xxxxxxxxx> | 
 
| 
Subject:  | 
[Xen-devel] [PATCH 08/13] xen/pvticketlock: disable interrupts	while blocking | 
 
| 
From:  | 
Jeremy Fitzhardinge <jeremy@xxxxxxxx> | 
 
| 
Date:  | 
Thu,  1 Sep 2011 17:55:01 -0700 | 
 
| 
Cc:  | 
Marcelo Tosatti <mtosatti@xxxxxxxxxx>, Nick Piggin <npiggin@xxxxxxxxx>,	KVM <kvm@xxxxxxxxxxxxxxx>, Peter Zijlstra <peterz@xxxxxxxxxxxxx>,	the arch/x86 maintainers <x86@xxxxxxxxxx>,	Linux Kernel Mailing List <linux-kernel@xxxxxxxxxxxxxxx>,	Andi Kleen <andi@xxxxxxxxxxxxxx>, Avi Kivity <avi@xxxxxxxxxx>,	Jeremy Fitzhardinge <jeremy.fitzhardinge@xxxxxxxxxx>,	Ingo Molnar <mingo@xxxxxxx>,	Linus Torvalds <torvalds@xxxxxxxxxxxxxxxxxxxx>,	Xen Devel <xen-devel@xxxxxxxxxxxxxxxxxxx> | 
 
| 
Delivery-date:  | 
Thu, 01 Sep 2011 18:13:29 -0700 | 
 
| 
Envelope-to:  | 
www-data@xxxxxxxxxxxxxxxxxxx | 
 
| 
In-reply-to:  | 
<cover.1314922370.git.jeremy.fitzhardinge@xxxxxxxxxx> | 
 
| 
In-reply-to:  | 
<cover.1314922370.git.jeremy.fitzhardinge@xxxxxxxxxx> | 
 
| 
List-help:  | 
<mailto:xen-devel-request@lists.xensource.com?subject=help> | 
 
| 
List-id:  | 
Xen developer discussion <xen-devel.lists.xensource.com> | 
 
| 
List-post:  | 
<mailto:xen-devel@lists.xensource.com> | 
 
| 
List-subscribe:  | 
<http://lists.xensource.com/mailman/listinfo/xen-devel>,	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe> | 
 
| 
List-unsubscribe:  | 
<http://lists.xensource.com/mailman/listinfo/xen-devel>,	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe> | 
 
| 
References:  | 
<cover.1314922370.git.jeremy.fitzhardinge@xxxxxxxxxx> | 
 
| 
References:  | 
<cover.1314922370.git.jeremy.fitzhardinge@xxxxxxxxxx> | 
 
| 
Sender:  | 
xen-devel-bounces@xxxxxxxxxxxxxxxxxxx | 
 
 
 
From: Jeremy Fitzhardinge <jeremy.fitzhardinge@xxxxxxxxxx>
We need to make sure interrupts are disabled while we're relying on the
contents of the per-cpu lock_waiting values, otherwise an interrupt
handler could come in, try to take some other lock, block, and overwrite
our values.
Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@xxxxxxxxxx>
---
 arch/x86/xen/spinlock.c |    8 ++++++++
 1 files changed, 8 insertions(+), 0 deletions(-)
diff --git a/arch/x86/xen/spinlock.c b/arch/x86/xen/spinlock.c
index 4c46144..2ed5d05 100644
--- a/arch/x86/xen/spinlock.c
+++ b/arch/x86/xen/spinlock.c
@@ -98,6 +98,7 @@ static void xen_lock_spinning(struct arch_spinlock *lock, 
unsigned want)
        struct xen_lock_waiting *w = &__get_cpu_var(lock_waiting);
        int cpu = smp_processor_id();
        u64 start;
+       unsigned long flags;
 
        /* If kicker interrupts not initialized yet, just spin */
        if (irq == -1)
@@ -105,6 +106,10 @@ static void xen_lock_spinning(struct arch_spinlock *lock, 
unsigned want)
 
        start = spin_time_start();
 
+       /* Make sure interrupts are disabled to ensure that these
+          per-cpu values are not overwritten. */
+       local_irq_save(flags);
+
        w->want = want;
        w->lock = lock;
 
@@ -139,6 +144,9 @@ static void xen_lock_spinning(struct arch_spinlock *lock, 
unsigned want)
 out:
        cpumask_clear_cpu(cpu, &waiting_cpus);
        w->lock = NULL;
+
+       local_irq_restore(flags);
+
        spin_time_accum_blocked(start);
 }
 PV_CALLEE_SAVE_REGS_THUNK(xen_lock_spinning);
-- 
1.7.6
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
 |   
 
 | 
    |