|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v2 09/16] xen/arm: IRQ: Add lock contrainst for gic_irq_{startup, shutdown}
On Thu, 2014-04-03 at 21:42 +0100, Julien Grall wrote:
In the subject "constraint".
A better title might be "require $FOO lock be held by callers of
gic_irq...blah"
> When multiple action will be supported, gic_irq_{startup,shutdown} will have
s/will be/are/
> to be called in the same critical zone as setup/release.
"critical section" is the more usual term I think. Or "under the same
lock as".
> Otherwise it could have a race condition if at the same time CPU A is calling
"Otherwise there is a race condition..."
> release_dt_irq and CPU B is calling setup_dt_irq.
>
> This could end up to the IRQ not being enabled.
s/to/with/
> Signed-off-by: Julien Grall <julien.grall@xxxxxxxxxx>
>
> ---
> Changes in v2:
> - Fix typoes in commit message
> - Move this patch earlier in the series => move shutdown() in
> release_irq and gic_route_irq
> ---
> xen/arch/arm/gic.c | 39 ++++++++++++++++++++++++---------------
> xen/arch/arm/irq.c | 6 ++++--
> 2 files changed, 28 insertions(+), 17 deletions(-)
>
> diff --git a/xen/arch/arm/gic.c b/xen/arch/arm/gic.c
> index 82e0316..8c53e52 100644
> --- a/xen/arch/arm/gic.c
> +++ b/xen/arch/arm/gic.c
> @@ -123,44 +123,53 @@ void gic_restore_state(struct vcpu *v)
> gic_restore_pending_irqs(v);
> }
>
> -static void gic_irq_enable(struct irq_desc *desc)
> +static unsigned int gic_irq_startup(struct irq_desc *desc)
Is there code motion mixed in with this locking change?
It looks a bit like the relationship between e.g. gic_irq_startup and
gic_irq_enable is being turned inside out? Maybe diff has just chosen an
unhelpful representation of a relatively simple change?
> -static unsigned int gic_irq_startup(struct irq_desc *desc)
> +static void gic_irq_enable(struct irq_desc *desc)
> {
> - gic_irq_enable(desc);
> - return 0;
> + unsigned long flags;
> +
> + spin_lock_irqsave(&desc->lock, flags);
> + gic_irq_startup(desc);
> + spin_unlock_irqrestore(&desc->lock, flags);
> }
>
> -static void gic_irq_shutdown(struct irq_desc *desc)
> +static void gic_irq_disable(struct irq_desc *desc)
> {
> - gic_irq_disable(desc);
> + unsigned long flags;
> +
> + spin_lock_irqsave(&desc->lock, flags);
> + gic_irq_shutdown(desc);
> + spin_unlock_irqrestore(&desc->lock, flags);
> }
>
> static void gic_irq_ack(struct irq_desc *desc)
> @@ -261,11 +270,11 @@ static int gic_route_irq(unsigned int irq, bool_t level,
> if ( desc->action != NULL )
> return -EBUSY;
>
> + spin_lock_irqsave(&desc->lock, flags);
> +
> /* Disable interrupt */
> desc->handler->shutdown(desc);
>
> - spin_lock_irqsave(&desc->lock, flags);
Since desc->handler is a generic construct I think it is worth
mentioning in the commit log that this is consistent with x86.
After this change are arm's locking requirements wrt the
hw_irq_controller callbacks now consistent with x86's?
Ian.
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |