|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH for-4.5 3/8] xen/arm: IRQ: Protect IRQ to be shared between domains and XEN
On Fri, 2014-01-24 at 16:43 +0000, Julien Grall wrote:
> The current dt_route_irq_to_guest implementation set IRQ_GUEST no matter if
> the
> IRQ is correctly setup.
>
> As IRQ can be shared between devices, if the devices are not assigned to the
> same domain or Xen, this could result to IRQ route to the domain instead of
> Xen ...
>
> Also avoid to rely on wrong behaviour when Xen is routing an IRQ to DOM0.
>
> Signed-off-by: Julien Grall <julien.grall@xxxxxxxxxx>
>
> ---
> Hopefully, none of the supported platforms have UARTs (the only device
^shared?
Other than wondering if EBUSY might be more natural than EADDRINUSE and
some grammar nits (below) I think this patch looks good.
> currently used by Xen). It would be nice to have this patch for Xen 4.4 to
> avoid waste of time for developer.
>
> The downside of this patch is if someone wants to support a such platform
> (eg IRQ shared between device assigned to different domain/XEN), it will
> end up to a error message and a panic.
> ---
> xen/arch/arm/domain_build.c | 8 ++++++--
> xen/arch/arm/gic.c | 40 +++++++++++++++++++++++++++++++++++++++-
> 2 files changed, 45 insertions(+), 3 deletions(-)
>
> diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c
> index 47b781b..1fc359a 100644
> --- a/xen/arch/arm/domain_build.c
> +++ b/xen/arch/arm/domain_build.c
> @@ -712,8 +712,12 @@ static int map_device(struct domain *d, const struct
> dt_device_node *dev)
> }
>
> DPRINT("irq %u = %u type = 0x%x\n", i, irq.irq, irq.type);
> - /* Don't check return because the IRQ can be use by multiple device
> */
> - gic_route_irq_to_guest(d, &irq, dt_node_name(dev));
> + res = gic_route_irq_to_guest(d, &irq, dt_node_name(dev));
> + if ( res )
> + {
> + printk(XENLOG_ERR "Unable to route the IRQ %u to dom0\n",
> irq.irq);
"Unable to route IRQ %u..." and I think you want to use d->domain_id
rather than hardcoding 0.
> + return res;
> + }
> }
>
> /* Map the address ranges */
> diff --git a/xen/arch/arm/gic.c b/xen/arch/arm/gic.c
> index 55e7622..d68bde3 100644
> --- a/xen/arch/arm/gic.c
> +++ b/xen/arch/arm/gic.c
> @@ -605,6 +605,21 @@ int __init setup_dt_irq(const struct dt_irq *irq, struct
> irqaction *new)
> desc = irq_to_desc(irq->irq);
>
> spin_lock_irqsave(&desc->lock, flags);
> +
> + if ( desc->status & IRQ_GUEST )
> + {
> + struct domain *d;
> +
> + ASSERT(desc->action != NULL);
> +
> + d = desc->action->dev_id;
> +
> + spin_unlock_irqrestore(&desc->lock, flags);
> + printk(XENLOG_ERR "ERROR: IRQ %u is already used by the domain %u\n",
"is already in use by domain ..."
> + irq->irq, d->domain_id);
> + return -EADDRINUSE;
> + }
> +
> rc = __setup_irq(desc, irq->irq, new);
> spin_unlock_irqrestore(&desc->lock, flags);
>
> @@ -759,7 +774,7 @@ int gic_route_irq_to_guest(struct domain *d, const struct
> dt_irq *irq,
> struct irqaction *action;
> struct irq_desc *desc = irq_to_desc(irq->irq);
> unsigned long flags;
> - int retval;
> + int retval = 0;
> bool_t level;
> struct pending_irq *p;
>
> @@ -773,6 +788,29 @@ int gic_route_irq_to_guest(struct domain *d, const
> struct dt_irq *irq,
>
> spin_lock_irqsave(&desc->lock, flags);
>
> + /* If the IRQ is already used by someone
> + * - If it's the same domain -> Xen doesn't need to update the IRQ desc
> + * - Otherwise -> For now, don't allow the IRQ to be shared between
> + * Xen and domains.
> + */
> + if ( desc->action != NULL )
> + {
> + if ( (desc->status & IRQ_GUEST) && d == desc->action->dev_id )
> + goto out;
> +
> + if ( desc->status & IRQ_GUEST )
> + {
> + d = desc->action->dev_id;
> + printk(XENLOG_ERR "ERROR: IRQ %u is already used by the domain
> %u\n",
> + irq->irq, d->domain_id);
s/the //
> + }
> + else
> + printk(XENLOG_ERR "ERROR: IRQ %u is already used by Xen\n",
> + irq->irq);
> + retval = -EADDRINUSE;
> + goto out;
> + }
> +
> desc->handler = &gic_guest_irq_type;
> desc->status |= IRQ_GUEST;
>
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |