From patchwork Fri Apr 15 18:08:19 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Guennadi Liakhovetski X-Patchwork-Id: 711161 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by demeter1.kernel.org (8.14.4/8.14.3) with ESMTP id p3FI8RTp006227 for ; Fri, 15 Apr 2011 18:08:28 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755631Ab1DOSIZ (ORCPT ); Fri, 15 Apr 2011 14:08:25 -0400 Received: from moutng.kundenserver.de ([212.227.126.171]:55508 "EHLO moutng.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753487Ab1DOSIY (ORCPT ); Fri, 15 Apr 2011 14:08:24 -0400 Received: from axis700.grange (pD9EB8F8A.dip0.t-ipconnect.de [217.235.143.138]) by mrelayeu.kundenserver.de (node=mreu1) with ESMTP (Nemesis) id 0LoMIP-1PdwWg3QU5-00gHNS; Fri, 15 Apr 2011 20:08:19 +0200 Received: by axis700.grange (Postfix, from userid 1000) id 7713AE6AB4; Fri, 15 Apr 2011 20:08:19 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by axis700.grange (Postfix) with ESMTP id 736931067E6; Fri, 15 Apr 2011 20:08:19 +0200 (CEST) Date: Fri, 15 Apr 2011 20:08:19 +0200 (CEST) From: Guennadi Liakhovetski X-X-Sender: lyakh@axis700.grange To: linux-sh@vger.kernel.org cc: linux-mmc@vger.kernel.org, Magnus Damm , Simon Horman , Linus Walleij Subject: [PATCH] MMC: fix a race between card-detect rescan and clock-gate work instances Message-ID: MIME-Version: 1.0 X-Provags-ID: V02:K0:tVyqYtcJmEDn/iVpl/FNq8iivAtKW0n7nilLhRb3bwX nIWWpF4WrLnHPd/elQByb92NbdagwBIyKRZ30ycZm+XmeXBcYR 3OtXF0IptUKi6iO25fhbOTTlQsfVABpJcJgsvJPWNymDIoPbtr 8oKlQ36F3LboOGlGd8Oj/W8SCK+Z2B+XciBwb7AXDD6Djv6x7L gRFwUuGVrSoAWLv16a0vfR16CeYAlvpcpIZdx+ZzAk= Sender: linux-mmc-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-mmc@vger.kernel.org X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.6 (demeter1.kernel.org [140.211.167.41]); Fri, 15 Apr 2011 18:08:28 +0000 (UTC) Currently there is a race in the MMC core between a card-detect rescan work and the clock-gating work, scheduled from a command completion. Fix it by removing the dedicated clock-gating mutex and using the MMC standard locking mechanism instead. Signed-off-by: Guennadi Liakhovetski Cc: Simon Horman Cc: Magnus Damm Cc: Linus Walleij --- drivers/mmc/core/host.c | 9 ++++----- include/linux/mmc/host.h | 1 - 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/drivers/mmc/core/host.c b/drivers/mmc/core/host.c index 461e6a1..2b200c1 100644 --- a/drivers/mmc/core/host.c +++ b/drivers/mmc/core/host.c @@ -94,7 +94,7 @@ static void mmc_host_clk_gate_delayed(struct mmc_host *host) spin_unlock_irqrestore(&host->clk_lock, flags); return; } - mutex_lock(&host->clk_gate_mutex); + mmc_claim_host(host); spin_lock_irqsave(&host->clk_lock, flags); if (!host->clk_requests) { spin_unlock_irqrestore(&host->clk_lock, flags); @@ -104,7 +104,7 @@ static void mmc_host_clk_gate_delayed(struct mmc_host *host) pr_debug("%s: gated MCI clock\n", mmc_hostname(host)); } spin_unlock_irqrestore(&host->clk_lock, flags); - mutex_unlock(&host->clk_gate_mutex); + mmc_release_host(host); } /* @@ -130,7 +130,7 @@ void mmc_host_clk_ungate(struct mmc_host *host) { unsigned long flags; - mutex_lock(&host->clk_gate_mutex); + mmc_claim_host(host); spin_lock_irqsave(&host->clk_lock, flags); if (host->clk_gated) { spin_unlock_irqrestore(&host->clk_lock, flags); @@ -140,7 +140,7 @@ void mmc_host_clk_ungate(struct mmc_host *host) } host->clk_requests++; spin_unlock_irqrestore(&host->clk_lock, flags); - mutex_unlock(&host->clk_gate_mutex); + mmc_release_host(host); } /** @@ -215,7 +215,6 @@ static inline void mmc_host_clk_init(struct mmc_host *host) host->clk_gated = false; INIT_WORK(&host->clk_gate_work, mmc_host_clk_gate_work); spin_lock_init(&host->clk_lock); - mutex_init(&host->clk_gate_mutex); } /** diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h index bcb793e..eb792cb 100644 --- a/include/linux/mmc/host.h +++ b/include/linux/mmc/host.h @@ -183,7 +183,6 @@ struct mmc_host { struct work_struct clk_gate_work; /* delayed clock gate */ unsigned int clk_old; /* old clock value cache */ spinlock_t clk_lock; /* lock for clk fields */ - struct mutex clk_gate_mutex; /* mutex for clock gating */ #endif /* host specific block data */