From patchwork Tue Apr 22 12:58:44 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Julien Grall X-Patchwork-Id: 28791 Return-Path: X-Original-To: linaro@patches.linaro.org Delivered-To: linaro@patches.linaro.org Received: from mail-ob0-f199.google.com (mail-ob0-f199.google.com [209.85.214.199]) by ip-10-151-82-157.ec2.internal (Postfix) with ESMTPS id E0D7F203AC for ; Tue, 22 Apr 2014 13:04:51 +0000 (UTC) Received: by mail-ob0-f199.google.com with SMTP id gq1sf34367933obb.2 for ; Tue, 22 Apr 2014 06:04:51 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:delivered-to:from:to:date:message-id:in-reply-to :references:cc:subject:precedence:list-id:list-unsubscribe:list-post :list-help:list-subscribe:mime-version:sender:errors-to :x-original-sender:x-original-authentication-results:mailing-list :list-archive:content-type:content-transfer-encoding; bh=HFiSd0kVz4Fo281wzpbQkvIuZGYI+dL+pETd7QUXDPM=; b=ktF9oIwXwo+9K1kKyVXT9IfGZRyA3uczMDvG8wRhW+ov6jR19+KB2JQsLq18O+6Rrv mFTSjM05p40ToEZd0PNsLb5m7MkCmXHePnHsgoTL37H7I2oc0tAyEHMhoHrajc8IfJ97 qJ4lmZwzPxzHx5LVnjBKilqN40YiYkK0eaZAi0D6TtDdX8LOhuu2iK8ucsSAteTtx55n Dt3PcVZ7JFOdW1trINPkDa32j0G9ZqMXP+qRCzw48tAP7jWc2aD6jQX6FNhj6IOqcwMB NbjJ8mh+TsUcG6dDzwDTFUaKSUZL9Z6MerX4wxe5Pdqn93EGT5a34Hi7LOa6lDZ6iAvi QuKA== X-Gm-Message-State: ALoCoQlxlQ8dCy5Hw9YJZuRaDqjMLWk+Bgmu9uC9h13P1CV7rGVVZh4JfvCLS5I/hoskV5KUMGlz X-Received: by 10.182.128.166 with SMTP id np6mr6750991obb.16.1398171891378; Tue, 22 Apr 2014 06:04:51 -0700 (PDT) X-BeenThere: patchwork-forward@linaro.org Received: by 10.140.95.248 with SMTP id i111ls107176qge.7.gmail; Tue, 22 Apr 2014 06:04:51 -0700 (PDT) X-Received: by 10.52.65.132 with SMTP id x4mr1172459vds.36.1398171891119; Tue, 22 Apr 2014 06:04:51 -0700 (PDT) Received: from mail-ve0-f173.google.com (mail-ve0-f173.google.com [209.85.128.173]) by mx.google.com with ESMTPS id p8si6889496vef.176.2014.04.22.06.04.51 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Tue, 22 Apr 2014 06:04:51 -0700 (PDT) Received-SPF: neutral (google.com: 209.85.128.173 is neither permitted nor denied by best guess record for domain of patch+caf_=patchwork-forward=linaro.org@linaro.org) client-ip=209.85.128.173; Received: by mail-ve0-f173.google.com with SMTP id oy12so9312505veb.4 for ; Tue, 22 Apr 2014 06:04:51 -0700 (PDT) X-Received: by 10.220.161.8 with SMTP id p8mr36540929vcx.4.1398171891040; Tue, 22 Apr 2014 06:04:51 -0700 (PDT) X-Forwarded-To: patchwork-forward@linaro.org X-Forwarded-For: patch@linaro.org patchwork-forward@linaro.org Delivered-To: patch@linaro.org Received: by 10.220.221.72 with SMTP id ib8csp22916vcb; Tue, 22 Apr 2014 06:04:50 -0700 (PDT) X-Received: by 10.58.112.98 with SMTP id ip2mr518774veb.35.1398171890631; Tue, 22 Apr 2014 06:04:50 -0700 (PDT) Received: from lists.xen.org (lists.xen.org. [50.57.142.19]) by mx.google.com with ESMTPS id cx1si5532615vdb.20.2014.04.22.06.04.50 for (version=TLSv1 cipher=RC4-SHA bits=128/128); Tue, 22 Apr 2014 06:04:50 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of xen-devel-bounces@lists.xen.org designates 50.57.142.19 as permitted sender) client-ip=50.57.142.19; Received: from localhost ([127.0.0.1] helo=lists.xen.org) by lists.xen.org with esmtp (Exim 4.72) (envelope-from ) id 1WcaKb-0002Ma-Bh; Tue, 22 Apr 2014 13:01:49 +0000 Received: from mail6.bemta14.messagelabs.com ([193.109.254.103]) by lists.xen.org with esmtp (Exim 4.72) (envelope-from ) id 1WcaIb-0001i9-BN for xen-devel@lists.xenproject.org; Tue, 22 Apr 2014 12:59:45 +0000 Received: from [193.109.254.147:5412] by server-12.bemta-14.messagelabs.com id 68/1F-27473-2A766535; Tue, 22 Apr 2014 12:59:14 +0000 X-Env-Sender: julien.grall@linaro.org X-Msg-Ref: server-15.tower-27.messagelabs.com!1398171553!118919!1 X-Originating-IP: [74.125.83.41] X-SpamReason: No, hits=0.0 required=7.0 tests= X-StarScan-Received: X-StarScan-Version: 6.11.3; banners=-,-,- X-VirusChecked: Checked Received: (qmail 24347 invoked from network); 22 Apr 2014 12:59:13 -0000 Received: from mail-ee0-f41.google.com (HELO mail-ee0-f41.google.com) (74.125.83.41) by server-15.tower-27.messagelabs.com with RC4-SHA encrypted SMTP; 22 Apr 2014 12:59:13 -0000 Received: by mail-ee0-f41.google.com with SMTP id t10so4662116eei.14 for ; Tue, 22 Apr 2014 05:59:13 -0700 (PDT) X-Received: by 10.14.113.194 with SMTP id a42mr1770745eeh.115.1398171553544; Tue, 22 Apr 2014 05:59:13 -0700 (PDT) Received: from belegaer.uk.xensource.com ([185.25.64.249]) by mx.google.com with ESMTPSA id x45sm112862825eef.15.2014.04.22.05.59.12 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 22 Apr 2014 05:59:12 -0700 (PDT) From: Julien Grall To: xen-devel@lists.xenproject.org Date: Tue, 22 Apr 2014 13:58:44 +0100 Message-Id: <1398171530-27391-13-git-send-email-julien.grall@linaro.org> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1398171530-27391-1-git-send-email-julien.grall@linaro.org> References: <1398171530-27391-1-git-send-email-julien.grall@linaro.org> Cc: stefano.stabellini@citrix.com, Julien Grall , tim@xen.org, ian.campbell@citrix.com Subject: [Xen-devel] [PATCH v4 12/18] xen/arm: IRQ: Do not allow IRQ to be shared between domains and XEN X-BeenThere: xen-devel@lists.xen.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Post: , List-Help: , List-Subscribe: , MIME-Version: 1.0 Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org X-Removed-Original-Auth: Dkim didn't pass. X-Original-Sender: julien.grall@linaro.org X-Original-Authentication-Results: mx.google.com; spf=neutral (google.com: 209.85.128.173 is neither permitted nor denied by best guess record for domain of patch+caf_=patchwork-forward=linaro.org@linaro.org) smtp.mail=patch+caf_=patchwork-forward=linaro.org@linaro.org Mailing-list: list patchwork-forward@linaro.org; contact patchwork-forward+owners@linaro.org X-Google-Group-Id: 836684582541 List-Archive: 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 Acked-by: Ian Campbell --- Changes in v4: - Don't forget to free action if sanity check has failed 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 | 41 +++++++++++++++++++++++++++++++++++++---- 2 files changed, 44 insertions(+), 6 deletions(-) diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c index 5b636c8..9dcff1c 100644 --- a/xen/arch/arm/domain_build.c +++ b/xen/arch/arm/domain_build.c @@ -725,8 +725,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 9f1ca40..44696e7 100644 --- a/xen/arch/arm/irq.c +++ b/xen/arch/arm/irq.c @@ -256,6 +256,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); @@ -292,7 +302,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); @@ -305,19 +315,42 @@ int route_dt_irq_to_guest(struct domain *d, const struct dt_irq *irq, spin_lock_irqsave(&desc->lock, flags); - retval = __setup_irq(desc, action); - if ( retval ) + /* 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 ) { - xfree(action); + 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 ) + goto out; + level = dt_irq_is_level_triggered(irq); gic_route_irq_to_guest(d, desc, level, cpumask_of(smp_processor_id()), GIC_PRI_IRQ); + spin_unlock_irqrestore(&desc->lock, flags); + return 0; out: spin_unlock_irqrestore(&desc->lock, flags); + xfree(action); + return retval; }