From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-1.0 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS autolearn=no autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 87AE6C433DF for ; Wed, 1 Jul 2020 10:15:46 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 66019206B6 for ; Wed, 1 Jul 2020 10:15:46 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729683AbgGAKPp (ORCPT ); Wed, 1 Jul 2020 06:15:45 -0400 Received: from mga06.intel.com ([134.134.136.31]:54624 "EHLO mga06.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729671AbgGAKPp (ORCPT ); Wed, 1 Jul 2020 06:15:45 -0400 IronPort-SDR: jNktE/SKMS8+zqMAglWyzpyxS5kYLCCFS33QOU5+A0KZgW3SUUB5pWqdVLh/Mh5A7ck48wJece YFuyyOzPynKw== X-IronPort-AV: E=McAfee;i="6000,8403,9668"; a="208035459" X-IronPort-AV: E=Sophos;i="5.75,299,1589266800"; d="scan'208";a="208035459" X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by orsmga104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 01 Jul 2020 03:15:44 -0700 IronPort-SDR: tA64YbS8G6dDa/FPkn0ALytSVod8koFHzYH4r4y8p5mDGz8FTPqAJqVoyUN9LdR+2QHqVbfNfL LCgCDqnNcDxw== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.75,299,1589266800"; d="scan'208";a="386969400" Received: from lahna.fi.intel.com (HELO lahna) ([10.237.72.163]) by fmsmga001.fm.intel.com with SMTP; 01 Jul 2020 03:15:42 -0700 Received: by lahna (sSMTP sendmail emulation); Wed, 01 Jul 2020 13:15:41 +0300 Date: Wed, 1 Jul 2020 13:15:41 +0300 From: Mika Westerberg To: Yicong Yang Cc: Bjorn Helgaas , Bjorn Helgaas , Kalle Valo , linux-pci@vger.kernel.org Subject: Re: [PATCH] PCI: Make pcie_find_root_port() work for PCIe root ports as well Message-ID: <20200701101541.GO5180@lahna.fi.intel.com> References: <20200630220107.GA3489322@bjorn-Precision-5520> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: Organization: Intel Finland Oy - BIC 0357606-4 - Westendinkatu 7, 02160 Espoo Sender: linux-pci-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pci@vger.kernel.org On Wed, Jul 01, 2020 at 09:53:51AM +0800, Yicong Yang wrote: > > static inline struct pci_dev *pcie_find_root_port(struct pci_dev *dev) > > { > > - struct pci_dev *bridge = pci_upstream_bridge(dev); > > - > > - while (bridge) { > > - if (pci_pcie_type(bridge) == PCI_EXP_TYPE_ROOT_PORT) > > - return bridge; > > - bridge = pci_upstream_bridge(bridge); > > + while (dev) { > > + if (pci_is_pcie(dev) && > > + pci_pcie_type(dev) == PCI_EXP_TYPE_ROOT_PORT) > > + return dev; > > + dev = pci_upstream_bridge(dev); > > } > > > > We may have some problems here, as after pcie_find_root_port() called, *dev will > be either root port or NULL but users may want it unchanged. One such usage is > in acpi_pci_bridge_d3(), drivers/pci/pci-acpi.c, *dev is used as origin > after called this. > > So we should use a temporary point to *dev rather than directly modify it. dev is already a copy of what is passed by the caller so it does not matter if it gets changed here. You would need to pass it through struct pci_dev **dev in order to modify the passed pointer.