Received: by 2002:a05:6358:d09b:b0:dc:cd0c:909e with SMTP id jc27csp5267677rwb; Sun, 4 Dec 2022 18:04:55 -0800 (PST) X-Google-Smtp-Source: AA0mqf5CFHTOCoLqpuGL8Szm/jmA0zOxMPBjwAdjBQGu2MlvKznHvAp7g6hx9OJolERGseXPUd9l X-Received: by 2002:a17:903:228c:b0:186:8d12:f51f with SMTP id b12-20020a170903228c00b001868d12f51fmr64541689plh.129.1670205895039; Sun, 04 Dec 2022 18:04:55 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1670205895; cv=none; d=google.com; s=arc-20160816; b=g8nw7GNJn2ElfDJquyjEcv14QfvlK60I1POhoT+yD9gF72SOXyKP04u2tKTm+Irwnm 8oKxVJ8mFN8DPCD2avgWq+39Mahku87O0p05hpfpGmXFo2LHxQri/7+Ukql71oAvr+ec DveMbz2CbVTOno7C7KFRqCo3iyWIC1pCeiz21+zLdBu0uhayeblgGVvfxvtVCS/uGst4 3bwYx8o2wJLLhP8nxGQXraGvv0MYV1ckAIfo79vost6uylH2ts+0UEYajFukhPU08lQa aW6snoCVIOyej3CXE1g3WhGsZG1qetD15uUgUQEKqwDVFbL7Oho3YyMnkHhnNAyanzDE maRw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:mime-version:message-id:date:subject:cc:to:from :dkim-signature; bh=g9BsRHMoVPm+BDBuWg0FYyhlA3PQRobIouKG13VEGoA=; b=APEEVWhg/Hxf4Pg0a37wWfxouTjYrNFlfKDywcJTyaZ8urE7fik5yNt44mwOcn0llY LhUs8NLb6y2ddlzYrIpzhPTFFtyJJlkS1Tt/SrozH+OmNE1LYNf1LgJVZF6/Lvxq5stf v+iCeQPguzAHTL6VP+HcqF11sumLRjgGaHkh0qIoYmGnX4deA4fRlvl+fDru+RZgWKUa AUp3DnIFZm7nv8TWA8tMtPwIz4bnVQ4nAHzBQRM1xtxOWut90+Vf5G2od7pg1uErZS9g /ruPRIsDgMjOugqQPJeRtEJt1cGxfVFKlNp80Hyt/F1cW5Qir8jYab5f3DujaE2gp6g3 lxHw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@mediatek.com header.s=dk header.b=DMZ3WnpT; 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=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=mediatek.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id p23-20020a634f57000000b0047839aeb6e4si11960927pgl.363.2022.12.04.18.04.44; Sun, 04 Dec 2022 18:04:55 -0800 (PST) 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=pass header.i=@mediatek.com header.s=dk header.b=DMZ3WnpT; 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=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=mediatek.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231266AbiLEBxB (ORCPT + 82 others); Sun, 4 Dec 2022 20:53:01 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42852 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230161AbiLEBxA (ORCPT ); Sun, 4 Dec 2022 20:53:00 -0500 Received: from mailgw01.mediatek.com (unknown [60.244.123.138]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 581DC767C; Sun, 4 Dec 2022 17:52:49 -0800 (PST) X-UUID: aa2886e5d5254e58b70ea0296d1fbece-20221205 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=mediatek.com; s=dk; h=Content-Type:MIME-Version:Message-ID:Date:Subject:CC:To:From; bh=g9BsRHMoVPm+BDBuWg0FYyhlA3PQRobIouKG13VEGoA=; b=DMZ3WnpTUv1rQqtHCswAtQPL8L+UvNwrjYzAEWtkV2KqgDbHQb0CxvoJBgzbAIz5D803xklFTAD1oFvRPWJe4jC5RncV2ip7QzCneZ5Pgux09odcQN++mo7mczCZOLkH7CFUKzwYx/Uy48yniWuwCDaJXmHxT3yJXJF1c68aqJc=; X-CID-P-RULE: Release_Ham X-CID-O-INFO: VERSION:1.1.14,REQID:a6fb3763-ad12-4f96-97d2-c155db137212,IP:0,U RL:0,TC:0,Content:0,EDM:0,RT:0,SF:95,FILE:0,BULK:0,RULE:Release_Ham,ACTION :release,TS:95 X-CID-INFO: VERSION:1.1.14,REQID:a6fb3763-ad12-4f96-97d2-c155db137212,IP:0,URL :0,TC:0,Content:0,EDM:0,RT:0,SF:95,FILE:0,BULK:0,RULE:Spam_GS981B3D,ACTION :quarantine,TS:95 X-CID-META: VersionHash:dcaaed0,CLOUDID:7e381f1f-5e1d-4ab5-ab8e-3e04efc02b30,B ulkID:221205095245Y940Y0T2,BulkQuantity:0,Recheck:0,SF:38|28|17|19|48,TC:n il,Content:0,EDM:-3,IP:nil,URL:0,File:nil,Bulk:nil,QS:nil,BEC:nil,COL:0 X-UUID: aa2886e5d5254e58b70ea0296d1fbece-20221205 Received: from mtkcas10.mediatek.inc [(172.21.101.39)] by mailgw01.mediatek.com (envelope-from ) (Generic MTA with TLSv1.2 ECDHE-RSA-AES256-SHA384 256/256) with ESMTP id 191979232; Mon, 05 Dec 2022 09:52:42 +0800 Received: from mtkmbs11n1.mediatek.inc (172.21.101.185) by mtkmbs10n2.mediatek.inc (172.21.101.183) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.792.3; Mon, 5 Dec 2022 09:52:41 +0800 Received: from mbjsdccf07.mediatek.inc (10.15.20.246) by mtkmbs11n1.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.2.792.15 via Frontend Transport; Mon, 5 Dec 2022 09:52:40 +0800 From: Mason Zhang To: Alim Akhtar , Avri Altman , Bart Van Assche , "James E . J . Bottomley" , "Martin K . Petersen" , Matthias Brugger , Bean Huo , Stanley Chu , Jinyoung Choi CC: , , , , Peter Wang , Peng Zhou , , Mason Zhang Subject: [PATCH v2 1/1] scsi: ufs: core: fix device management cmd timeout flow Date: Mon, 5 Dec 2022 09:42:03 +0800 Message-ID: <20221205014202.2672-1-mason.zhang@mediatek.com> X-Mailer: git-send-email 2.18.0 MIME-Version: 1.0 Content-Type: text/plain X-MTK: N X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_MSPIKE_H2,SPF_HELO_PASS, T_SPF_TEMPERROR,UNPARSEABLE_RELAY autolearn=ham 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: X-Mailing-List: linux-kernel@vger.kernel.org From: Mason Zhang In ufs error handler flow, host will send device management cmd(NOP OUT) to device for recovery link. If cmd response timeout, and clear doorbell fail, ufshcd_wait_for_dev_cmd will do nothing and return, hba->dev_cmd.complete struct not set to null. In this time, if cmd has been responsed by device, then it will call complete() in __ufshcd_transfer_req_compl, because of complete struct is alloced in stack, then the KE will occur. Fix the following crash: ipanic_die+0x24/0x38 [mrdump] die+0x344/0x748 arm64_notify_die+0x44/0x104 do_debug_exception+0x104/0x1e0 el1_dbg+0x38/0x54 el1_sync_handler+0x40/0x88 el1_sync+0x8c/0x140 queued_spin_lock_slowpath+0x2e4/0x3c0 __ufshcd_transfer_req_compl+0x3b0/0x1164 ufshcd_trc_handler+0x15c/0x308 ufshcd_host_reset_and_restore+0x54/0x260 ufshcd_reset_and_restore+0x28c/0x57c ufshcd_err_handler+0xeb8/0x1b6c process_one_work+0x288/0x964 worker_thread+0x4bc/0xc7c kthread+0x15c/0x264 ret_from_fork+0x10/0x30 Signed-off-by: Mason Zhang --- drivers/ufs/core/ufshcd.c | 46 ++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 25 deletions(-) diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c index b1f59a5fe632..2b4934a562a6 100644 --- a/drivers/ufs/core/ufshcd.c +++ b/drivers/ufs/core/ufshcd.c @@ -2979,35 +2979,31 @@ static int ufshcd_wait_for_dev_cmd(struct ufs_hba *hba, err = -ETIMEDOUT; dev_dbg(hba->dev, "%s: dev_cmd request timedout, tag %d\n", __func__, lrbp->task_tag); - if (ufshcd_clear_cmds(hba, 1U << lrbp->task_tag) == 0) { + if (ufshcd_clear_cmds(hba, 1U << lrbp->task_tag) == 0) /* successfully cleared the command, retry if needed */ err = -EAGAIN; + /* + * Since clearing the command succeeded we also need to + * clear the task tag bit from the outstanding_reqs + * variable. + */ + spin_lock_irqsave(&hba->outstanding_lock, flags); + pending = test_bit(lrbp->task_tag, + &hba->outstanding_reqs); + if (pending) { + hba->dev_cmd.complete = NULL; + __clear_bit(lrbp->task_tag, + &hba->outstanding_reqs); + } + spin_unlock_irqrestore(&hba->outstanding_lock, flags); + + if (!pending) { /* - * Since clearing the command succeeded we also need to - * clear the task tag bit from the outstanding_reqs - * variable. + * The completion handler ran while we tried to + * clear the command. */ - spin_lock_irqsave(&hba->outstanding_lock, flags); - pending = test_bit(lrbp->task_tag, - &hba->outstanding_reqs); - if (pending) { - hba->dev_cmd.complete = NULL; - __clear_bit(lrbp->task_tag, - &hba->outstanding_reqs); - } - spin_unlock_irqrestore(&hba->outstanding_lock, flags); - - if (!pending) { - /* - * The completion handler ran while we tried to - * clear the command. - */ - time_left = 1; - goto retry; - } - } else { - dev_err(hba->dev, "%s: failed to clear tag %d\n", - __func__, lrbp->task_tag); + time_left = 1; + goto retry; } } -- 2.18.0