diff options
author | Ian Campbell <ian.campbell@citrix.com> | 2012-07-03 10:52:28 +0100 |
---|---|---|
committer | Ian Campbell <ian.campbell@citrix.com> | 2012-07-03 10:52:28 +0100 |
commit | 6c52f2a4b40de621321ed5527cba0b4e7f1768f1 (patch) | |
tree | c85396c93a71a40d6be753dbd705989f6a49726f /xen/arch | |
parent | 2632e28f678f7e8d0a70168fa0f5366dbd7e51cb (diff) | |
download | xen-6c52f2a4b40de621321ed5527cba0b4e7f1768f1.tar.gz xen-6c52f2a4b40de621321ed5527cba0b4e7f1768f1.tar.bz2 xen-6c52f2a4b40de621321ed5527cba0b4e7f1768f1.zip |
arm: gic.lock can be taken in interrupt context, so lock appropriately.
In particular it is taken by gic_set_guest_irq which is called by
vgic_vcpu_inject_irq
Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
Acked-by: Tim Deegan <tim@xen.org>
Committed-by: Ian Campbell <ian.campbell@citrix.com>
Diffstat (limited to 'xen/arch')
-rw-r--r-- | xen/arch/arm/gic.c | 20 |
1 files changed, 10 insertions, 10 deletions
diff --git a/xen/arch/arm/gic.c b/xen/arch/arm/gic.c index b304923d1b..ee83825761 100644 --- a/xen/arch/arm/gic.c +++ b/xen/arch/arm/gic.c @@ -329,19 +329,19 @@ int __init gic_init(void) /* Set up the per-CPU parts of the GIC for a secondary CPU */ void __cpuinit gic_init_secondary_cpu(void) { - spin_lock(&gic.lock); + spin_lock_irq(&gic.lock); gic_cpu_init(); gic_hyp_init(); - spin_unlock(&gic.lock); + spin_unlock_irq(&gic.lock); } /* Shut down the per-CPU GIC interface */ void gic_disable_cpu(void) { - spin_lock(&gic.lock); + spin_lock_irq(&gic.lock); gic_cpu_disable(); gic_hyp_disable(); - spin_unlock(&gic.lock); + spin_unlock_irq(&gic.lock); } void gic_route_irqs(void) @@ -439,7 +439,7 @@ void gic_set_guest_irq(unsigned int virtual_irq, events_maintenance(current); - spin_lock(&gic.lock); + spin_lock_irq(&gic.lock); if ( list_empty(&gic.lr_pending) ) { @@ -465,7 +465,7 @@ void gic_set_guest_irq(unsigned int virtual_irq, list_add_tail(&n->lr_queue, &gic.lr_pending); out: - spin_unlock(&gic.lock); + spin_unlock_irq(&gic.lock); return; } @@ -557,7 +557,7 @@ static void events_maintenance(struct vcpu *v) (unsigned long *)&vcpu_info(v, evtchn_upcall_pending)); if (!already_pending && gic.event_mask != 0) { - spin_lock(&gic.lock); + spin_lock_irq(&gic.lock); while ((i = find_next_bit((const long unsigned int *) &gic.event_mask, sizeof(uint64_t), i)) < sizeof(uint64_t)) { @@ -567,7 +567,7 @@ static void events_maintenance(struct vcpu *v) i++; } - spin_unlock(&gic.lock); + spin_unlock_irq(&gic.lock); } } @@ -583,7 +583,7 @@ static void maintenance_interrupt(int irq, void *dev_id, struct cpu_user_regs *r sizeof(eisr), i)) < sizeof(eisr)) { struct pending_irq *p; - spin_lock(&gic.lock); + spin_lock_irq(&gic.lock); lr = GICH[GICH_LR + i]; virq = lr & GICH_LR_VIRTUAL_MASK; GICH[GICH_LR + i] = 0; @@ -599,7 +599,7 @@ static void maintenance_interrupt(int irq, void *dev_id, struct cpu_user_regs *r } else { gic_inject_irq_stop(); } - spin_unlock(&gic.lock); + spin_unlock_irq(&gic.lock); spin_lock_irq(¤t->arch.vgic.lock); p = irq_to_pending(current, virq); |