Received: by 10.213.65.68 with SMTP id h4csp4389432imn; Tue, 10 Apr 2018 14:11:17 -0700 (PDT) X-Google-Smtp-Source: AIpwx49G0lN0UP2iWXasvT0fgTrXh7x+TZD8ZpTKT54m8wwZEsKBeu4sOsSbIeLiD6ZxhpTrFx5n X-Received: by 2002:a17:902:3124:: with SMTP id w33-v6mr2062842plb.335.1523394676979; Tue, 10 Apr 2018 14:11:16 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1523394676; cv=none; d=google.com; s=arc-20160816; b=gdr+gF/CHQMldlGfUZli92c42SQ1zQvd00JRT8F4cJtdhcqtgLCEvfuJRvXjcWoYO3 GWgT8pzYDkC3hMuo9Dqp5Jqw7ns3CapXyqtJJq8pomDAJYPlfYFlHh88Pbba1rzKszQe mLtSXs5j3VhPKWIk0BE92NwpcZJ6/qWPSsOvoGo/cn5pBvQxkQdRXGqxZmqwHk71m7jb Uoi7qD09Y3FXeIHv6ufhwMoNNDxG62fzkJfxw2rRs4KbtaowbQIFNGEDs5mEIUz5KaOR pzoNexyWtXY5aCQQAnNydzNJdsyQuRjJ07g0X2ARTJa1omlBXLhfmchQRVR9X+m/gpEt d84Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:user-agent:in-reply-to :content-disposition:mime-version:references:message-id:subject:cc :to:from:date:dmarc-filter:arc-authentication-results; bh=K4Cjfnf9qKt5xm1XigkSJSzXBOJdJhOtp1Eudzo6ucc=; b=SOfSiB0L1HKnA86Ep/bHkM3RUexWqka8y2bvv/7cTnsVfhBC6pQG9KQcpyBnBW4Ova 0RmxnCsRGh+afQ4s3zznI+9jZhVdYN7wTtWsWCrhCGwu9NTwnfgwz9/fxpmm+T7hVHXI OO1Q8SzFHPz3onQodLxRc+i+CLK+EdFaW7upB6v9PrpFxnfQhXJMifIOxXkWy0vF3FCV nWNPf2eosJCoG2q87NaeU0Gv9E7kQTj50DUDTm36r83V+dOJ2BMtCMn8fIekpQv0wV9h EjN+mpmbSAxAxGPSoYU6xIBFEoD9dvdK1ewBJNwWCueg+tdCN0XooiPFYZf3UaYtrB3h 8yIw== ARC-Authentication-Results: i=1; mx.google.com; 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id u4si2699609pfb.42.2018.04.10.14.10.38; Tue, 10 Apr 2018 14:11:16 -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; 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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752078AbeDJVDw (ORCPT + 99 others); Tue, 10 Apr 2018 17:03:52 -0400 Received: from mail.kernel.org ([198.145.29.99]:54160 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751546AbeDJVDv (ORCPT ); Tue, 10 Apr 2018 17:03:51 -0400 Received: from localhost (unknown [64.22.249.253]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id ADF2F21785; Tue, 10 Apr 2018 21:03:50 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org ADF2F21785 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=kernel.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=helgaas@kernel.org Date: Tue, 10 Apr 2018 16:03:49 -0500 From: Bjorn Helgaas To: Oza Pawandeep Cc: Bjorn Helgaas , Philippe Ombredanne , Thomas Gleixner , Greg Kroah-Hartman , Kate Stewart , linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org, Dongdong Liu , Keith Busch , Wei Zhang , Sinan Kaya , Timur Tabi Subject: Re: [PATCH v13 6/6] PCI/DPC: Do not do recovery for hotplug enabled system Message-ID: <20180410210349.GG54986@bhelgaas-glaptop.roam.corp.google.com> References: <1523284914-2037-1-git-send-email-poza@codeaurora.org> <1523284914-2037-7-git-send-email-poza@codeaurora.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1523284914-2037-7-git-send-email-poza@codeaurora.org> User-Agent: Mutt/1.9.2 (2017-12-15) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Mon, Apr 09, 2018 at 10:41:54AM -0400, Oza Pawandeep wrote: > DPC and AER should attempt recovery in the same way, except the > cases where system is with hotplug enabled. What's the connection with hotplug? I see from the patch that for hotplug bridges you remove the tree below the bridge, and otherwise you just reset the secondary link (I think). The changelog should explain why we need the difference. I'm a little skeptical to begin with, because I'm not sure why we should handle a DPC event differently just because a bridge has the *capability* of hotplug. Even if a hotplug bridge reports a DPC event, that doesn't necessarily mean a hotplug has occurred. > Signed-off-by: Oza Pawandeep > > diff --git a/drivers/pci/pcie/pcie-dpc.c b/drivers/pci/pcie/pcie-dpc.c > index 8e1553b..6d9a841 100644 > --- a/drivers/pci/pcie/pcie-dpc.c > +++ b/drivers/pci/pcie/pcie-dpc.c > @@ -108,8 +108,6 @@ static void dpc_wait_link_inactive(struct dpc_dev *dpc) > */ > static pci_ers_result_t dpc_reset_link(struct pci_dev *pdev) > { > - struct pci_bus *parent = pdev->subordinate; > - struct pci_dev *dev, *temp; > struct dpc_dev *dpc; > struct pcie_device *pciedev; > struct device *devdpc; > @@ -120,19 +118,6 @@ static pci_ers_result_t dpc_reset_link(struct pci_dev *pdev) > dpc = get_service_data(pciedev); > cap = dpc->cap_pos; > > - pci_lock_rescan_remove(); > - list_for_each_entry_safe_reverse(dev, temp, &parent->devices, > - bus_list) { > - pci_dev_get(dev); > - pci_dev_set_disconnected(dev, NULL); > - if (pci_has_subordinate(dev)) > - pci_walk_bus(dev->subordinate, > - pci_dev_set_disconnected, NULL); > - pci_stop_and_remove_bus_device(dev); > - pci_dev_put(dev); > - } > - pci_unlock_rescan_remove(); > - > dpc_wait_link_inactive(dpc); > if (dpc->rp_extensions && dpc_wait_rp_inactive(dpc)) > return PCI_ERS_RESULT_DISCONNECT; > @@ -152,13 +137,37 @@ static pci_ers_result_t dpc_reset_link(struct pci_dev *pdev) > return PCI_ERS_RESULT_RECOVERED; > } > > +static void dpc_reset_link_remove_dev(struct pci_dev *pdev) > +{ > + struct pci_bus *parent = pdev->subordinate; > + struct pci_dev *dev, *temp; > + > + pci_lock_rescan_remove(); > + list_for_each_entry_safe_reverse(dev, temp, &parent->devices, > + bus_list) { > + pci_dev_get(dev); > + pci_dev_set_disconnected(dev, NULL); > + if (pci_has_subordinate(dev)) > + pci_walk_bus(dev->subordinate, > + pci_dev_set_disconnected, NULL); > + pci_stop_and_remove_bus_device(dev); > + pci_dev_put(dev); > + } > + pci_unlock_rescan_remove(); > + > + dpc_reset_link(pdev); > +} > + > static void dpc_work(struct work_struct *work) > { > struct dpc_dev *dpc = container_of(work, struct dpc_dev, work); > struct pci_dev *pdev = dpc->dev->port; > > /* From DPC point of view error is always FATAL. */ > - pcie_do_recovery(pdev, DPC_FATAL); > + if (!pdev->is_hotplug_bridge) > + pcie_do_recovery(pdev, DPC_FATAL); > + else > + dpc_reset_link_remove_dev(pdev); > } > static void dpc_process_rp_pio_error(struct dpc_dev *dpc) > { > -- > 2.7.4 >