Received: by 2002:ac0:a5b6:0:0:0:0:0 with SMTP id m51-v6csp3767891imm; Mon, 4 Jun 2018 08:57:24 -0700 (PDT) X-Google-Smtp-Source: ADUXVKKW8B84ucYbj9Fiy8AGs0nUAUrx97UsfHXcGbLUpgu7JkwM9GDnw2b2PiyazZ7eZEdOC2UE X-Received: by 2002:a17:902:189:: with SMTP id b9-v6mr22610117plb.204.1528127844371; Mon, 04 Jun 2018 08:57:24 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1528127844; cv=none; d=google.com; s=arc-20160816; b=fzuhbbJN3mQOdkQEVOIZrWF7Qr0n8mdxAiAVOtMFUUdxevZUuhN/b3m+zC84IeVEd7 S9IsNjMhpo1v75UovNE+vEfyUhru8b8oGyOQYVfucytkMeyGtR2WaMXg9clhueQfqdPr iDjLL9DSlkmA5eVEJ9uTkKIM5X/isb0udiiPdQtl5pbENTd/G68oS/JYGGw6sO7+dMyL Hh50a5RLMBnLu5PwjVBul32WX1qUQkBFvFjJI24dQIXR5BhlbhxIMwR95ABrBz7BqoPD gfa36AuTTSXvn+VWUsloyZtPK6/K0KBJw2xnFK8Kgk6qKuhsAavPAJvVbBfFa+Yy0l48 CBOg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:date:subject:cc:to:from :dkim-signature:arc-authentication-results; bh=g9HeAxMVD2uQc2pxHBTrHkPYrMDEGdejU+hvT5c5IVA=; b=NpsFhRQwG55zAn9no4bBtbRSjTccPah8s1eM6EAQm0QL/h5CrVHvyv8UA7ph/luXly 30YXklC4oSfQXX4LtDnI/LIIN2mQkJ4ITuCapIsmsTdJJS7j1H7sjbZ/HBllbwr8MRsU iB2WqFwNhfDNOoip3NKbWgAPh6Qs0GU/l/cJ2v42s5mW6VgOkjMRUC+rSvctW1BO1DVH ABEUVkf5yI9MrO/FHIScfaMOscXiWurbf7FcaO8wGi7GV1s7Me+Pth2nkP321Qa5NLWC Hy6WcpKmidOmAZ4/VQuDqXimpWDNRpeRObgZBSWTh1qfUOWPvlg+Ul4Uj/yJ5OHDAFri N90w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=abVk2I3L; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id f3-v6si48324834plf.436.2018.06.04.08.57.10; Mon, 04 Jun 2018 08:57:24 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=abVk2I3L; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751441AbeFDPzc (ORCPT + 99 others); Mon, 4 Jun 2018 11:55:32 -0400 Received: from mail-oi0-f66.google.com ([209.85.218.66]:39899 "EHLO mail-oi0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751362AbeFDPzb (ORCPT ); Mon, 4 Jun 2018 11:55:31 -0400 Received: by mail-oi0-f66.google.com with SMTP id t22-v6so25436746oih.6; Mon, 04 Jun 2018 08:55:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=g9HeAxMVD2uQc2pxHBTrHkPYrMDEGdejU+hvT5c5IVA=; b=abVk2I3L30wS5HtOfNNj2ooloxbzlrAvJJPiZAdc978bFazAN93KDFBoQG7IhnFDuc yLAGChMJwBlzk8RaCfe5X47ll/wkrbk1MVzvt+fiI2b1X65gwDdHBpy7xkWWIFSgI/hY 2nnXa4je7I2HJAaRj6AIZ8aFCsshwi12PGQzlsaYPpCJoltF+32KQ4+VZDdiTI5Gtjuw 2rK6Ief4ze/WWnrSahVU25acdkXs8TFpMbid5vemlk6svyIZrdDbg/m+wRS9VAUiNPTa 4J8GGsZGr+RYLvWJov8EMz/7MLL5evCgbfxiOimWuuf46fNa3vNbKZo/YDbCI/CEFMlO EVxw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=g9HeAxMVD2uQc2pxHBTrHkPYrMDEGdejU+hvT5c5IVA=; b=Urxyyhw9rQpXpXFxegPISWaSp1c77G8U1RUvutnWU7VW6967wVMTKumyaRDUPmxIzq 91ex7c2EQKEGFGgaiEY5Vm8HjY4lPE9Mxc/7UDRZDW1/gXiUWBuqXK/UX/O3NqLBRS0d n3cTcV03Ck5PH2liz2kTQOEGrq9NPhJXCpIddjJ/J4AX2jDDWIY9LDUdYr6obDn2Px1M wxby/GbWdoEyX+674CgvKW5RDjT/zEsFCEOVFE1lrSw+T61IX0ipq4fTugWbv+WV6Z/R rmI3sF0YP5z7BkSCIc8a57SVBum36TE4Z5KS1z6HEPdgo+z6aJzeqE9fResdUOY8H8oi NPFQ== X-Gm-Message-State: APt69E1Wd83Rz15CnEsfrE7exiMUZuQtImYgfjMiuC80rmIQu8F8Rbz4 fMHWRPTpnotGu+QPPldI8OpiRFQYhK1NdA== X-Received: by 2002:aca:e70c:: with SMTP id e12-v6mr12985093oih.312.1528127730690; Mon, 04 Jun 2018 08:55:30 -0700 (PDT) Received: from austins740xd.raid.adc.delllabs.net ([143.166.81.254]) by smtp.gmail.com with ESMTPSA id s144-v6sm5620946oie.17.2018.06.04.08.55.29 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Mon, 04 Jun 2018 08:55:30 -0700 (PDT) From: Alexandru Gagniuc To: bhelgaas@google.com Cc: alex_gagniuc@dellteam.com, austin_bolen@dell.com, shyam_iyer@dell.com, keith.busch@intel.com, Alexandru Gagniuc , linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v3] PCI: Check for PCIe downtraining conditions Date: Mon, 4 Jun 2018 10:55:21 -0500 Message-Id: <20180604155523.14906-1-mr.nuke.me@gmail.com> X-Mailer: git-send-email 2.14.4 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org PCIe downtraining happens when both the device and PCIe port are capable of a larger bus width or higher speed than negotiated. Downtraining might be indicative of other problems in the system, and identifying this from userspace is neither intuitive, nor straigh forward. The easiest way to detect this is with pcie_print_link_status(), since the bottleneck is usually the link that is downtrained. It's not a perfect solution, but it works extremely well in most cases. Signed-off-by: Alexandru Gagniuc --- Changes since v2: - Check dev->is_virtfn flag Changes since v1: - Use pcie_print_link_status() instead of reimplementing logic drivers/pci/probe.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c index ac91b6fd0bcd..a88ec8c25dd5 100644 --- a/drivers/pci/probe.c +++ b/drivers/pci/probe.c @@ -2146,6 +2146,25 @@ static struct pci_dev *pci_scan_device(struct pci_bus *bus, int devfn) return dev; } +static void pcie_check_upstream_link(struct pci_dev *dev) +{ + + if (!pci_is_pcie(dev)) + return; + + /* Look from the device up to avoid downstream ports with no devices. */ + if ((pci_pcie_type(dev) != PCI_EXP_TYPE_ENDPOINT) && + (pci_pcie_type(dev) != PCI_EXP_TYPE_LEG_END) && + (pci_pcie_type(dev) != PCI_EXP_TYPE_UPSTREAM)) + return; + + /* Multi-function PCIe share the same link/status. */ + if ((PCI_FUNC(dev->devfn) != 0) || dev->is_virtfn) + return; + + pcie_print_link_status(dev); +} + static void pci_init_capabilities(struct pci_dev *dev) { /* Enhanced Allocation */ @@ -2181,6 +2200,9 @@ static void pci_init_capabilities(struct pci_dev *dev) /* Advanced Error Reporting */ pci_aer_init(dev); + /* Check link and detect downtrain errors */ + pcie_check_upstream_link(dev); + if (pci_probe_reset_function(dev) == 0) dev->reset_fn = 1; } -- 2.14.4