Message ID | 20230606065918.460866-1-martin@geanix.com |
---|---|
State | New |
Headers |
Return-Path: <linux-kernel-owner@vger.kernel.org> Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:994d:0:b0:3d9:f83d:47d9 with SMTP id k13csp3199040vqr; Tue, 6 Jun 2023 00:08:20 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ4awB36aZckwJ2bnHYHeySFWGO5HhIdGz5ZM+3MDfWiAI3scjucZnGeiI+nyBzGHeIjJ4Bd X-Received: by 2002:a05:620a:4091:b0:75e:bb4d:f682 with SMTP id f17-20020a05620a409100b0075ebb4df682mr1325858qko.35.1686035299979; Tue, 06 Jun 2023 00:08:19 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1686035299; cv=none; d=google.com; s=arc-20160816; b=EMPdtf9ICS5vKS8Se2fnOXEMgJK4/Za6trXT0d6kKou83gFwJZnyFWbcJUMepDzTDC X+enfL1tuwZvUBEYQf6lFrs1cQqqd7sBTvWy/42ntmmAQlCambToWVq08PkQafAmVSox CACOvzxNOFbvzM9jOXXllnLD2NhO4tmUQk6pLHrgGeG2dtAakz3TeB7Z7ThSNEZANQL1 pnU7xC/gB2vR1dNHIWKGb74maSXLR/9xlrXhgQf/IhLY1V+njEZCgmBt9Cn0QYSMrMIQ VLUdzmacD2tifbhEyVHh0Vivd3XAL905FYrcAgcCl3YUAN9WAanaRSwuy9SiWe3lMODl ro/Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from:dkim-signature; bh=K7epI5A28Meujck03fbblALNqWWuElXg9sQ7ZRqbG/g=; b=eGSGvxMS+fpbIRgJhVDhZrNeaGnP1FB7ct7mn7/wbt3qpbNHxuK4GAMT94zt2Ftk6y 39ZAkWmqrSVtzfqPaL6aXX/34MRfXhFLdqwbqHDduzScTJZQqCFeYAMakjJkrFZq9KGW F1ubUH4W4XegqIwaGPKzdg3LMLT/1FPso7hHIFeP2lC36imBOje4KUo2wqQUCsKOIhYP P6k+Axb4TmNMuE5u/w7opQjPcr6QKO6MFLommzze7LQkqi7WpVHV9Ftdzyb37jbUrs+Z MZQ+f1DMTGcfMQCbTB3beyCHpv1glpL6eN2yqdBWT7zD/o+2B97T3p0AvzVtO7KD2Evh Merg== ARC-Authentication-Results: i=1; mx.google.com; dkim=temperror (no key for signature) header.i=@geanix.com header.s=first header.b=f8lJ5bAd; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=geanix.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id p5-20020ad45f45000000b0061e1d766d06si5750807qvg.129.2023.06.06.00.08.06; Tue, 06 Jun 2023 00:08:19 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=temperror (no key for signature) header.i=@geanix.com header.s=first header.b=f8lJ5bAd; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=geanix.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234542AbjFFHAD (ORCPT <rfc822;xxoosimple@gmail.com> + 99 others); Tue, 6 Jun 2023 03:00:03 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:55354 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235732AbjFFG74 (ORCPT <rfc822;linux-kernel@vger.kernel.org>); Tue, 6 Jun 2023 02:59:56 -0400 Received: from first.geanix.com (first.geanix.com [116.203.34.67]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 9AB81E43; Mon, 5 Jun 2023 23:59:52 -0700 (PDT) Received: from xps.geanix.com (unknown [87.54.11.140]) by first.geanix.com (Postfix) with ESMTPSA id D467D4E2838; Tue, 6 Jun 2023 06:59:49 +0000 (UTC) Authentication-Results: ORIGINATING; auth=pass smtp.auth=martin@geanix.com smtp.mailfrom=martin@geanix.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=geanix.com; s=first; t=1686034790; bh=PWNQ09ijoe1DVvYJBNyrmhSiGQflwUabh55Y0/h4L1c=; h=From:To:Cc:Subject:Date; b=f8lJ5bAdZwyI7auhIQ7ItkEZ4qysN5Dl+emu2B7RywGiKcr3FFMQWPvER1ZA6ScK7 2tnmbKnDC4/vRbcWkRmz6ShT3zFghuRUp/vVvrlQieZz53HFdVO/U5IodZsBQHxaeS QMdeEw4GhEDmKcLejFIS3OK7LVxg/Ktc/i/6uqiMK7J4eSK+Eucv8TVLBuKuOyhGLW XhI/n7LDvTcC0xsV/OGLZfJE6gAd3BZ+g0Q6oSJEyo9yDsSaaxmxzQWvv5BVHb3u2A qMKeQEPbvZaUoXKmzN1nWqrbZQqztvBhga7Z+jgyaTuKRbIDVMUJkMOi6sw+V2ctXI 6DUSHPVs5Naeg== From: =?utf-8?q?Martin_Hundeb=C3=B8ll?= <martin@geanix.com> To: Ulf Hansson <ulf.hansson@linaro.org>, Neil Armstrong <neil.armstrong@linaro.org>, Kevin Hilman <khilman@baylibre.com>, Jerome Brunet <jbrunet@baylibre.com>, Martin Blumenstingl <martin.blumenstingl@googlemail.com> Cc: =?utf-8?q?Martin_Hundeb=C3=B8ll?= <mhu@rtx.dk>, stable@vger.kernel.org, =?utf-8?q?Martin_Hundeb=C3=B8ll?= <martin@geanix.com>, linux-mmc@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-amlogic@lists.infradead.org, linux-kernel@vger.kernel.org Subject: [PATCH] mmc: meson: move mmc_request_done() call to irq thread Date: Tue, 6 Jun 2023 08:59:17 +0200 Message-Id: <20230606065918.460866-1-martin@geanix.com> X-Mailer: git-send-email 2.40.1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE,URIBL_BLOCKED autolearn=no autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: <linux-kernel.vger.kernel.org> X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1767936150887868854?= X-GMAIL-MSGID: =?utf-8?q?1767936150887868854?= |
Series |
mmc: meson: move mmc_request_done() call to irq thread
|
|
Commit Message
Martin Hundebøll
June 6, 2023, 6:59 a.m. UTC
From: Martin Hundebøll <mhu@rtx.dk> The call to mmc_request_done() can schedule, so it cannot be called from irq context. Wake the irq thread if it needs to be called, and call it from there instead. Fixes the following kernel bug, which appears when running an RT patched kernel on the AmLogic Meson AXG A113X SoC: [ 11.111407] BUG: scheduling while atomic: kworker/0:1H/75/0x00010001 [ 11.111438] Modules linked in: [ 11.111451] CPU: 0 PID: 75 Comm: kworker/0:1H Not tainted 6.4.0-rc3-rt2-rtx-00081-gfd07f41ed6b4-dirty #1 [ 11.111461] Hardware name: RTX AXG A113X Linux Platform Board (DT) [ 11.111469] Workqueue: kblockd blk_mq_run_work_fn [ 11.111492] Call trace: [ 11.111497] dump_backtrace+0xac/0xe8 [ 11.111510] show_stack+0x18/0x28 [ 11.111518] dump_stack_lvl+0x48/0x60 [ 11.111530] dump_stack+0x18/0x24 [ 11.111537] __schedule_bug+0x4c/0x68 [ 11.111548] __schedule+0x80/0x574 [ 11.111558] schedule_loop+0x2c/0x50 [ 11.111567] schedule_rtlock+0x14/0x20 [ 11.111576] rtlock_slowlock_locked+0x468/0x730 [ 11.111587] rt_spin_lock+0x40/0x64 [ 11.111596] __wake_up_common_lock+0x5c/0xc4 [ 11.111610] __wake_up+0x18/0x24 [ 11.111620] mmc_blk_mq_req_done+0x68/0x138 [ 11.111633] mmc_request_done+0x104/0x118 [ 11.111644] meson_mmc_request_done+0x38/0x48 [ 11.111654] meson_mmc_irq+0x128/0x1f0 [ 11.111663] __handle_irq_event_percpu+0x70/0x114 [ 11.111674] handle_irq_event_percpu+0x18/0x4c [ 11.111683] handle_irq_event+0x80/0xb8 [ 11.111691] handle_fasteoi_irq+0xa4/0x120 [ 11.111704] handle_irq_desc+0x20/0x38 [ 11.111712] generic_handle_domain_irq+0x1c/0x28 [ 11.111721] gic_handle_irq+0x8c/0xa8 [ 11.111735] call_on_irq_stack+0x24/0x4c [ 11.111746] do_interrupt_handler+0x88/0x94 [ 11.111757] el1_interrupt+0x34/0x64 [ 11.111769] el1h_64_irq_handler+0x18/0x24 [ 11.111779] el1h_64_irq+0x64/0x68 [ 11.111786] __add_wait_queue+0x0/0x4c [ 11.111795] mmc_blk_rw_wait+0x84/0x118 [ 11.111804] mmc_blk_mq_issue_rq+0x5c4/0x654 [ 11.111814] mmc_mq_queue_rq+0x194/0x214 [ 11.111822] blk_mq_dispatch_rq_list+0x3ac/0x528 [ 11.111834] __blk_mq_sched_dispatch_requests+0x340/0x4d0 [ 11.111847] blk_mq_sched_dispatch_requests+0x38/0x70 [ 11.111858] blk_mq_run_work_fn+0x3c/0x70 [ 11.111865] process_one_work+0x17c/0x1f0 [ 11.111876] worker_thread+0x1d4/0x26c [ 11.111885] kthread+0xe4/0xf4 [ 11.111894] ret_from_fork+0x10/0x20 Fixes: 51c5d8447bd71b ("MMC: meson: initial support for GX platforms") Cc: stable@vger.kernel.org Signed-off-by: Martin Hundebøll <martin@geanix.com> --- drivers/mmc/host/meson-gx-mmc.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-)
Comments
Hi Martin, On Tue, Jun 6, 2023 at 8:59 AM Martin Hundebøll <martin@geanix.com> wrote: [...] > @@ -1040,6 +1034,13 @@ static irqreturn_t meson_mmc_irq_thread(int irq, void *dev_id) > if (WARN_ON(!cmd)) > return IRQ_NONE; > > + if (!meson_mmc_bounce_buf_read(cmd->data) && > + !meson_mmc_get_next_command(cmd)) { > + meson_mmc_request_done(host->mmc, cmd->mrq); > + > + return IRQ_HANDLED; > + } > + I'm wondering if this is changing the behavior when cmd->error is non-zero. Let's take the "status & IRQ_CRC_ERR" case from meson_mmc_irq() - previously: - cmd->error is set - regmap_update_bits(host->regmap, SD_EMMC_START, START_DESC_BUSY, 0); - IRQ_WAKE_THREAD - then inside meson_mmc_irq_thread(): -- meson_mmc_wait_desc_stop(host); -- meson_mmc_request_done(host->mmc, cmd->mrq); With this patch: - cmd->error is set - regmap_update_bits(host->regmap, SD_EMMC_START, START_DESC_BUSY, 0); - IRQ_WAKE_THREAD - then inside meson_mmc_irq_thread(): -- !meson_mmc_bounce_buf_read(cmd->data) && !meson_mmc_get_next_command(cmd) can be true, which means we only call: --- meson_mmc_request_done(host->mmc, cmd->mrq); --- (note the missing meson_mmc_wait_desc_stop() call before meson_mmc_request_done()) What do you think? Maybe we just need to remove the code from meson_mmc_irq() and just omit any modifications to meson_mmc_irq_thread() (as it seems all checks that you're adding are already present in that function below the cmd->error case). Best regards, Martin
diff --git a/drivers/mmc/host/meson-gx-mmc.c b/drivers/mmc/host/meson-gx-mmc.c index b8514d9d5e736..77b2c23084566 100644 --- a/drivers/mmc/host/meson-gx-mmc.c +++ b/drivers/mmc/host/meson-gx-mmc.c @@ -991,11 +991,8 @@ static irqreturn_t meson_mmc_irq(int irq, void *dev_id) if (data && !cmd->error) data->bytes_xfered = data->blksz * data->blocks; - if (meson_mmc_bounce_buf_read(data) || - meson_mmc_get_next_command(cmd)) - ret = IRQ_WAKE_THREAD; - else - ret = IRQ_HANDLED; + + ret = IRQ_WAKE_THREAD; } out: @@ -1007,9 +1004,6 @@ static irqreturn_t meson_mmc_irq(int irq, void *dev_id) writel(start, host->regs + SD_EMMC_START); } - if (ret == IRQ_HANDLED) - meson_mmc_request_done(host->mmc, cmd->mrq); - return ret; } @@ -1040,6 +1034,13 @@ static irqreturn_t meson_mmc_irq_thread(int irq, void *dev_id) if (WARN_ON(!cmd)) return IRQ_NONE; + if (!meson_mmc_bounce_buf_read(cmd->data) && + !meson_mmc_get_next_command(cmd)) { + meson_mmc_request_done(host->mmc, cmd->mrq); + + return IRQ_HANDLED; + } + if (cmd->error) { meson_mmc_wait_desc_stop(host); meson_mmc_request_done(host->mmc, cmd->mrq);