diff mbox series

[v2,2/4] PCI: Move jailhouse's isolated function handling to pci_scan_slot()

Message ID 20220412143040.1882096-3-schnelle@linux.ibm.com (mailing list archive)
State Superseded
Headers show
Series PCI: Rework pci_scan_slot() and isolated PCI functions | expand

Commit Message

Niklas Schnelle April 12, 2022, 2:30 p.m. UTC
The special case of the jailhouse hypervisor passing through individual
PCI functions handles scanning for PCI functions even if function 0 does
not exist. Currently this is done with an extra loop duplicating the one
in pci_scan_slot(). By incorporating the check for jailhouse_paravirt()
into next_fn() we can instead do this as part of the normal
pci_scan_slot(). The only functional change is that we now call
pcie_aspm_init_link_state() for these functions but this already
happened if function 0 was passed through and should not be a problem.

Link: https://lore.kernel.org/linux-pci/20220408224514.GA353445@bhelgaas/
Suggested-by: Bjorn Helgaas <bhelgaas@google.com>
Signed-off-by: Niklas Schnelle <schnelle@linux.ibm.com>
---
 drivers/pci/probe.c | 25 ++++++-------------------
 1 file changed, 6 insertions(+), 19 deletions(-)

Comments

kernel test robot April 12, 2022, 4:28 p.m. UTC | #1
Hi Niklas,

I love your patch! Perhaps something to improve:

[auto build test WARNING on helgaas-pci/next]
[also build test WARNING on s390/features tip/x86/core v5.18-rc2 next-20220412]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/intel-lab-lkp/linux/commits/Niklas-Schnelle/PCI-Rework-pci_scan_slot-and-isolated-PCI-functions/20220412-223307
base:   https://git.kernel.org/pub/scm/linux/kernel/git/helgaas/pci.git next
config: alpha-defconfig (https://download.01.org/0day-ci/archive/20220413/202204130045.AeSigvk8-lkp@intel.com/config)
compiler: alpha-linux-gcc (GCC) 11.2.0
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # https://github.com/intel-lab-lkp/linux/commit/5cac6729750b7434ff5d6ae99469e9e54bc9fb6e
        git remote add linux-review https://github.com/intel-lab-lkp/linux
        git fetch --no-tags linux-review Niklas-Schnelle/PCI-Rework-pci_scan_slot-and-isolated-PCI-functions/20220412-223307
        git checkout 5cac6729750b7434ff5d6ae99469e9e54bc9fb6e
        # save the config file to linux build tree
        mkdir build_dir
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-11.2.0 make.cross O=build_dir ARCH=alpha SHELL=/bin/bash drivers/pci/

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>

All warnings (new ones prefixed by >>):

   drivers/pci/probe.c: In function 'pci_scan_child_bus_extend':
>> drivers/pci/probe.c:2861:13: warning: variable 'nr_devs' set but not used [-Wunused-but-set-variable]
    2861 |         int nr_devs;
         |             ^~~~~~~


vim +/nr_devs +2861 drivers/pci/probe.c

bccf90d6e063d2 Palmer Dabbelt  2017-06-23  2841  
1c02ea81006548 Mika Westerberg 2017-10-13  2842  /**
1c02ea81006548 Mika Westerberg 2017-10-13  2843   * pci_scan_child_bus_extend() - Scan devices below a bus
1c02ea81006548 Mika Westerberg 2017-10-13  2844   * @bus: Bus to scan for devices
1c02ea81006548 Mika Westerberg 2017-10-13  2845   * @available_buses: Total number of buses available (%0 does not try to
1c02ea81006548 Mika Westerberg 2017-10-13  2846   *		     extend beyond the minimal)
1c02ea81006548 Mika Westerberg 2017-10-13  2847   *
1c02ea81006548 Mika Westerberg 2017-10-13  2848   * Scans devices below @bus including subordinate buses. Returns new
1c02ea81006548 Mika Westerberg 2017-10-13  2849   * subordinate number including all the found devices. Passing
1c02ea81006548 Mika Westerberg 2017-10-13  2850   * @available_buses causes the remaining bus space to be distributed
1c02ea81006548 Mika Westerberg 2017-10-13  2851   * equally between hotplug-capable bridges to allow future extension of the
1c02ea81006548 Mika Westerberg 2017-10-13  2852   * hierarchy.
1c02ea81006548 Mika Westerberg 2017-10-13  2853   */
1c02ea81006548 Mika Westerberg 2017-10-13  2854  static unsigned int pci_scan_child_bus_extend(struct pci_bus *bus,
1c02ea81006548 Mika Westerberg 2017-10-13  2855  					      unsigned int available_buses)
1c02ea81006548 Mika Westerberg 2017-10-13  2856  {
1c02ea81006548 Mika Westerberg 2017-10-13  2857  	unsigned int used_buses, normal_bridges = 0, hotplug_bridges = 0;
1c02ea81006548 Mika Westerberg 2017-10-13  2858  	unsigned int start = bus->busn_res.start;
5cac6729750b74 Niklas Schnelle 2022-04-12  2859  	unsigned int devfn, cmax, max = start;
^1da177e4c3f41 Linus Torvalds  2005-04-16  2860  	struct pci_dev *dev;
690f4304104f37 Jan Kiszka      2018-03-07 @2861  	int nr_devs;
^1da177e4c3f41 Linus Torvalds  2005-04-16  2862  
0207c356ef0e2b Bjorn Helgaas   2009-11-04  2863  	dev_dbg(&bus->dev, "scanning bus\n");
^1da177e4c3f41 Linus Torvalds  2005-04-16  2864  
^1da177e4c3f41 Linus Torvalds  2005-04-16  2865  	/* Go find them, Rover! */
5cac6729750b74 Niklas Schnelle 2022-04-12  2866  	for (devfn = 0; devfn < 256; devfn += 8)
690f4304104f37 Jan Kiszka      2018-03-07  2867  		nr_devs = pci_scan_slot(bus, devfn);
690f4304104f37 Jan Kiszka      2018-03-07  2868  
3e466e2d3a04c7 Bjorn Helgaas   2017-11-30  2869  	/* Reserve buses for SR-IOV capability */
1c02ea81006548 Mika Westerberg 2017-10-13  2870  	used_buses = pci_iov_bus_range(bus);
1c02ea81006548 Mika Westerberg 2017-10-13  2871  	max += used_buses;
a28724b0fb909d Yu Zhao         2009-03-20  2872  
^1da177e4c3f41 Linus Torvalds  2005-04-16  2873  	/*
^1da177e4c3f41 Linus Torvalds  2005-04-16  2874  	 * After performing arch-dependent fixup of the bus, look behind
^1da177e4c3f41 Linus Torvalds  2005-04-16  2875  	 * all PCI-to-PCI bridges on this bus.
^1da177e4c3f41 Linus Torvalds  2005-04-16  2876  	 */
74710ded8e16fc Alex Chiang     2009-03-20  2877  	if (!bus->is_added) {
0207c356ef0e2b Bjorn Helgaas   2009-11-04  2878  		dev_dbg(&bus->dev, "fixups for bus\n");
^1da177e4c3f41 Linus Torvalds  2005-04-16  2879  		pcibios_fixup_bus(bus);
74710ded8e16fc Alex Chiang     2009-03-20  2880  		bus->is_added = 1;
74710ded8e16fc Alex Chiang     2009-03-20  2881  	}
74710ded8e16fc Alex Chiang     2009-03-20  2882  
1c02ea81006548 Mika Westerberg 2017-10-13  2883  	/*
1c02ea81006548 Mika Westerberg 2017-10-13  2884  	 * Calculate how many hotplug bridges and normal bridges there
1c02ea81006548 Mika Westerberg 2017-10-13  2885  	 * are on this bus. We will distribute the additional available
1c02ea81006548 Mika Westerberg 2017-10-13  2886  	 * buses between hotplug bridges.
1c02ea81006548 Mika Westerberg 2017-10-13  2887  	 */
1c02ea81006548 Mika Westerberg 2017-10-13  2888  	for_each_pci_bridge(dev, bus) {
1c02ea81006548 Mika Westerberg 2017-10-13  2889  		if (dev->is_hotplug_bridge)
1c02ea81006548 Mika Westerberg 2017-10-13  2890  			hotplug_bridges++;
1c02ea81006548 Mika Westerberg 2017-10-13  2891  		else
1c02ea81006548 Mika Westerberg 2017-10-13  2892  			normal_bridges++;
1c02ea81006548 Mika Westerberg 2017-10-13  2893  	}
1c02ea81006548 Mika Westerberg 2017-10-13  2894  
4147c2fd9b12ae Mika Westerberg 2017-10-13  2895  	/*
4147c2fd9b12ae Mika Westerberg 2017-10-13  2896  	 * Scan bridges that are already configured. We don't touch them
4147c2fd9b12ae Mika Westerberg 2017-10-13  2897  	 * unless they are misconfigured (which will be done in the second
4147c2fd9b12ae Mika Westerberg 2017-10-13  2898  	 * scan below).
4147c2fd9b12ae Mika Westerberg 2017-10-13  2899  	 */
1c02ea81006548 Mika Westerberg 2017-10-13  2900  	for_each_pci_bridge(dev, bus) {
1c02ea81006548 Mika Westerberg 2017-10-13  2901  		cmax = max;
1c02ea81006548 Mika Westerberg 2017-10-13  2902  		max = pci_scan_bridge_extend(bus, dev, max, 0, 0);
3374c545c27c53 Mika Westerberg 2018-05-28  2903  
3374c545c27c53 Mika Westerberg 2018-05-28  2904  		/*
3374c545c27c53 Mika Westerberg 2018-05-28  2905  		 * Reserve one bus for each bridge now to avoid extending
3374c545c27c53 Mika Westerberg 2018-05-28  2906  		 * hotplug bridges too much during the second scan below.
3374c545c27c53 Mika Westerberg 2018-05-28  2907  		 */
3374c545c27c53 Mika Westerberg 2018-05-28  2908  		used_buses++;
3374c545c27c53 Mika Westerberg 2018-05-28  2909  		if (cmax - max > 1)
3374c545c27c53 Mika Westerberg 2018-05-28  2910  			used_buses += cmax - max - 1;
1c02ea81006548 Mika Westerberg 2017-10-13  2911  	}
4147c2fd9b12ae Mika Westerberg 2017-10-13  2912  
4147c2fd9b12ae Mika Westerberg 2017-10-13  2913  	/* Scan bridges that need to be reconfigured */
1c02ea81006548 Mika Westerberg 2017-10-13  2914  	for_each_pci_bridge(dev, bus) {
1c02ea81006548 Mika Westerberg 2017-10-13  2915  		unsigned int buses = 0;
1c02ea81006548 Mika Westerberg 2017-10-13  2916  
1c02ea81006548 Mika Westerberg 2017-10-13  2917  		if (!hotplug_bridges && normal_bridges == 1) {
3e466e2d3a04c7 Bjorn Helgaas   2017-11-30  2918  
1c02ea81006548 Mika Westerberg 2017-10-13  2919  			/*
1c02ea81006548 Mika Westerberg 2017-10-13  2920  			 * There is only one bridge on the bus (upstream
1c02ea81006548 Mika Westerberg 2017-10-13  2921  			 * port) so it gets all available buses which it
1c02ea81006548 Mika Westerberg 2017-10-13  2922  			 * can then distribute to the possible hotplug
1c02ea81006548 Mika Westerberg 2017-10-13  2923  			 * bridges below.
1c02ea81006548 Mika Westerberg 2017-10-13  2924  			 */
1c02ea81006548 Mika Westerberg 2017-10-13  2925  			buses = available_buses;
1c02ea81006548 Mika Westerberg 2017-10-13  2926  		} else if (dev->is_hotplug_bridge) {
3e466e2d3a04c7 Bjorn Helgaas   2017-11-30  2927  
1c02ea81006548 Mika Westerberg 2017-10-13  2928  			/*
1c02ea81006548 Mika Westerberg 2017-10-13  2929  			 * Distribute the extra buses between hotplug
1c02ea81006548 Mika Westerberg 2017-10-13  2930  			 * bridges if any.
1c02ea81006548 Mika Westerberg 2017-10-13  2931  			 */
1c02ea81006548 Mika Westerberg 2017-10-13  2932  			buses = available_buses / hotplug_bridges;
3374c545c27c53 Mika Westerberg 2018-05-28  2933  			buses = min(buses, available_buses - used_buses + 1);
1c02ea81006548 Mika Westerberg 2017-10-13  2934  		}
1c02ea81006548 Mika Westerberg 2017-10-13  2935  
1c02ea81006548 Mika Westerberg 2017-10-13  2936  		cmax = max;
1c02ea81006548 Mika Westerberg 2017-10-13  2937  		max = pci_scan_bridge_extend(bus, dev, cmax, buses, 1);
3374c545c27c53 Mika Westerberg 2018-05-28  2938  		/* One bus is already accounted so don't add it again */
3374c545c27c53 Mika Westerberg 2018-05-28  2939  		if (max - cmax > 1)
3374c545c27c53 Mika Westerberg 2018-05-28  2940  			used_buses += max - cmax - 1;
1c02ea81006548 Mika Westerberg 2017-10-13  2941  	}
^1da177e4c3f41 Linus Torvalds  2005-04-16  2942  
e16b46605960bd Keith Busch     2016-07-21  2943  	/*
e16b46605960bd Keith Busch     2016-07-21  2944  	 * Make sure a hotplug bridge has at least the minimum requested
1c02ea81006548 Mika Westerberg 2017-10-13  2945  	 * number of buses but allow it to grow up to the maximum available
1c02ea81006548 Mika Westerberg 2017-10-13  2946  	 * bus number of there is room.
e16b46605960bd Keith Busch     2016-07-21  2947  	 */
1c02ea81006548 Mika Westerberg 2017-10-13  2948  	if (bus->self && bus->self->is_hotplug_bridge) {
1c02ea81006548 Mika Westerberg 2017-10-13  2949  		used_buses = max_t(unsigned int, available_buses,
1c02ea81006548 Mika Westerberg 2017-10-13  2950  				   pci_hotplug_bus_size - 1);
1c02ea81006548 Mika Westerberg 2017-10-13  2951  		if (max - start < used_buses) {
1c02ea81006548 Mika Westerberg 2017-10-13  2952  			max = start + used_buses;
a20c7f36bd3d20 Mika Westerberg 2017-10-13  2953  
a20c7f36bd3d20 Mika Westerberg 2017-10-13  2954  			/* Do not allocate more buses than we have room left */
a20c7f36bd3d20 Mika Westerberg 2017-10-13  2955  			if (max > bus->busn_res.end)
a20c7f36bd3d20 Mika Westerberg 2017-10-13  2956  				max = bus->busn_res.end;
1c02ea81006548 Mika Westerberg 2017-10-13  2957  
1c02ea81006548 Mika Westerberg 2017-10-13  2958  			dev_dbg(&bus->dev, "%pR extended by %#02x\n",
1c02ea81006548 Mika Westerberg 2017-10-13  2959  				&bus->busn_res, max - start);
1c02ea81006548 Mika Westerberg 2017-10-13  2960  		}
e16b46605960bd Keith Busch     2016-07-21  2961  	}
e16b46605960bd Keith Busch     2016-07-21  2962  
^1da177e4c3f41 Linus Torvalds  2005-04-16  2963  	/*
^1da177e4c3f41 Linus Torvalds  2005-04-16  2964  	 * We've scanned the bus and so we know all about what's on
^1da177e4c3f41 Linus Torvalds  2005-04-16  2965  	 * the other side of any bridges that may be on this bus plus
^1da177e4c3f41 Linus Torvalds  2005-04-16  2966  	 * any devices.
^1da177e4c3f41 Linus Torvalds  2005-04-16  2967  	 *
^1da177e4c3f41 Linus Torvalds  2005-04-16  2968  	 * Return how far we've got finding sub-buses.
^1da177e4c3f41 Linus Torvalds  2005-04-16  2969  	 */
0207c356ef0e2b Bjorn Helgaas   2009-11-04  2970  	dev_dbg(&bus->dev, "bus scan returning with max=%02x\n", max);
^1da177e4c3f41 Linus Torvalds  2005-04-16  2971  	return max;
^1da177e4c3f41 Linus Torvalds  2005-04-16  2972  }
1c02ea81006548 Mika Westerberg 2017-10-13  2973
kernel test robot April 12, 2022, 7:43 p.m. UTC | #2
Hi Niklas,

I love your patch! Perhaps something to improve:

[auto build test WARNING on helgaas-pci/next]
[also build test WARNING on s390/features tip/x86/core v5.18-rc2 next-20220412]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/intel-lab-lkp/linux/commits/Niklas-Schnelle/PCI-Rework-pci_scan_slot-and-isolated-PCI-functions/20220412-223307
base:   https://git.kernel.org/pub/scm/linux/kernel/git/helgaas/pci.git next
config: i386-randconfig-a003-20220411 (https://download.01.org/0day-ci/archive/20220413/202204130326.eQ0YpxtC-lkp@intel.com/config)
compiler: clang version 15.0.0 (https://github.com/llvm/llvm-project fe2478d44e4f7f191c43fef629ac7a23d0251e72)
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # https://github.com/intel-lab-lkp/linux/commit/5cac6729750b7434ff5d6ae99469e9e54bc9fb6e
        git remote add linux-review https://github.com/intel-lab-lkp/linux
        git fetch --no-tags linux-review Niklas-Schnelle/PCI-Rework-pci_scan_slot-and-isolated-PCI-functions/20220412-223307
        git checkout 5cac6729750b7434ff5d6ae99469e9e54bc9fb6e
        # save the config file to linux build tree
        mkdir build_dir
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=i386 SHELL=/bin/bash drivers/pci/

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>

All warnings (new ones prefixed by >>):

>> drivers/pci/probe.c:2861:6: warning: variable 'nr_devs' set but not used [-Wunused-but-set-variable]
           int nr_devs;
               ^
   1 warning generated.


vim +/nr_devs +2861 drivers/pci/probe.c

bccf90d6e063d27 Palmer Dabbelt  2017-06-23  2841  
1c02ea81006548a Mika Westerberg 2017-10-13  2842  /**
1c02ea81006548a Mika Westerberg 2017-10-13  2843   * pci_scan_child_bus_extend() - Scan devices below a bus
1c02ea81006548a Mika Westerberg 2017-10-13  2844   * @bus: Bus to scan for devices
1c02ea81006548a Mika Westerberg 2017-10-13  2845   * @available_buses: Total number of buses available (%0 does not try to
1c02ea81006548a Mika Westerberg 2017-10-13  2846   *		     extend beyond the minimal)
1c02ea81006548a Mika Westerberg 2017-10-13  2847   *
1c02ea81006548a Mika Westerberg 2017-10-13  2848   * Scans devices below @bus including subordinate buses. Returns new
1c02ea81006548a Mika Westerberg 2017-10-13  2849   * subordinate number including all the found devices. Passing
1c02ea81006548a Mika Westerberg 2017-10-13  2850   * @available_buses causes the remaining bus space to be distributed
1c02ea81006548a Mika Westerberg 2017-10-13  2851   * equally between hotplug-capable bridges to allow future extension of the
1c02ea81006548a Mika Westerberg 2017-10-13  2852   * hierarchy.
1c02ea81006548a Mika Westerberg 2017-10-13  2853   */
1c02ea81006548a Mika Westerberg 2017-10-13  2854  static unsigned int pci_scan_child_bus_extend(struct pci_bus *bus,
1c02ea81006548a Mika Westerberg 2017-10-13  2855  					      unsigned int available_buses)
1c02ea81006548a Mika Westerberg 2017-10-13  2856  {
1c02ea81006548a Mika Westerberg 2017-10-13  2857  	unsigned int used_buses, normal_bridges = 0, hotplug_bridges = 0;
1c02ea81006548a Mika Westerberg 2017-10-13  2858  	unsigned int start = bus->busn_res.start;
5cac6729750b743 Niklas Schnelle 2022-04-12  2859  	unsigned int devfn, cmax, max = start;
^1da177e4c3f415 Linus Torvalds  2005-04-16  2860  	struct pci_dev *dev;
690f4304104f37e Jan Kiszka      2018-03-07 @2861  	int nr_devs;
^1da177e4c3f415 Linus Torvalds  2005-04-16  2862  
0207c356ef0e2ba Bjorn Helgaas   2009-11-04  2863  	dev_dbg(&bus->dev, "scanning bus\n");
^1da177e4c3f415 Linus Torvalds  2005-04-16  2864  
^1da177e4c3f415 Linus Torvalds  2005-04-16  2865  	/* Go find them, Rover! */
5cac6729750b743 Niklas Schnelle 2022-04-12  2866  	for (devfn = 0; devfn < 256; devfn += 8)
690f4304104f37e Jan Kiszka      2018-03-07  2867  		nr_devs = pci_scan_slot(bus, devfn);
690f4304104f37e Jan Kiszka      2018-03-07  2868  
3e466e2d3a04c72 Bjorn Helgaas   2017-11-30  2869  	/* Reserve buses for SR-IOV capability */
1c02ea81006548a Mika Westerberg 2017-10-13  2870  	used_buses = pci_iov_bus_range(bus);
1c02ea81006548a Mika Westerberg 2017-10-13  2871  	max += used_buses;
a28724b0fb909d2 Yu Zhao         2009-03-20  2872  
^1da177e4c3f415 Linus Torvalds  2005-04-16  2873  	/*
^1da177e4c3f415 Linus Torvalds  2005-04-16  2874  	 * After performing arch-dependent fixup of the bus, look behind
^1da177e4c3f415 Linus Torvalds  2005-04-16  2875  	 * all PCI-to-PCI bridges on this bus.
^1da177e4c3f415 Linus Torvalds  2005-04-16  2876  	 */
74710ded8e16fc8 Alex Chiang     2009-03-20  2877  	if (!bus->is_added) {
0207c356ef0e2ba Bjorn Helgaas   2009-11-04  2878  		dev_dbg(&bus->dev, "fixups for bus\n");
^1da177e4c3f415 Linus Torvalds  2005-04-16  2879  		pcibios_fixup_bus(bus);
74710ded8e16fc8 Alex Chiang     2009-03-20  2880  		bus->is_added = 1;
74710ded8e16fc8 Alex Chiang     2009-03-20  2881  	}
74710ded8e16fc8 Alex Chiang     2009-03-20  2882  
1c02ea81006548a Mika Westerberg 2017-10-13  2883  	/*
1c02ea81006548a Mika Westerberg 2017-10-13  2884  	 * Calculate how many hotplug bridges and normal bridges there
1c02ea81006548a Mika Westerberg 2017-10-13  2885  	 * are on this bus. We will distribute the additional available
1c02ea81006548a Mika Westerberg 2017-10-13  2886  	 * buses between hotplug bridges.
1c02ea81006548a Mika Westerberg 2017-10-13  2887  	 */
1c02ea81006548a Mika Westerberg 2017-10-13  2888  	for_each_pci_bridge(dev, bus) {
1c02ea81006548a Mika Westerberg 2017-10-13  2889  		if (dev->is_hotplug_bridge)
1c02ea81006548a Mika Westerberg 2017-10-13  2890  			hotplug_bridges++;
1c02ea81006548a Mika Westerberg 2017-10-13  2891  		else
1c02ea81006548a Mika Westerberg 2017-10-13  2892  			normal_bridges++;
1c02ea81006548a Mika Westerberg 2017-10-13  2893  	}
1c02ea81006548a Mika Westerberg 2017-10-13  2894  
4147c2fd9b12ae1 Mika Westerberg 2017-10-13  2895  	/*
4147c2fd9b12ae1 Mika Westerberg 2017-10-13  2896  	 * Scan bridges that are already configured. We don't touch them
4147c2fd9b12ae1 Mika Westerberg 2017-10-13  2897  	 * unless they are misconfigured (which will be done in the second
4147c2fd9b12ae1 Mika Westerberg 2017-10-13  2898  	 * scan below).
4147c2fd9b12ae1 Mika Westerberg 2017-10-13  2899  	 */
1c02ea81006548a Mika Westerberg 2017-10-13  2900  	for_each_pci_bridge(dev, bus) {
1c02ea81006548a Mika Westerberg 2017-10-13  2901  		cmax = max;
1c02ea81006548a Mika Westerberg 2017-10-13  2902  		max = pci_scan_bridge_extend(bus, dev, max, 0, 0);
3374c545c27c535 Mika Westerberg 2018-05-28  2903  
3374c545c27c535 Mika Westerberg 2018-05-28  2904  		/*
3374c545c27c535 Mika Westerberg 2018-05-28  2905  		 * Reserve one bus for each bridge now to avoid extending
3374c545c27c535 Mika Westerberg 2018-05-28  2906  		 * hotplug bridges too much during the second scan below.
3374c545c27c535 Mika Westerberg 2018-05-28  2907  		 */
3374c545c27c535 Mika Westerberg 2018-05-28  2908  		used_buses++;
3374c545c27c535 Mika Westerberg 2018-05-28  2909  		if (cmax - max > 1)
3374c545c27c535 Mika Westerberg 2018-05-28  2910  			used_buses += cmax - max - 1;
1c02ea81006548a Mika Westerberg 2017-10-13  2911  	}
4147c2fd9b12ae1 Mika Westerberg 2017-10-13  2912  
4147c2fd9b12ae1 Mika Westerberg 2017-10-13  2913  	/* Scan bridges that need to be reconfigured */
1c02ea81006548a Mika Westerberg 2017-10-13  2914  	for_each_pci_bridge(dev, bus) {
1c02ea81006548a Mika Westerberg 2017-10-13  2915  		unsigned int buses = 0;
1c02ea81006548a Mika Westerberg 2017-10-13  2916  
1c02ea81006548a Mika Westerberg 2017-10-13  2917  		if (!hotplug_bridges && normal_bridges == 1) {
3e466e2d3a04c72 Bjorn Helgaas   2017-11-30  2918  
1c02ea81006548a Mika Westerberg 2017-10-13  2919  			/*
1c02ea81006548a Mika Westerberg 2017-10-13  2920  			 * There is only one bridge on the bus (upstream
1c02ea81006548a Mika Westerberg 2017-10-13  2921  			 * port) so it gets all available buses which it
1c02ea81006548a Mika Westerberg 2017-10-13  2922  			 * can then distribute to the possible hotplug
1c02ea81006548a Mika Westerberg 2017-10-13  2923  			 * bridges below.
1c02ea81006548a Mika Westerberg 2017-10-13  2924  			 */
1c02ea81006548a Mika Westerberg 2017-10-13  2925  			buses = available_buses;
1c02ea81006548a Mika Westerberg 2017-10-13  2926  		} else if (dev->is_hotplug_bridge) {
3e466e2d3a04c72 Bjorn Helgaas   2017-11-30  2927  
1c02ea81006548a Mika Westerberg 2017-10-13  2928  			/*
1c02ea81006548a Mika Westerberg 2017-10-13  2929  			 * Distribute the extra buses between hotplug
1c02ea81006548a Mika Westerberg 2017-10-13  2930  			 * bridges if any.
1c02ea81006548a Mika Westerberg 2017-10-13  2931  			 */
1c02ea81006548a Mika Westerberg 2017-10-13  2932  			buses = available_buses / hotplug_bridges;
3374c545c27c535 Mika Westerberg 2018-05-28  2933  			buses = min(buses, available_buses - used_buses + 1);
1c02ea81006548a Mika Westerberg 2017-10-13  2934  		}
1c02ea81006548a Mika Westerberg 2017-10-13  2935  
1c02ea81006548a Mika Westerberg 2017-10-13  2936  		cmax = max;
1c02ea81006548a Mika Westerberg 2017-10-13  2937  		max = pci_scan_bridge_extend(bus, dev, cmax, buses, 1);
3374c545c27c535 Mika Westerberg 2018-05-28  2938  		/* One bus is already accounted so don't add it again */
3374c545c27c535 Mika Westerberg 2018-05-28  2939  		if (max - cmax > 1)
3374c545c27c535 Mika Westerberg 2018-05-28  2940  			used_buses += max - cmax - 1;
1c02ea81006548a Mika Westerberg 2017-10-13  2941  	}
^1da177e4c3f415 Linus Torvalds  2005-04-16  2942  
e16b46605960bd0 Keith Busch     2016-07-21  2943  	/*
e16b46605960bd0 Keith Busch     2016-07-21  2944  	 * Make sure a hotplug bridge has at least the minimum requested
1c02ea81006548a Mika Westerberg 2017-10-13  2945  	 * number of buses but allow it to grow up to the maximum available
1c02ea81006548a Mika Westerberg 2017-10-13  2946  	 * bus number of there is room.
e16b46605960bd0 Keith Busch     2016-07-21  2947  	 */
1c02ea81006548a Mika Westerberg 2017-10-13  2948  	if (bus->self && bus->self->is_hotplug_bridge) {
1c02ea81006548a Mika Westerberg 2017-10-13  2949  		used_buses = max_t(unsigned int, available_buses,
1c02ea81006548a Mika Westerberg 2017-10-13  2950  				   pci_hotplug_bus_size - 1);
1c02ea81006548a Mika Westerberg 2017-10-13  2951  		if (max - start < used_buses) {
1c02ea81006548a Mika Westerberg 2017-10-13  2952  			max = start + used_buses;
a20c7f36bd3d20d Mika Westerberg 2017-10-13  2953  
a20c7f36bd3d20d Mika Westerberg 2017-10-13  2954  			/* Do not allocate more buses than we have room left */
a20c7f36bd3d20d Mika Westerberg 2017-10-13  2955  			if (max > bus->busn_res.end)
a20c7f36bd3d20d Mika Westerberg 2017-10-13  2956  				max = bus->busn_res.end;
1c02ea81006548a Mika Westerberg 2017-10-13  2957  
1c02ea81006548a Mika Westerberg 2017-10-13  2958  			dev_dbg(&bus->dev, "%pR extended by %#02x\n",
1c02ea81006548a Mika Westerberg 2017-10-13  2959  				&bus->busn_res, max - start);
1c02ea81006548a Mika Westerberg 2017-10-13  2960  		}
e16b46605960bd0 Keith Busch     2016-07-21  2961  	}
e16b46605960bd0 Keith Busch     2016-07-21  2962  
^1da177e4c3f415 Linus Torvalds  2005-04-16  2963  	/*
^1da177e4c3f415 Linus Torvalds  2005-04-16  2964  	 * We've scanned the bus and so we know all about what's on
^1da177e4c3f415 Linus Torvalds  2005-04-16  2965  	 * the other side of any bridges that may be on this bus plus
^1da177e4c3f415 Linus Torvalds  2005-04-16  2966  	 * any devices.
^1da177e4c3f415 Linus Torvalds  2005-04-16  2967  	 *
^1da177e4c3f415 Linus Torvalds  2005-04-16  2968  	 * Return how far we've got finding sub-buses.
^1da177e4c3f415 Linus Torvalds  2005-04-16  2969  	 */
0207c356ef0e2ba Bjorn Helgaas   2009-11-04  2970  	dev_dbg(&bus->dev, "bus scan returning with max=%02x\n", max);
^1da177e4c3f415 Linus Torvalds  2005-04-16  2971  	return max;
^1da177e4c3f415 Linus Torvalds  2005-04-16  2972  }
1c02ea81006548a Mika Westerberg 2017-10-13  2973
Niklas Schnelle April 13, 2022, 7:55 a.m. UTC | #3
On Wed, 2022-04-13 at 00:28 +0800, kernel test robot wrote:
> Hi Niklas,
> 
> I love your patch! Perhaps something to improve:
> 
> [auto build test WARNING on helgaas-pci/next]
> [also build test WARNING on s390/features tip/x86/core v5.18-rc2 next-20220412]
> [If your patch is applied to the wrong git tree, kindly drop us a note.
> And when submitting patch, we suggest to use '--base' as documented in
> https://git-scm.com/docs/git-format-patch]
> 
> url:    https://github.com/intel-lab-lkp/linux/commits/Niklas-Schnelle/PCI-Rework-pci_scan_slot-and-isolated-PCI-functions/20220412-223307
> base:   https://git.kernel.org/pub/scm/linux/kernel/git/helgaas/pci.git next
> config: alpha-defconfig (https://download.01.org/0day-ci/archive/20220413/202204130045.AeSigvk8-lkp@intel.com/config)
> compiler: alpha-linux-gcc (GCC) 11.2.0
> reproduce (this is a W=1 build):
>         wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
>         chmod +x ~/bin/make.cross
>         # https://github.com/intel-lab-lkp/linux/commit/5cac6729750b7434ff5d6ae99469e9e54bc9fb6e
>         git remote add linux-review https://github.com/intel-lab-lkp/linux
>         git fetch --no-tags linux-review Niklas-Schnelle/PCI-Rework-pci_scan_slot-and-isolated-PCI-functions/20220412-223307
>         git checkout 5cac6729750b7434ff5d6ae99469e9e54bc9fb6e
>         # save the config file to linux build tree
>         mkdir build_dir
>         COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-11.2.0 make.cross O=build_dir ARCH=alpha SHELL=/bin/bash drivers/pci/
> 
> If you fix the issue, kindly add following tag as appropriate
> Reported-by: kernel test robot <lkp@intel.com>
> 
> All warnings (new ones prefixed by >>):
> 
>    drivers/pci/probe.c: In function 'pci_scan_child_bus_extend':
> > > drivers/pci/probe.c:2861:13: warning: variable 'nr_devs' set but not used [-Wunused-but-set-variable]
>     2861 |         int nr_devs;
>          |             ^~~~~~~
> 
> 
> vim +/nr_devs +2861 drivers/pci/probe.c
> 
> bccf90d6e063d2 Palmer Dabbelt  2017-06-23  2841  
> 1c02ea81006548 Mika Westerberg 2017-10-13  2842  /**
> 1c02ea81006548 Mika Westerberg 2017-10-13  2843   * pci_scan_child_bus_extend() - Scan devices below a bus
> 1c02ea81006548 Mika Westerberg 2017-10-13  2844   * @bus: Bus to scan for devices
> 1c02ea81006548 Mika Westerberg 2017-10-13  2845   * @available_buses: Total number of buses available (%0 does not try to
> 1c02ea81006548 Mika Westerberg 2017-10-13  2846   *		     extend beyond the minimal)
> 1c02ea81006548 Mika Westerberg 2017-10-13  2847   *
> 1c02ea81006548 Mika Westerberg 2017-10-13  2848   * Scans devices below @bus including subordinate buses. Returns new
> 1c02ea81006548 Mika Westerberg 2017-10-13  2849   * subordinate number including all the found devices. Passing
> 1c02ea81006548 Mika Westerberg 2017-10-13  2850   * @available_buses causes the remaining bus space to be distributed
> 1c02ea81006548 Mika Westerberg 2017-10-13  2851   * equally between hotplug-capable bridges to allow future extension of the
> 1c02ea81006548 Mika Westerberg 2017-10-13  2852   * hierarchy.
> 1c02ea81006548 Mika Westerberg 2017-10-13  2853   */
> 1c02ea81006548 Mika Westerberg 2017-10-13  2854  static unsigned int pci_scan_child_bus_extend(struct pci_bus *bus,
> 1c02ea81006548 Mika Westerberg 2017-10-13  2855  					      unsigned int available_buses)
> 1c02ea81006548 Mika Westerberg 2017-10-13  2856  {
> 1c02ea81006548 Mika Westerberg 2017-10-13  2857  	unsigned int used_buses, normal_bridges = 0, hotplug_bridges = 0;
> 1c02ea81006548 Mika Westerberg 2017-10-13  2858  	unsigned int start = bus->busn_res.start;
> 5cac6729750b74 Niklas Schnelle 2022-04-12  2859  	unsigned int devfn, cmax, max = start;
> ^1da177e4c3f41 Linus Torvalds  2005-04-16  2860  	struct pci_dev *dev;
> 690f4304104f37 Jan Kiszka      2018-03-07 @2861  	int nr_devs;
> ^1da177e4c3f41 Linus Torvalds  2005-04-16  2862  
> 0207c356ef0e2b Bjorn Helgaas   2009-11-04  2863  	dev_dbg(&bus->dev, "scanning bus\n");
> ^1da177e4c3f41 Linus Torvalds  2005-04-16  2864  
> ^1da177e4c3f41 Linus Torvalds  2005-04-16  2865  	/* Go find them, Rover! */
> 5cac6729750b74 Niklas Schnelle 2022-04-12  2866  	for (devfn = 0; devfn < 256; devfn += 8)
> 690f4304104f37 Jan Kiszka      2018-03-07  2867  		nr_devs = pci_scan_slot(bus, devfn);

The bot is right, the nr_devs can be removed as the patch removed the
only read access did so locally already.
diff mbox series

Patch

diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index 389aa1f9cb2c..8100e044dfc5 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -2602,10 +2602,11 @@  static int next_fn(struct pci_bus *bus, struct pci_dev *dev, int fn)
 	if (dev && !dev->multifunction)
 		return -ENODEV;
 	/*
-	 * A function 0 is required but multifunction devices may
-	 * be non-contiguous so dev can be NULL otherwise.
+	 * Usually a function 0 is required but the jailhouse hypervisor may
+	 * pass individual functions. For non-contiguous multifunction devices
+	 * some functions may also be missing.
 	 */
-	if (!fn && !dev)
+	if (!fn && !dev && !jailhouse_paravirt())
 		return -ENODEV;
 	return (fn <= 6) ? fn + 1 : -ENODEV;
 }
@@ -2855,30 +2856,16 @@  static unsigned int pci_scan_child_bus_extend(struct pci_bus *bus,
 {
 	unsigned int used_buses, normal_bridges = 0, hotplug_bridges = 0;
 	unsigned int start = bus->busn_res.start;
-	unsigned int devfn, fn, cmax, max = start;
+	unsigned int devfn, cmax, max = start;
 	struct pci_dev *dev;
 	int nr_devs;
 
 	dev_dbg(&bus->dev, "scanning bus\n");
 
 	/* Go find them, Rover! */
-	for (devfn = 0; devfn < 256; devfn += 8) {
+	for (devfn = 0; devfn < 256; devfn += 8)
 		nr_devs = pci_scan_slot(bus, devfn);
 
-		/*
-		 * The Jailhouse hypervisor may pass individual functions of a
-		 * multi-function device to a guest without passing function 0.
-		 * Look for them as well.
-		 */
-		if (jailhouse_paravirt() && nr_devs == 0) {
-			for (fn = 1; fn < 8; fn++) {
-				dev = pci_scan_single_device(bus, devfn + fn);
-				if (dev)
-					dev->multifunction = 1;
-			}
-		}
-	}
-
 	/* Reserve buses for SR-IOV capability */
 	used_buses = pci_iov_bus_range(bus);
 	max += used_buses;