From: Julien Grall <julien.grall@linaro.org>
To: xen-devel@lists.xenproject.org
Cc: stefano.stabellini@citrix.com,
Julien Grall <julien.grall@linaro.org>,
tim@xen.org, ian.campbell@citrix.com
Subject: [PATCH v3 12/18] xen/arm: IRQ: Do not allow IRQ to be shared between domains and XEN
Date: Tue, 8 Apr 2014 15:44:01 +0100 [thread overview]
Message-ID: <1396968247-8768-13-git-send-email-julien.grall@linaro.org> (raw)
In-Reply-To: <1396968247-8768-1-git-send-email-julien.grall@linaro.org>
The current dt_route_irq_to_guest implementation sets IRQ_GUEST even if the
IRQ is correctly setup.
An IRQ can be shared between devices, if the devices are not assigned to the
same domain or Xen, then this could result in routing the IRQ to the domain
instead of Xen ...
Also avoid to relying on wrong the behaviour when Xen is routing an IRQ to
DOM0. Therefore check the return code from route_dt_irq_to_guest in
map_device.
Signed-off-by: Julien Grall <julien.grall@linaro.org>
---
Changes in v3:
- Fix typoes and update commit message
Changes in v2:
- Use EBUSY instead of EADDRINUSE for error code
- Don't hardcode the domain in error message
- Fix typo in error message
- Use irq_get_domain
---
xen/arch/arm/domain_build.c | 9 +++++++--
xen/arch/arm/irq.c | 34 +++++++++++++++++++++++++++++++++-
2 files changed, 40 insertions(+), 3 deletions(-)
diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c
index e7b1674..f85e5a9 100644
--- a/xen/arch/arm/domain_build.c
+++ b/xen/arch/arm/domain_build.c
@@ -718,8 +718,13 @@ 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 */
- route_dt_irq_to_guest(d, &irq, dt_node_name(dev));
+ res = route_dt_irq_to_guest(d, &irq, dt_node_name(dev));
+ if ( res )
+ {
+ printk(XENLOG_ERR "Unable to route IRQ %u to domain %u\n",
+ irq.irq, d->domain_id);
+ return res;
+ }
}
/* Map the address ranges */
diff --git a/xen/arch/arm/irq.c b/xen/arch/arm/irq.c
index aac39b0..ae92919 100644
--- a/xen/arch/arm/irq.c
+++ b/xen/arch/arm/irq.c
@@ -253,6 +253,16 @@ int setup_dt_irq(const struct dt_irq *irq, struct irqaction *new)
spin_lock_irqsave(&desc->lock, flags);
+ if ( desc->status & IRQ_GUEST )
+ {
+ struct domain *d = irq_get_domain(desc);
+
+ spin_unlock_irqrestore(&desc->lock, flags);
+ printk(XENLOG_ERR "ERROR: IRQ %u is already in use by the domain %u\n",
+ irq->irq, d->domain_id);
+ return -EBUSY;
+ }
+
disabled = (desc->action == NULL);
rc = __setup_irq(desc, new);
@@ -289,7 +299,7 @@ int route_dt_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;
action = xmalloc(struct irqaction);
@@ -302,6 +312,28 @@ int route_dt_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 )
+ {
+ struct domain *ad = irq_get_domain(desc);
+
+ if ( (desc->status & IRQ_GUEST) && d == ad )
+ goto out;
+
+ if ( desc->status & IRQ_GUEST )
+ printk(XENLOG_ERR "ERROR: IRQ %u is already used by domain %u\n",
+ irq->irq, ad->domain_id);
+ else
+ printk(XENLOG_ERR "ERROR: IRQ %u is already used by Xen\n",
+ irq->irq);
+ retval = -EBUSY;
+ goto out;
+ }
+
retval = __setup_irq(desc, action);
if ( retval )
{
--
1.7.10.4
next prev parent reply other threads:[~2014-04-08 14:44 UTC|newest]
Thread overview: 54+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-04-08 14:43 [PATCH v3 00/18] xen/arm: Interrupt management reworking Julien Grall
2014-04-08 14:43 ` [PATCH v3 01/18] xen/arm: timer: replace timer_dt_irq by timer_get_irq Julien Grall
2014-04-16 15:27 ` Ian Campbell
2014-04-08 14:43 ` [PATCH v3 02/18] xen/arm: IRQ: Use default irq callback from common code for no_irq_type Julien Grall
2014-04-08 14:43 ` [PATCH v3 03/18] xen/arm: IRQ: Rename irq_cfg into arch_irq_desc Julien Grall
2014-04-08 14:43 ` [PATCH v3 04/18] xen/arm: IRQ: move gic {, un}lock in gic_set_irq_properties Julien Grall
2014-04-08 14:43 ` [PATCH v3 05/18] xen/arm: IRQ: drop irq parameter in __setup_irq Julien Grall
2014-04-08 14:43 ` [PATCH v3 06/18] xen/arm: IRQ: remove __init from setup_dt_irq, request_dt_irq and release_irq Julien Grall
2014-04-08 14:43 ` [PATCH v3 07/18] xen/arm: IRQ: Rework gic_route_irq_to_guest function Julien Grall
2014-04-16 15:31 ` Ian Campbell
2014-04-08 14:43 ` [PATCH v3 08/18] xen/arm: IRQ: Move IRQ management from gic.c to irq.c Julien Grall
2014-04-17 10:38 ` Ian Campbell
2014-04-08 14:43 ` [PATCH v3 09/18] xen/arm: IRQ Introduce irq_get_domain Julien Grall
2014-04-08 14:43 ` [PATCH v3 10/18] xen/arm: IRQ: Require desc.lock held by callers of hw_irq_controller callbacks Julien Grall
2014-04-16 15:36 ` Ian Campbell
2014-04-16 15:39 ` Julien Grall
2014-04-08 14:44 ` [PATCH v3 11/18] xen/arm: IRQ: Defer routing IRQ to Xen until setup_irq() call Julien Grall
2014-04-16 15:39 ` Ian Campbell
2014-04-08 14:44 ` Julien Grall [this message]
2014-04-16 15:40 ` [PATCH v3 12/18] xen/arm: IRQ: Do not allow IRQ to be shared between domains and XEN Ian Campbell
2014-04-21 19:16 ` Julien Grall
2014-04-08 14:44 ` [PATCH v3 13/18] xen/serial: remove serial_dt_irq Julien Grall
2014-04-17 10:22 ` Julien Grall
2014-04-17 10:35 ` Ian Campbell
2014-04-08 14:44 ` [PATCH v3 14/18] xen/arm: IRQ: Store IRQ type in arch_irq_desc Julien Grall
2014-04-16 15:45 ` Ian Campbell
2014-04-16 15:52 ` Julien Grall
2014-04-08 14:44 ` [PATCH v3 15/18] xen/arm: IRQ: Replace {request, setup}_dt_irq by {request, setup}_irq Julien Grall
2014-04-16 15:46 ` Ian Campbell
2014-04-08 14:44 ` [PATCH v3 16/18] xen: IRQ: Add dev_id parameter to release_irq Julien Grall
2014-04-08 14:55 ` Jan Beulich
2014-04-16 15:47 ` Ian Campbell
2014-04-08 14:44 ` [PATCH v3 17/18] xen/arm: IRQ: extend {request, setup}_irq to take an irqflags in parameter Julien Grall
2014-04-08 14:58 ` Jan Beulich
2014-04-16 15:46 ` Julien Grall
2014-04-16 15:48 ` Ian Campbell
2014-04-08 14:44 ` [PATCH v3 18/18] xen/arm: IRQ: Handle multiple action per IRQ Julien Grall
2014-04-08 14:59 ` Jan Beulich
2014-04-16 16:01 ` Julien Grall
2014-04-16 15:54 ` Ian Campbell
2014-04-16 16:06 ` Julien Grall
2014-04-16 16:17 ` Ian Campbell
2014-04-16 16:21 ` Jan Beulich
2014-04-16 16:23 ` Julien Grall
2014-04-17 7:07 ` Jan Beulich
2014-04-17 10:36 ` Julien Grall
2014-04-17 11:15 ` Jan Beulich
2014-04-17 11:22 ` Julien Grall
2014-04-17 11:36 ` Ian Campbell
2014-04-17 12:18 ` Julien Grall
2014-04-17 12:27 ` Ian Campbell
2014-04-17 12:35 ` Julien Grall
2014-04-17 10:26 ` [PATCH v3 00/18] xen/arm: Interrupt management reworking Julien Grall
2014-04-17 10:39 ` Ian Campbell
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1396968247-8768-13-git-send-email-julien.grall@linaro.org \
--to=julien.grall@linaro.org \
--cc=ian.campbell@citrix.com \
--cc=stefano.stabellini@citrix.com \
--cc=tim@xen.org \
--cc=xen-devel@lists.xenproject.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).