Received: by 2002:a05:6a10:6744:0:0:0:0 with SMTP id w4csp873254pxu; Thu, 15 Oct 2020 20:09:00 -0700 (PDT) X-Google-Smtp-Source: ABdhPJx4rutmmVFb+FtP3pGcYBY3iypsUxgB2FUuJaKalEb0AAEXRgXcLsTQqyYexU8O5EXHXjhO X-Received: by 2002:a17:906:fb86:: with SMTP id lr6mr1563332ejb.510.1602817740043; Thu, 15 Oct 2020 20:09:00 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1602817740; cv=none; d=google.com; s=arc-20160816; b=JJWoGnysB8KNUwzF5V00jZz5kW3bsHQL2uVBzgNmkNpxa31uqrwEOWJuO9WYuYLmXz odqrE3VhkaXcgYxu7mMIc53u/SCbgpWgiKvdr4sbElSCrKHy9BP+9kjpc0n5nDKLfSGv fwFqxA0Ue+RstfnCnd/E9PDNBbQ38CrMGRtRHmiSVDba4tqDUxE2Lau4lJnKRAU5RwEA zwts3Oadb2YS481VyV+dz3K6LeHBiLsm6r6AeBAUu3hnve61FnQdlDZs+ls+h0waLhci aIyZqemhrPxIO6mOlLTpvwUp1YQrFB2wB/dtzdKUDZZ2mMNWZthBwhMNDYLVsY5c8m9D LqYQ== 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:dkim-signature; bh=0ILUgxdlB4XScK187m+/KuvJzas1e3+LKs/gk1YjLAY=; b=zD3eApJnAHJ5LObKyA0uX5sybCikhaF0Cp9E7s9BM3IktZnoALJLr4nzmaAFxViMuO DewRL7Of21YdDJUGG0AJ4KY/6Wbr4PayPC9N7np2Hak2q9tRjvhgz7g/G5fJlaMh+aYK xaO8NBzEKnTcHqdS31nHjPeAVyuscRqMnaAIESryLGl5H+flusTT5jusnDmIJ3LzFMCA rcrsSFOyrnGYaFXb5I5XUz6ZE43gfcV1H8K2idYjY5I/+mTFvxT0T0s6OCkrhqXZNI5q fS6LC4zQsv7waPfyxn6wdTXW8BU2u6Ahj5hvxQpiOATYb/f5120AV6EPFXJLWJGqGr+g KdtA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@oregontracks.org header.s=fm1 header.b=F7G2l9Rk; dkim=pass header.i=@messagingengine.com header.s=fm1 header.b=cMozK+5y; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id y19si788206eje.569.2020.10.15.20.08.38; Thu, 15 Oct 2020 20:09:00 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@oregontracks.org header.s=fm1 header.b=F7G2l9Rk; dkim=pass header.i=@messagingengine.com header.s=fm1 header.b=cMozK+5y; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1733141AbgJPANH (ORCPT + 99 others); Thu, 15 Oct 2020 20:13:07 -0400 Received: from wout4-smtp.messagingengine.com ([64.147.123.20]:34481 "EHLO wout4-smtp.messagingengine.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1733122AbgJPAMc (ORCPT ); Thu, 15 Oct 2020 20:12:32 -0400 Received: from compute4.internal (compute4.nyi.internal [10.202.2.44]) by mailout.west.internal (Postfix) with ESMTP id 0902B20D; Thu, 15 Oct 2020 20:12:30 -0400 (EDT) Received: from mailfrontend2 ([10.202.2.163]) by compute4.internal (MEProxy); Thu, 15 Oct 2020 20:12:31 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= oregontracks.org; h=from:to:cc:subject:date:message-id :in-reply-to:references:mime-version:content-transfer-encoding; s=fm1; bh=0ILUgxdlB4XScK187m+/KuvJzas1e3+LKs/gk1YjLAY=; b=F7G2l 9Rk5/yi4GSvaJY+3JxWInrlfc6NqlIXtNNgMFe5B5pozn19R1hqh4Jq4BJNCNLHl uX91nXmNK6rdrYd6YjExhOZdvSWEgm+HJQC8cnkSORw/Box/uAAAOs4DM3ld3GIy k7jv0pah/gvdDO88kPhQ0sEVmEzDfTxp+NocxudGhCtqwi8nlMIV1kI85LZ4z1MH 5mz5FqfBud40maxP+3DpCWV+SUDKfxWO5lGevBD/ooeH/3cBs4KKGzv3UU31xOQn X9ahwhmRhKayFY6Y7YOtx/Ow3kzJbt+mMwVW5DlDU8pa7gyoSiPtTxgn2C2epjzQ pTjuaFsDHnR6MbkIA== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:content-transfer-encoding:date:from :in-reply-to:message-id:mime-version:references:subject:to :x-me-proxy:x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s= fm1; bh=0ILUgxdlB4XScK187m+/KuvJzas1e3+LKs/gk1YjLAY=; b=cMozK+5y nzAGSrC7ZEbAsHxp+EZ9Y4zWuH+i5aj+id/2yi44wGYbqq2nHk+OFCSuRGKOodpH yVchgjwb+4qfrwwThCGRMR+rSKyA3+fJjKXPkktA+A21rh20KzYrMTX14ypA6Ily Yxl4UAFQ+e99ZuuNi66TM060e2/ZFNcWqX8fAc1mgS9gE+PNjFpk0VByo0VmynQ8 VhXHZVkzuOOAolQr1IDPYcSW3EfKMbYUjkKXfOznoDt0g0mcCj1k4RZ4hm+Vke+e lpdiTVURwM2pM58ofMCNanYSP53hrjWKF0mySf1+I16LFR66TPGcPxVSdXyG6Y4R d5vk7SqxQ6Acqw== X-ME-Sender: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedujedrieeggdeffecutefuodetggdotefrodftvf curfhrohhfihhlvgemucfhrghsthforghilhdpqfgfvfdpuffrtefokffrpgfnqfghnecu uegrihhlohhuthemuceftddtnecunecujfgurhephffvufffkffojghfggfgsedtkeertd ertddtnecuhfhrohhmpefuvggrnhcuggcumfgvlhhlvgihuceoshgvrghnvhhkrdguvghv sehorhgvghhonhhtrhgrtghkshdrohhrgheqnecuggftrfgrthhtvghrnhepkefggeektd dttdeuffffjeeihfetfffghfdugefhvdeuheeuudelheegleevheefnecuffhomhgrihhn pehkvghrnhgvlhdrohhrghenucfkphepvdegrddvtddrudegkedrgeelnecuvehluhhsth gvrhfuihiivgepieenucfrrghrrghmpehmrghilhhfrhhomhepshgvrghnvhhkrdguvghv sehorhgvghhonhhtrhgrtghkshdrohhrgh X-ME-Proxy: Received: from arch-ashland-svkelley.hsd1.or.comcast.net (c-24-20-148-49.hsd1.or.comcast.net [24.20.148.49]) by mail.messagingengine.com (Postfix) with ESMTPA id 54DD5306467E; Thu, 15 Oct 2020 20:12:29 -0400 (EDT) From: Sean V Kelley To: bhelgaas@google.com, Jonathan.Cameron@huawei.com, rafael.j.wysocki@intel.com, ashok.raj@intel.com, tony.luck@intel.com, sathyanarayanan.kuppuswamy@intel.com, qiuxu.zhuo@intel.com Cc: linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org, Sean V Kelley Subject: [PATCH v9 10/15] PCI/ERR: Limit AER resets in pcie_do_recovery() Date: Thu, 15 Oct 2020 17:11:08 -0700 Message-Id: <20201016001113.2301761-11-seanvk.dev@oregontracks.org> X-Mailer: git-send-email 2.28.0 In-Reply-To: <20201016001113.2301761-1-seanvk.dev@oregontracks.org> References: <20201016001113.2301761-1-seanvk.dev@oregontracks.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Sean V Kelley In some cases a bridge may not exist as the hardware controlling may be handled only by firmware and so is not visible to the OS. This scenario is also possible in future use cases involving non-native use of RCECs by firmware. Explicitly apply conditional logic around these resets by limiting them to Root Ports and Downstream Ports. Link: https://lore.kernel.org/r/20201002184735.1229220-8-seanvk.dev@oregontracks.org Signed-off-by: Sean V Kelley Signed-off-by: Bjorn Helgaas Acked-by: Jonathan Cameron --- drivers/pci/pcie/err.c | 31 +++++++++++++++++++++++++------ 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/drivers/pci/pcie/err.c b/drivers/pci/pcie/err.c index 8b53aecdb43d..7883c9791562 100644 --- a/drivers/pci/pcie/err.c +++ b/drivers/pci/pcie/err.c @@ -148,13 +148,17 @@ static int report_resume(struct pci_dev *dev, void *data) /** * pci_walk_bridge - walk bridges potentially AER affected - * @bridge: bridge which may be a Port + * @bridge: bridge which may be a Port, an RCEC with associated RCiEPs, + * or an RCiEP associated with an RCEC * @cb: callback to be called for each device found * @userdata: arbitrary pointer to be passed to callback * * If the device provided is a bridge, walk the subordinate bus, including * any bridged devices on buses under this bus. Call the provided callback * on each device found. + * + * If the device provided has no subordinate bus, call the callback on the + * device itself. */ static void pci_walk_bridge(struct pci_dev *bridge, int (*cb)(struct pci_dev *, void *), @@ -162,6 +166,8 @@ static void pci_walk_bridge(struct pci_dev *bridge, { if (bridge->subordinate) pci_walk_bus(bridge->subordinate, cb, userdata); + else + cb(bridge, userdata); } pci_ers_result_t pcie_do_recovery(struct pci_dev *dev, @@ -174,10 +180,13 @@ pci_ers_result_t pcie_do_recovery(struct pci_dev *dev, /* * Error recovery runs on all subordinates of the bridge. If the - * bridge detected the error, it is cleared at the end. + * bridge detected the error, it is cleared at the end. For RCiEPs + * we should reset just the RCiEP itself. */ if (type == PCI_EXP_TYPE_ROOT_PORT || - type == PCI_EXP_TYPE_DOWNSTREAM) + type == PCI_EXP_TYPE_DOWNSTREAM || + type == PCI_EXP_TYPE_RC_EC || + type == PCI_EXP_TYPE_RC_END) bridge = dev; else bridge = pci_upstream_bridge(dev); @@ -185,6 +194,12 @@ pci_ers_result_t pcie_do_recovery(struct pci_dev *dev, pci_dbg(bridge, "broadcast error_detected message\n"); if (state == pci_channel_io_frozen) { pci_walk_bridge(bridge, report_frozen_detected, &status); + if (type == PCI_EXP_TYPE_RC_END) { + pci_warn(dev, "subordinate device reset not possible for RCiEP\n"); + status = PCI_ERS_RESULT_NONE; + goto failed; + } + status = reset_subordinates(bridge); if (status != PCI_ERS_RESULT_RECOVERED) { pci_warn(bridge, "subordinate device reset failed\n"); @@ -217,9 +232,13 @@ pci_ers_result_t pcie_do_recovery(struct pci_dev *dev, pci_dbg(bridge, "broadcast resume message\n"); pci_walk_bridge(bridge, report_resume, &status); - if (pcie_aer_is_native(bridge)) - pcie_clear_device_status(bridge); - pci_aer_clear_nonfatal_status(bridge); + if (type == PCI_EXP_TYPE_ROOT_PORT || + type == PCI_EXP_TYPE_DOWNSTREAM || + type == PCI_EXP_TYPE_RC_EC) { + if (pcie_aer_is_native(bridge)) + pcie_clear_device_status(bridge); + pci_aer_clear_nonfatal_status(bridge); + } pci_info(bridge, "device recovery successful\n"); return status; -- 2.28.0