|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 31/38] arm: gic.lock can be taken in interrupt context, so lock appropriately.
On Fri, 1 Jun 2012, Ian Campbell wrote:
> 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@xxxxxxxxxx>
> ---
> 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 a398f92..ededa99 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;
> }
>
> @@ -559,7 +559,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)) {
>
> @@ -569,7 +569,7 @@ static void events_maintenance(struct vcpu *v)
>
> i++;
> }
> - spin_unlock(&gic.lock);
> + spin_unlock_irq(&gic.lock);
> }
> }
>
> @@ -585,7 +585,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;
> @@ -601,7 +601,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(¤t->arch.vgic.lock);
^
shouldn't you change this into spin_lock_irq too?
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |