Re: [PATCH 1/2] lib/find: Make functions safe on changing bitmaps

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Jan,

kernel test robot noticed the following build warnings:

[auto build test WARNING on linus/master]
[also build test WARNING on v6.6-rc6 next-20231018]
[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#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Jan-Kara/lib-find-Make-functions-safe-on-changing-bitmaps/20231011-230553
base:   linus/master
patch link:    https://lore.kernel.org/r/20231011150252.32737-1-jack%40suse.cz
patch subject: [PATCH 1/2] lib/find: Make functions safe on changing bitmaps
config: i386-randconfig-002-20231018 (https://download.01.org/0day-ci/archive/20231019/202310190005.NqJcRXtK-lkp@xxxxxxxxx/config)
compiler: gcc-12 (Debian 12.2.0-14) 12.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20231019/202310190005.NqJcRXtK-lkp@xxxxxxxxx/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@xxxxxxxxx>
| Closes: https://lore.kernel.org/oe-kbuild-all/202310190005.NqJcRXtK-lkp@xxxxxxxxx/

All warnings (new ones prefixed by >>):

   mm/percpu.c: In function 'pcpu_build_alloc_info':
>> mm/percpu.c:2885:26: warning: array subscript 32 is above array bounds of 'int[32]' [-Warray-bounds]
    2885 |                 group_map[cpu] = group;
         |                 ~~~~~~~~~^~~~~
   mm/percpu.c:2842:20: note: while referencing 'group_map'
    2842 |         static int group_map[NR_CPUS] __initdata;
         |                    ^~~~~~~~~


vim +2885 mm/percpu.c

3c9a024fde58b0 Tejun Heo              2010-09-09  2813  
3c9a024fde58b0 Tejun Heo              2010-09-09  2814  /* pcpu_build_alloc_info() is used by both embed and page first chunk */
3c9a024fde58b0 Tejun Heo              2010-09-09  2815  #if defined(BUILD_EMBED_FIRST_CHUNK) || defined(BUILD_PAGE_FIRST_CHUNK)
3c9a024fde58b0 Tejun Heo              2010-09-09  2816  /**
3c9a024fde58b0 Tejun Heo              2010-09-09  2817   * pcpu_build_alloc_info - build alloc_info considering distances between CPUs
3c9a024fde58b0 Tejun Heo              2010-09-09  2818   * @reserved_size: the size of reserved percpu area in bytes
3c9a024fde58b0 Tejun Heo              2010-09-09  2819   * @dyn_size: minimum free size for dynamic allocation in bytes
3c9a024fde58b0 Tejun Heo              2010-09-09  2820   * @atom_size: allocation atom size
3c9a024fde58b0 Tejun Heo              2010-09-09  2821   * @cpu_distance_fn: callback to determine distance between cpus, optional
3c9a024fde58b0 Tejun Heo              2010-09-09  2822   *
3c9a024fde58b0 Tejun Heo              2010-09-09  2823   * This function determines grouping of units, their mappings to cpus
3c9a024fde58b0 Tejun Heo              2010-09-09  2824   * and other parameters considering needed percpu size, allocation
3c9a024fde58b0 Tejun Heo              2010-09-09  2825   * atom size and distances between CPUs.
3c9a024fde58b0 Tejun Heo              2010-09-09  2826   *
bffc4375897ea0 Yannick Guerrini       2015-03-06  2827   * Groups are always multiples of atom size and CPUs which are of
3c9a024fde58b0 Tejun Heo              2010-09-09  2828   * LOCAL_DISTANCE both ways are grouped together and share space for
3c9a024fde58b0 Tejun Heo              2010-09-09  2829   * units in the same group.  The returned configuration is guaranteed
3c9a024fde58b0 Tejun Heo              2010-09-09  2830   * to have CPUs on different nodes on different groups and >=75% usage
3c9a024fde58b0 Tejun Heo              2010-09-09  2831   * of allocated virtual address space.
3c9a024fde58b0 Tejun Heo              2010-09-09  2832   *
3c9a024fde58b0 Tejun Heo              2010-09-09  2833   * RETURNS:
3c9a024fde58b0 Tejun Heo              2010-09-09  2834   * On success, pointer to the new allocation_info is returned.  On
3c9a024fde58b0 Tejun Heo              2010-09-09  2835   * failure, ERR_PTR value is returned.
3c9a024fde58b0 Tejun Heo              2010-09-09  2836   */
258e0815e2b170 Dennis Zhou            2021-02-14  2837  static struct pcpu_alloc_info * __init __flatten pcpu_build_alloc_info(
3c9a024fde58b0 Tejun Heo              2010-09-09  2838  				size_t reserved_size, size_t dyn_size,
3c9a024fde58b0 Tejun Heo              2010-09-09  2839  				size_t atom_size,
3c9a024fde58b0 Tejun Heo              2010-09-09  2840  				pcpu_fc_cpu_distance_fn_t cpu_distance_fn)
3c9a024fde58b0 Tejun Heo              2010-09-09  2841  {
3c9a024fde58b0 Tejun Heo              2010-09-09  2842  	static int group_map[NR_CPUS] __initdata;
3c9a024fde58b0 Tejun Heo              2010-09-09  2843  	static int group_cnt[NR_CPUS] __initdata;
d7d29ac76f7efb Wonhyuk Yang           2020-10-30  2844  	static struct cpumask mask __initdata;
3c9a024fde58b0 Tejun Heo              2010-09-09  2845  	const size_t static_size = __per_cpu_end - __per_cpu_start;
3c9a024fde58b0 Tejun Heo              2010-09-09  2846  	int nr_groups = 1, nr_units = 0;
3c9a024fde58b0 Tejun Heo              2010-09-09  2847  	size_t size_sum, min_unit_size, alloc_size;
3f649ab728cda8 Kees Cook              2020-06-03  2848  	int upa, max_upa, best_upa;	/* units_per_alloc */
3c9a024fde58b0 Tejun Heo              2010-09-09  2849  	int last_allocs, group, unit;
3c9a024fde58b0 Tejun Heo              2010-09-09  2850  	unsigned int cpu, tcpu;
3c9a024fde58b0 Tejun Heo              2010-09-09  2851  	struct pcpu_alloc_info *ai;
3c9a024fde58b0 Tejun Heo              2010-09-09  2852  	unsigned int *cpu_map;
3c9a024fde58b0 Tejun Heo              2010-09-09  2853  
3c9a024fde58b0 Tejun Heo              2010-09-09  2854  	/* this function may be called multiple times */
3c9a024fde58b0 Tejun Heo              2010-09-09  2855  	memset(group_map, 0, sizeof(group_map));
3c9a024fde58b0 Tejun Heo              2010-09-09  2856  	memset(group_cnt, 0, sizeof(group_cnt));
d7d29ac76f7efb Wonhyuk Yang           2020-10-30  2857  	cpumask_clear(&mask);
3c9a024fde58b0 Tejun Heo              2010-09-09  2858  
3c9a024fde58b0 Tejun Heo              2010-09-09  2859  	/* calculate size_sum and ensure dyn_size is enough for early alloc */
3c9a024fde58b0 Tejun Heo              2010-09-09  2860  	size_sum = PFN_ALIGN(static_size + reserved_size +
3c9a024fde58b0 Tejun Heo              2010-09-09  2861  			    max_t(size_t, dyn_size, PERCPU_DYNAMIC_EARLY_SIZE));
3c9a024fde58b0 Tejun Heo              2010-09-09  2862  	dyn_size = size_sum - static_size - reserved_size;
3c9a024fde58b0 Tejun Heo              2010-09-09  2863  
3c9a024fde58b0 Tejun Heo              2010-09-09  2864  	/*
3c9a024fde58b0 Tejun Heo              2010-09-09  2865  	 * Determine min_unit_size, alloc_size and max_upa such that
3c9a024fde58b0 Tejun Heo              2010-09-09  2866  	 * alloc_size is multiple of atom_size and is the smallest
25985edcedea63 Lucas De Marchi        2011-03-30  2867  	 * which can accommodate 4k aligned segments which are equal to
3c9a024fde58b0 Tejun Heo              2010-09-09  2868  	 * or larger than min_unit_size.
3c9a024fde58b0 Tejun Heo              2010-09-09  2869  	 */
3c9a024fde58b0 Tejun Heo              2010-09-09  2870  	min_unit_size = max_t(size_t, size_sum, PCPU_MIN_UNIT_SIZE);
3c9a024fde58b0 Tejun Heo              2010-09-09  2871  
9c01516278ef87 Dennis Zhou (Facebook  2017-07-15  2872) 	/* determine the maximum # of units that can fit in an allocation */
3c9a024fde58b0 Tejun Heo              2010-09-09  2873  	alloc_size = roundup(min_unit_size, atom_size);
3c9a024fde58b0 Tejun Heo              2010-09-09  2874  	upa = alloc_size / min_unit_size;
f09f1243ca2d5d Alexander Kuleshov     2015-11-05  2875  	while (alloc_size % upa || (offset_in_page(alloc_size / upa)))
3c9a024fde58b0 Tejun Heo              2010-09-09  2876  		upa--;
3c9a024fde58b0 Tejun Heo              2010-09-09  2877  	max_upa = upa;
3c9a024fde58b0 Tejun Heo              2010-09-09  2878  
d7d29ac76f7efb Wonhyuk Yang           2020-10-30  2879  	cpumask_copy(&mask, cpu_possible_mask);
d7d29ac76f7efb Wonhyuk Yang           2020-10-30  2880  
3c9a024fde58b0 Tejun Heo              2010-09-09  2881  	/* group cpus according to their proximity */
d7d29ac76f7efb Wonhyuk Yang           2020-10-30  2882  	for (group = 0; !cpumask_empty(&mask); group++) {
d7d29ac76f7efb Wonhyuk Yang           2020-10-30  2883  		/* pop the group's first cpu */
d7d29ac76f7efb Wonhyuk Yang           2020-10-30  2884  		cpu = cpumask_first(&mask);
3c9a024fde58b0 Tejun Heo              2010-09-09 @2885  		group_map[cpu] = group;
3c9a024fde58b0 Tejun Heo              2010-09-09  2886  		group_cnt[group]++;
d7d29ac76f7efb Wonhyuk Yang           2020-10-30  2887  		cpumask_clear_cpu(cpu, &mask);
d7d29ac76f7efb Wonhyuk Yang           2020-10-30  2888  
d7d29ac76f7efb Wonhyuk Yang           2020-10-30  2889  		for_each_cpu(tcpu, &mask) {
d7d29ac76f7efb Wonhyuk Yang           2020-10-30  2890  			if (!cpu_distance_fn ||
d7d29ac76f7efb Wonhyuk Yang           2020-10-30  2891  			    (cpu_distance_fn(cpu, tcpu) == LOCAL_DISTANCE &&
d7d29ac76f7efb Wonhyuk Yang           2020-10-30  2892  			     cpu_distance_fn(tcpu, cpu) == LOCAL_DISTANCE)) {
d7d29ac76f7efb Wonhyuk Yang           2020-10-30  2893  				group_map[tcpu] = group;
d7d29ac76f7efb Wonhyuk Yang           2020-10-30  2894  				group_cnt[group]++;
d7d29ac76f7efb Wonhyuk Yang           2020-10-30  2895  				cpumask_clear_cpu(tcpu, &mask);
d7d29ac76f7efb Wonhyuk Yang           2020-10-30  2896  			}
d7d29ac76f7efb Wonhyuk Yang           2020-10-30  2897  		}
3c9a024fde58b0 Tejun Heo              2010-09-09  2898  	}
d7d29ac76f7efb Wonhyuk Yang           2020-10-30  2899  	nr_groups = group;
3c9a024fde58b0 Tejun Heo              2010-09-09  2900  
3c9a024fde58b0 Tejun Heo              2010-09-09  2901  	/*
9c01516278ef87 Dennis Zhou (Facebook  2017-07-15  2902) 	 * Wasted space is caused by a ratio imbalance of upa to group_cnt.
9c01516278ef87 Dennis Zhou (Facebook  2017-07-15  2903) 	 * Expand the unit_size until we use >= 75% of the units allocated.
9c01516278ef87 Dennis Zhou (Facebook  2017-07-15  2904) 	 * Related to atom_size, which could be much larger than the unit_size.
3c9a024fde58b0 Tejun Heo              2010-09-09  2905  	 */
3c9a024fde58b0 Tejun Heo              2010-09-09  2906  	last_allocs = INT_MAX;
4829c791b22f98 Dennis Zhou            2021-06-14  2907  	best_upa = 0;
3c9a024fde58b0 Tejun Heo              2010-09-09  2908  	for (upa = max_upa; upa; upa--) {
3c9a024fde58b0 Tejun Heo              2010-09-09  2909  		int allocs = 0, wasted = 0;
3c9a024fde58b0 Tejun Heo              2010-09-09  2910  
f09f1243ca2d5d Alexander Kuleshov     2015-11-05  2911  		if (alloc_size % upa || (offset_in_page(alloc_size / upa)))
3c9a024fde58b0 Tejun Heo              2010-09-09  2912  			continue;
3c9a024fde58b0 Tejun Heo              2010-09-09  2913  
3c9a024fde58b0 Tejun Heo              2010-09-09  2914  		for (group = 0; group < nr_groups; group++) {
3c9a024fde58b0 Tejun Heo              2010-09-09  2915  			int this_allocs = DIV_ROUND_UP(group_cnt[group], upa);
3c9a024fde58b0 Tejun Heo              2010-09-09  2916  			allocs += this_allocs;
3c9a024fde58b0 Tejun Heo              2010-09-09  2917  			wasted += this_allocs * upa - group_cnt[group];
3c9a024fde58b0 Tejun Heo              2010-09-09  2918  		}
3c9a024fde58b0 Tejun Heo              2010-09-09  2919  
3c9a024fde58b0 Tejun Heo              2010-09-09  2920  		/*
3c9a024fde58b0 Tejun Heo              2010-09-09  2921  		 * Don't accept if wastage is over 1/3.  The
3c9a024fde58b0 Tejun Heo              2010-09-09  2922  		 * greater-than comparison ensures upa==1 always
3c9a024fde58b0 Tejun Heo              2010-09-09  2923  		 * passes the following check.
3c9a024fde58b0 Tejun Heo              2010-09-09  2924  		 */
3c9a024fde58b0 Tejun Heo              2010-09-09  2925  		if (wasted > num_possible_cpus() / 3)
3c9a024fde58b0 Tejun Heo              2010-09-09  2926  			continue;
3c9a024fde58b0 Tejun Heo              2010-09-09  2927  
3c9a024fde58b0 Tejun Heo              2010-09-09  2928  		/* and then don't consume more memory */
3c9a024fde58b0 Tejun Heo              2010-09-09  2929  		if (allocs > last_allocs)
3c9a024fde58b0 Tejun Heo              2010-09-09  2930  			break;
3c9a024fde58b0 Tejun Heo              2010-09-09  2931  		last_allocs = allocs;
3c9a024fde58b0 Tejun Heo              2010-09-09  2932  		best_upa = upa;
3c9a024fde58b0 Tejun Heo              2010-09-09  2933  	}
4829c791b22f98 Dennis Zhou            2021-06-14  2934  	BUG_ON(!best_upa);
3c9a024fde58b0 Tejun Heo              2010-09-09  2935  	upa = best_upa;
3c9a024fde58b0 Tejun Heo              2010-09-09  2936  
3c9a024fde58b0 Tejun Heo              2010-09-09  2937  	/* allocate and fill alloc_info */
3c9a024fde58b0 Tejun Heo              2010-09-09  2938  	for (group = 0; group < nr_groups; group++)
3c9a024fde58b0 Tejun Heo              2010-09-09  2939  		nr_units += roundup(group_cnt[group], upa);
3c9a024fde58b0 Tejun Heo              2010-09-09  2940  
3c9a024fde58b0 Tejun Heo              2010-09-09  2941  	ai = pcpu_alloc_alloc_info(nr_groups, nr_units);
3c9a024fde58b0 Tejun Heo              2010-09-09  2942  	if (!ai)
3c9a024fde58b0 Tejun Heo              2010-09-09  2943  		return ERR_PTR(-ENOMEM);
3c9a024fde58b0 Tejun Heo              2010-09-09  2944  	cpu_map = ai->groups[0].cpu_map;
3c9a024fde58b0 Tejun Heo              2010-09-09  2945  
3c9a024fde58b0 Tejun Heo              2010-09-09  2946  	for (group = 0; group < nr_groups; group++) {
3c9a024fde58b0 Tejun Heo              2010-09-09  2947  		ai->groups[group].cpu_map = cpu_map;
3c9a024fde58b0 Tejun Heo              2010-09-09  2948  		cpu_map += roundup(group_cnt[group], upa);
3c9a024fde58b0 Tejun Heo              2010-09-09  2949  	}
3c9a024fde58b0 Tejun Heo              2010-09-09  2950  
3c9a024fde58b0 Tejun Heo              2010-09-09  2951  	ai->static_size = static_size;
3c9a024fde58b0 Tejun Heo              2010-09-09  2952  	ai->reserved_size = reserved_size;
3c9a024fde58b0 Tejun Heo              2010-09-09  2953  	ai->dyn_size = dyn_size;
3c9a024fde58b0 Tejun Heo              2010-09-09  2954  	ai->unit_size = alloc_size / upa;
3c9a024fde58b0 Tejun Heo              2010-09-09  2955  	ai->atom_size = atom_size;
3c9a024fde58b0 Tejun Heo              2010-09-09  2956  	ai->alloc_size = alloc_size;
3c9a024fde58b0 Tejun Heo              2010-09-09  2957  
2de7852fe9096e Peng Fan               2019-02-20  2958  	for (group = 0, unit = 0; group < nr_groups; group++) {
3c9a024fde58b0 Tejun Heo              2010-09-09  2959  		struct pcpu_group_info *gi = &ai->groups[group];
3c9a024fde58b0 Tejun Heo              2010-09-09  2960  
3c9a024fde58b0 Tejun Heo              2010-09-09  2961  		/*
3c9a024fde58b0 Tejun Heo              2010-09-09  2962  		 * Initialize base_offset as if all groups are located
3c9a024fde58b0 Tejun Heo              2010-09-09  2963  		 * back-to-back.  The caller should update this to
3c9a024fde58b0 Tejun Heo              2010-09-09  2964  		 * reflect actual allocation.
3c9a024fde58b0 Tejun Heo              2010-09-09  2965  		 */
3c9a024fde58b0 Tejun Heo              2010-09-09  2966  		gi->base_offset = unit * ai->unit_size;
3c9a024fde58b0 Tejun Heo              2010-09-09  2967  
3c9a024fde58b0 Tejun Heo              2010-09-09  2968  		for_each_possible_cpu(cpu)
3c9a024fde58b0 Tejun Heo              2010-09-09  2969  			if (group_map[cpu] == group)
3c9a024fde58b0 Tejun Heo              2010-09-09  2970  				gi->cpu_map[gi->nr_units++] = cpu;
3c9a024fde58b0 Tejun Heo              2010-09-09  2971  		gi->nr_units = roundup(gi->nr_units, upa);
3c9a024fde58b0 Tejun Heo              2010-09-09  2972  		unit += gi->nr_units;
3c9a024fde58b0 Tejun Heo              2010-09-09  2973  	}
3c9a024fde58b0 Tejun Heo              2010-09-09  2974  	BUG_ON(unit != nr_units);
3c9a024fde58b0 Tejun Heo              2010-09-09  2975  
3c9a024fde58b0 Tejun Heo              2010-09-09  2976  	return ai;
3c9a024fde58b0 Tejun Heo              2010-09-09  2977  }
23f917169ef157 Kefeng Wang            2022-01-19  2978  

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki




[Index of Archives]     [Linux Ext4 Filesystem]     [Union Filesystem]     [Filesystem Testing]     [Ceph Users]     [Ecryptfs]     [NTFS 3]     [AutoFS]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux Cachefs]     [Reiser Filesystem]     [Linux RAID]     [NTFS 3]     [Samba]     [Device Mapper]     [CEPH Development]

  Powered by Linux