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 |
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
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
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 --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;
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(-)