From patchwork Thu Mar 20 18:47:12 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Bresticker X-Patchwork-Id: 3867381 Return-Path: X-Original-To: patchwork-linux-mmc@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 01AC39F39B for ; Thu, 20 Mar 2014 18:52:39 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 303BD201F4 for ; Thu, 20 Mar 2014 18:52:38 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 4A18B201ED for ; Thu, 20 Mar 2014 18:52:37 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1759267AbaCTSwg (ORCPT ); Thu, 20 Mar 2014 14:52:36 -0400 Received: from mail-yh0-f74.google.com ([209.85.213.74]:52021 "EHLO mail-yh0-f74.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754341AbaCTSwf (ORCPT ); Thu, 20 Mar 2014 14:52:35 -0400 Received: by mail-yh0-f74.google.com with SMTP id f10so151875yha.1 for ; Thu, 20 Mar 2014 11:52:35 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=6J/99etof/XJB8JBuWqSx8EwEuGf5jym+kPhpEt4LTs=; b=C+44O+PGvjy0jwTur/tiqfNE5FcZUJwzxW/EYZif+xmxiGo4YhMcT7DKSjHembG1wJ baFZY1nqpdz43I0ugnPAPOJfNWD8kKBNvPirH3ZIBSeeUTsOjd7Kd8PWyK1BJf/7B+JP B1WFo/lz9RN6VU4Ok6Q+RXufWRCUDxdqIUxgTWxv9rU6Ztq+AfHMk1QNKRG3nh5FxBEl 3h4LmMfmKxZypg3cagb4RXqQEnJAuU7m+r9Lk4bGz/4Jssu5OuV3il5hWRvo/TEeAYkw ZJIs32dq75wdi0G24garffTlIvanw1+zSNO6Be/ZPge8jzmdF6zijccly/o7wla2I9Su Bb0g== X-Gm-Message-State: ALoCoQmygXG3uI8e5d8/XmYwwGoAdo1EWLqGUaJydi0EER9gCQyBM27svb1KiTrPxVrPl84L6Aqh29//lOt3aSacFT+7/ux717JNuIxHw0G8z0HZbbtjj6rL5QcyiWDVMy8nv88ncu6Tf5NwQ6pf08R6Y64cNvq11veFKS7DK7P1RiVL2m8RBGNkMn86VN2TpyCNAIinxXxY1gbWIIiMi0TbuS8a6TxtLw== X-Received: by 10.58.3.98 with SMTP id b2mr8125796veb.2.1395341236883; Thu, 20 Mar 2014 11:47:16 -0700 (PDT) Received: from corp2gmr1-1.hot.corp.google.com (corp2gmr1-1.hot.corp.google.com [172.24.189.92]) by gmr-mx.google.com with ESMTPS id x29si471683yha.0.2014.03.20.11.47.16 for (version=TLSv1.1 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 20 Mar 2014 11:47:16 -0700 (PDT) Received: from abrestic.mtv.corp.google.com (abrestic.mtv.corp.google.com [172.22.72.111]) by corp2gmr1-1.hot.corp.google.com (Postfix) with ESMTP id B63CB31C1C9; Thu, 20 Mar 2014 11:47:16 -0700 (PDT) Received: by abrestic.mtv.corp.google.com (Postfix, from userid 137652) id 50DC72210EE; Thu, 20 Mar 2014 11:47:16 -0700 (PDT) From: Andrew Bresticker To: Chris Ball Cc: Ulf Hansson , linux-mmc@vger.kernel.org, linux-kernel@vger.kernel.org, Andrew Bresticker Subject: [PATCH] mmc: sdhci: don't read cd-gpio while holding spinlock Date: Thu, 20 Mar 2014 11:47:12 -0700 Message-Id: <1395341232-14490-1-git-send-email-abrestic@chromium.org> X-Mailer: git-send-email 1.9.0.279.gdc9e3eb Sender: linux-mmc-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-mmc@vger.kernel.org X-Spam-Status: No, score=-6.9 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, T_RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP mmc_request() reads the cd-gpio via mmc_gpio_get_cd(), which can sleep, while holding host->lock. This may result in the following BUG: BUG: spinlock wrong CPU on CPU#2, kworker/u8:16/4296 lock: 0xea6b9c80, .magic: dead4ead, .owner: kworker/u8:16/4296, .owner_cpu: 0 CPU: 2 PID: 4296 Comm: kworker/u8:16 Tainted: G C 3.10.18 #137 Workqueue: kmmcd mmc_rescan [<8020cf8c>] (unwind_backtrace+0x0/0x118) from [<8020a0c8>] (show_stack+0x20/0x24) [<8020a0c8>] (show_stack+0x20/0x24) from [<8075e5b8>] (dump_stack+0x20/0x28) [<8075e5b8>] (dump_stack+0x20/0x28) from [<804184a8>] (spin_dump+0x80/0x94) [<804184a8>] (spin_dump+0x80/0x94) from [<804184e8>] (spin_bug+0x2c/0x30) [<804184e8>] (spin_bug+0x2c/0x30) from [<80418790>] (do_raw_spin_unlock+0x94/0xd4) [<80418790>] (do_raw_spin_unlock+0x94/0xd4) from [<80761a44>] (_raw_spin_unlock_irqrestore+0x1c/0x24) [<80761a44>] (_raw_spin_unlock_irqrestore+0x1c/0x24) from [<805ff66c>] (sdhci_request+0x1c8/0x1d0) [<805ff66c>] (sdhci_request+0x1c8/0x1d0) from [<805ebb5c>] (mmc_start_request+0xec/0xf4) [<805ebb5c>] (mmc_start_request+0xec/0xf4) from [<805ebcbc>] (mmc_wait_for_req+0x80/0xf4) ... Read the cd-gpio before acquiring the spinlock instead. Signed-off-by: Andrew Bresticker --- drivers/mmc/host/sdhci.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c index 04a5e25..f2ef978 100644 --- a/drivers/mmc/host/sdhci.c +++ b/drivers/mmc/host/sdhci.c @@ -1340,6 +1340,7 @@ static void sdhci_request(struct mmc_host *mmc, struct mmc_request *mrq) u32 tuning_opcode; host = mmc_priv(mmc); + present = mmc_gpio_get_cd(host->mmc); sdhci_runtime_pm_get(host); @@ -1371,7 +1372,6 @@ static void sdhci_request(struct mmc_host *mmc, struct mmc_request *mrq) * zero: cd-gpio is used, and card is removed * one: cd-gpio is used, and card is present */ - present = mmc_gpio_get_cd(host->mmc); if (present < 0) { /* If polling, assume that the card is always present. */ if (host->quirks & SDHCI_QUIRK_BROKEN_CARD_DETECTION)