Received: by 2002:a05:7412:2a8c:b0:e2:908c:2ebd with SMTP id u12csp656709rdh; Sun, 24 Sep 2023 06:24:32 -0700 (PDT) X-Google-Smtp-Source: AGHT+IFeWFX/77ztGbRvHuI54OkcN4Qwk8T3lFrN62epFCRunZMjTh1uFUT6h02WoQqets6ny2Za X-Received: by 2002:a05:6870:f28b:b0:1da:ed0f:9c84 with SMTP id u11-20020a056870f28b00b001daed0f9c84mr6462389oap.52.1695561872513; Sun, 24 Sep 2023 06:24:32 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1695561872; cv=none; d=google.com; s=arc-20160816; b=OByUfHyYZO6FMDFjnKLmYioFJ1c9BaN/HqhJyDSnFIpC3C4DkbxID6cmZIKqgMqpfY wPepDuie9oCdjGVSDqGnwehWcAIgs8MRMajWoGjiaWOOK5ImdtFpNm0FkAdHoRhs8RmW T2SBkXRIjHK2CwkuRW1FlqJDLjOreTASRD3P2eb2RFIPP/6FjahmVq5uGNP/ytB374jE NalgEtVEdMkqkZ5rNyfvve9Bp3oBIDVEHQC/NqmktoFJg6xpfo9QIF3nZc7ayU9Y1wqD k4FeggijEAcBPHL8b8OuLnCz/kVZ13YvsKZKlH7UK/IKnJAOmc3i3nDA5y+ygMmT/nCi E0Nw== 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 :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=cPTY1dnlvnx0GbBcWLsDwY3i/XNNbSI9O3KvSRCUJD0=; fh=8PINgxtkCRql8ZJyw+z0ixAA0uSknsG2qCmTS2S4rZQ=; b=vndV5EvcI5/ROUTCXHej2p1eYHZyqSTMoRwUjr1ZeUBIsQvtkBtpW3mxSszNcqdxBp 7f2lcD38BW8jw8W7+R1dp/vDKy6nV3tK6e9X951UejM3odf6X1w+l89aiwgEd0i6gFwH tEJfgOaHYZXlNceWIjf/fSkfFN9tK0kXAsxomvJ2jaeIyFSsNzElUCakjIdRVltfFKe9 iaQas/CPG5e79eQqJzeyWQQGyVdg27TFKJzLtZQCRymzVMCcvwqkL99lkifnfV+ndi5m n5x0TiP452sgrs7KsZggCNHfrXKfwx9w317z+2AaOkCdeJ7k7kNDscjhs+etNe0Yb3QQ eN9w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=aIgqZcK6; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:7 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from snail.vger.email (snail.vger.email. [2620:137:e000::3:7]) by mx.google.com with ESMTPS id m1-20020a656a01000000b00578b4082453si8362235pgu.712.2023.09.24.06.24.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 24 Sep 2023 06:24:32 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:7 as permitted sender) client-ip=2620:137:e000::3:7; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=aIgqZcK6; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:7 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by snail.vger.email (Postfix) with ESMTP id 4DAA4802B072; Sun, 24 Sep 2023 06:24:31 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.10 at snail.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230202AbjIXNYb (ORCPT + 99 others); Sun, 24 Sep 2023 09:24:31 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34666 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230329AbjIXNYO (ORCPT ); Sun, 24 Sep 2023 09:24:14 -0400 Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 575902D6D; Sun, 24 Sep 2023 06:21:03 -0700 (PDT) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 6D8E6C433A9; Sun, 24 Sep 2023 13:21:02 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1695561663; bh=cDE7TbH1GrrPT/4iJ6Ad/TF93ivVpfNin5uci7xWTV8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=aIgqZcK6p20rmHdF5+i4f8Dm0mXaLGoj/40EGk9vmWmw0D0bapdv4C7XvHJcns1zf Igfdbf4kYZETiIJ/HSU3nMSiOnYkrFLzkmgal08Q0Y/h6MJpY3OsupfWEYqLQeBNKc oSbdHyU6UF1bKujKGjoD0UbRrmX9lwlaMrc15TKc4EvKZMwPW1S60bMvoDMoDmBGAk 36St8kC4iGy2z/Fjf0r62zUuzZq5t/PWJoCIv1XRf1gww4R9dt+2WsUT85oUymOnzj 3OFybviwmKVBr9axKs57QT3UkyBEYem+2bFo27REooQoOhK33FnEzk53N5gYr/emy+ BDvBGgi0jDL5g== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Niklas Cassel , Damien Le Moal , Sasha Levin , linux-ide@vger.kernel.org Subject: [PATCH AUTOSEL 4.14 6/6] ata: libata-eh: do not clear ATA_PFLAG_EH_PENDING in ata_eh_reset() Date: Sun, 24 Sep 2023 09:20:49 -0400 Message-Id: <20230924132050.1277021-6-sashal@kernel.org> X-Mailer: git-send-email 2.40.1 In-Reply-To: <20230924132050.1277021-1-sashal@kernel.org> References: <20230924132050.1277021-1-sashal@kernel.org> MIME-Version: 1.0 X-stable: review X-Patchwork-Hint: Ignore X-stable-base: Linux 4.14.326 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF, RCVD_IN_DNSWL_BLOCKED,SPF_HELO_NONE,SPF_PASS 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 X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (snail.vger.email [0.0.0.0]); Sun, 24 Sep 2023 06:24:31 -0700 (PDT) From: Niklas Cassel [ Upstream commit 80cc944eca4f0baa9c381d0706f3160e491437f2 ] ata_scsi_port_error_handler() starts off by clearing ATA_PFLAG_EH_PENDING, before calling ap->ops->error_handler() (without holding the ap->lock). If an error IRQ is received while ap->ops->error_handler() is running, the irq handler will set ATA_PFLAG_EH_PENDING. Once ap->ops->error_handler() returns, ata_scsi_port_error_handler() checks if ATA_PFLAG_EH_PENDING is set, and if it is, another iteration of ATA EH is performed. The problem is that ATA_PFLAG_EH_PENDING is not only cleared by ata_scsi_port_error_handler(), it is also cleared by ata_eh_reset(). ata_eh_reset() is called by ap->ops->error_handler(). This additional clearing done by ata_eh_reset() breaks the whole retry logic in ata_scsi_port_error_handler(). Thus, if an error IRQ is received while ap->ops->error_handler() is running, the port will currently remain frozen and will never get re-enabled. The additional clearing in ata_eh_reset() was introduced in commit 1e641060c4b5 ("libata: clear eh_info on reset completion"). Looking at the original error report: https://marc.info/?l=linux-ide&m=124765325828495&w=2 We can see the following happening: [ 1.074659] ata3: XXX port freeze [ 1.074700] ata3: XXX hardresetting link, stopping engine [ 1.074746] ata3: XXX flipping SControl [ 1.411471] ata3: XXX irq_stat=400040 CONN|PHY [ 1.411475] ata3: XXX port freeze [ 1.420049] ata3: XXX starting engine [ 1.420096] ata3: XXX rc=0, class=1 [ 1.420142] ata3: XXX clearing IRQs for thawing [ 1.420188] ata3: XXX port thawed [ 1.420234] ata3: SATA link up 3.0 Gbps (SStatus 123 SControl 300) We are not supposed to be able to receive an error IRQ while the port is frozen (PxIE is set to 0, i.e. all IRQs for the port are disabled). AHCI 1.3.1 section 10.7.1.1 First Tier (IS Register) states: "Each bit location can be thought of as reporting a '1' if the virtual "interrupt line" for that port is indicating it wishes to generate an interrupt. That is, if a port has one or more interrupt status bit set, and the enables for those status bits are set, then this bit shall be set." Additionally, AHCI state P:ComInit clearly shows that the state machine will only jump to P:ComInitSetIS (which sets IS.IPS(x) to '1'), if PxIE.PCE is set to '1'. In our case, PxIE is set to 0, so IS.IPS(x) won't get set. So IS.IPS(x) only gets set if PxIS and PxIE is set. AHCI 1.3.1 section 10.7.1.1 First Tier (IS Register) also states: "The bits in this register are read/write clear. It is set by the level of the virtual interrupt line being a set, and cleared by a write of '1' from the software." So if IS.IPS(x) is set, you need to explicitly clear it by writing a 1 to IS.IPS(x) for that port. Since PxIE is cleared, the only way to get an interrupt while the port is frozen, is if IS.IPS(x) is set, and the only way IS.IPS(x) can be set when the port is frozen, is if it was set before the port was frozen. However, since commit 737dd811a3db ("ata: libahci: clear pending interrupt status"), we clear both PxIS and IS.IPS(x) after freezing the port, but before the COMRESET, so the problem that commit 1e641060c4b5 ("libata: clear eh_info on reset completion") fixed can no longer happen. Thus, revert commit 1e641060c4b5 ("libata: clear eh_info on reset completion"), so that the retry logic in ata_scsi_port_error_handler() works once again. (The retry logic is still needed, since we can still get an error IRQ _after_ the port has been thawed, but before ata_scsi_port_error_handler() takes the ap->lock in order to check if ATA_PFLAG_EH_PENDING is set.) Signed-off-by: Niklas Cassel Signed-off-by: Damien Le Moal Signed-off-by: Sasha Levin --- drivers/ata/libata-eh.c | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c index cbe9af624a06f..8a789de056807 100644 --- a/drivers/ata/libata-eh.c +++ b/drivers/ata/libata-eh.c @@ -2948,18 +2948,11 @@ int ata_eh_reset(struct ata_link *link, int classify, postreset(slave, classes); } - /* - * Some controllers can't be frozen very well and may set spurious - * error conditions during reset. Clear accumulated error - * information and re-thaw the port if frozen. As reset is the - * final recovery action and we cross check link onlineness against - * device classification later, no hotplug event is lost by this. - */ + /* clear cached SError */ spin_lock_irqsave(link->ap->lock, flags); - memset(&link->eh_info, 0, sizeof(link->eh_info)); + link->eh_info.serror = 0; if (slave) - memset(&slave->eh_info, 0, sizeof(link->eh_info)); - ap->pflags &= ~ATA_PFLAG_EH_PENDING; + slave->eh_info.serror = 0; spin_unlock_irqrestore(link->ap->lock, flags); if (ap->pflags & ATA_PFLAG_FROZEN) -- 2.40.1