From patchwork Thu Apr 3 20:42:00 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Julien Grall X-Patchwork-Id: 27708 Return-Path: X-Original-To: linaro@patches.linaro.org Delivered-To: linaro@patches.linaro.org Received: from mail-we0-f199.google.com (mail-we0-f199.google.com [74.125.82.199]) by ip-10-151-82-157.ec2.internal (Postfix) with ESMTPS id 0C29020490 for ; Thu, 3 Apr 2014 20:44:21 +0000 (UTC) Received: by mail-we0-f199.google.com with SMTP id x48sf2407112wes.10 for ; Thu, 03 Apr 2014 13:44:21 -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=8KTy7m3+q/X+eBv3v9nn2vAKqPpbcOXTpRA3hZA/k0k=; b=LX2CQ8KBujCWB/pVoy5N1jc/X6h66by0vXH+mEM99Kn3k4q2MVb5LWAMkKupUkUfJB cIDlhTsnBY7DVZzyPE2G78r59dvBznH630oaiVwxkvq6oeX32K8AfcpXDPTfQXqn5j9i VG0wslegsntwgWRx/48wNZoWd1YymYyCzNdl+wmVT5Zm6aaHqFlHN66we+S9tGqM0ujl xnTzoBrE1w4IHVg8lgvyWGOAlmmAQDxVuXy8+DizBCHpTRdK3HaHmTpkrFsK4bfUvSVS SxFbQP9GT3S0juq9WQ6bX8jfgxM3X7A1QAuDFgifS0GZY7IhkeMON7RnAJUguDDebj/S CuJg== X-Gm-Message-State: ALoCoQnECjW0GWL5RcfdUcQUtJoX2fs6HoOAR9W4IiUg0ilZVjr1sAEAfKyUC3SmCbnJp/manXTm X-Received: by 10.152.3.38 with SMTP id 6mr2532361laz.0.1396557860922; Thu, 03 Apr 2014 13:44:20 -0700 (PDT) X-BeenThere: patchwork-forward@linaro.org Received: by 10.140.48.202 with SMTP id o68ls812007qga.53.gmail; Thu, 03 Apr 2014 13:44:20 -0700 (PDT) X-Received: by 10.221.40.10 with SMTP id to10mr4513141vcb.22.1396557860799; Thu, 03 Apr 2014 13:44:20 -0700 (PDT) Received: from mail-vc0-f177.google.com (mail-vc0-f177.google.com [209.85.220.177]) by mx.google.com with ESMTPS id fx7si1407265vcb.153.2014.04.03.13.44.20 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Thu, 03 Apr 2014 13:44:20 -0700 (PDT) Received-SPF: neutral (google.com: 209.85.220.177 is neither permitted nor denied by best guess record for domain of patch+caf_=patchwork-forward=linaro.org@linaro.org) client-ip=209.85.220.177; Received: by mail-vc0-f177.google.com with SMTP id if17so2370822vcb.22 for ; Thu, 03 Apr 2014 13:44:20 -0700 (PDT) X-Received: by 10.58.34.67 with SMTP id x3mr468068vei.37.1396557860716; Thu, 03 Apr 2014 13:44:20 -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.12.8 with SMTP id v8csp59805vcv; Thu, 3 Apr 2014 13:44:19 -0700 (PDT) X-Received: by 10.52.251.199 with SMTP id zm7mr7927381vdc.21.1396557846212; Thu, 03 Apr 2014 13:44:06 -0700 (PDT) Received: from lists.xen.org (lists.xen.org. [50.57.142.19]) by mx.google.com with ESMTPS id t1si1416872vcj.94.2014.04.03.13.44.05 for (version=TLSv1 cipher=RC4-SHA bits=128/128); Thu, 03 Apr 2014 13:44:06 -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 1WVoT7-0008EE-Dq; Thu, 03 Apr 2014 20:42:37 +0000 Received: from mail6.bemta5.messagelabs.com ([195.245.231.135]) by lists.xen.org with esmtp (Exim 4.72) (envelope-from ) id 1WVoT5-0008D7-W4 for xen-devel@lists.xenproject.org; Thu, 03 Apr 2014 20:42:36 +0000 Received: from [85.158.139.211:33622] by server-15.bemta-5.messagelabs.com id 58/42-11079-BB7CD335; Thu, 03 Apr 2014 20:42:35 +0000 X-Env-Sender: julien.grall@linaro.org X-Msg-Ref: server-3.tower-206.messagelabs.com!1396557754!5317013!1 X-Originating-IP: [74.125.82.177] X-SpamReason: No, hits=0.0 required=7.0 tests= X-StarScan-Received: X-StarScan-Version: 6.11.1; banners=-,-,- X-VirusChecked: Checked Received: (qmail 6618 invoked from network); 3 Apr 2014 20:42:34 -0000 Received: from mail-we0-f177.google.com (HELO mail-we0-f177.google.com) (74.125.82.177) by server-3.tower-206.messagelabs.com with RC4-SHA encrypted SMTP; 3 Apr 2014 20:42:34 -0000 Received: by mail-we0-f177.google.com with SMTP id u57so2466295wes.36 for ; Thu, 03 Apr 2014 13:42:34 -0700 (PDT) X-Received: by 10.180.37.12 with SMTP id u12mr14683065wij.0.1396557754239; Thu, 03 Apr 2014 13:42:34 -0700 (PDT) Received: from belegaer.uk.xensource.com ([185.25.64.249]) by mx.google.com with ESMTPSA id t50sm14510572eev.28.2014.04.03.13.42.33 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 03 Apr 2014 13:42:33 -0700 (PDT) From: Julien Grall To: xen-devel@lists.xenproject.org Date: Thu, 3 Apr 2014 21:42:00 +0100 Message-Id: <1396557727-19102-10-git-send-email-julien.grall@linaro.org> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1396557727-19102-1-git-send-email-julien.grall@linaro.org> References: <1396557727-19102-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 v2 09/16] xen/arm: IRQ: Add lock contrainst for gic_irq_{startup, shutdown} 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.220.177 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: When multiple action will be supported, gic_irq_{startup,shutdown} will have to be called in the same critical zone as setup/release. Otherwise it could have a race condition if at the same time CPU A is calling release_dt_irq and CPU B is calling setup_dt_irq. This could end up to the IRQ not being enabled. Signed-off-by: Julien Grall --- 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) { int irq = desc->irq; - unsigned long flags; - spin_lock_irqsave(&desc->lock, flags); + ASSERT(spin_is_locked(&desc->lock)); + ASSERT(!local_irq_is_enabled()); + spin_lock(&gic.lock); desc->status &= ~IRQ_DISABLED; dsb(sy); /* Enable routing */ GICD[GICD_ISENABLER + irq / 32] = (1u << (irq % 32)); spin_unlock(&gic.lock); - spin_unlock_irqrestore(&desc->lock, flags); + + return 0; } -static void gic_irq_disable(struct irq_desc *desc) +static void gic_irq_shutdown(struct irq_desc *desc) { int irq = desc->irq; - unsigned long flags; - spin_lock_irqsave(&desc->lock, flags); + ASSERT(spin_is_locked(&desc->lock)); + ASSERT(!local_irq_is_enabled()); + spin_lock(&gic.lock); /* Disable routing */ GICD[GICD_ICENABLER + irq / 32] = (1u << (irq % 32)); desc->status |= IRQ_DISABLED; spin_unlock(&gic.lock); - spin_unlock_irqrestore(&desc->lock, flags); } -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); - desc->handler = &gic_host_irq_type; gic_set_irq_properties(irq, level, cpu_mask, priority); diff --git a/xen/arch/arm/irq.c b/xen/arch/arm/irq.c index 5111b90..798353b 100644 --- a/xen/arch/arm/irq.c +++ b/xen/arch/arm/irq.c @@ -214,9 +214,10 @@ void release_irq(unsigned int irq) desc = irq_to_desc(irq); + spin_lock_irqsave(&desc->lock,flags); + desc->handler->shutdown(desc); - spin_lock_irqsave(&desc->lock,flags); action = desc->action; desc->action = NULL; desc->status &= ~IRQ_GUEST; @@ -251,11 +252,12 @@ int setup_dt_irq(const struct dt_irq *irq, struct irqaction *new) spin_lock_irqsave(&desc->lock, flags); rc = __setup_irq(desc, new); - spin_unlock_irqrestore(&desc->lock, flags); if ( !rc ) desc->handler->startup(desc); + spin_unlock_irqrestore(&desc->lock, flags); + return rc; }