Hi Menglong,

kernel test robot noticed the following build warnings:

[auto build test WARNING on bpf-next/master]

url:    
https://github.com/intel-lab-lkp/linux/commits/Menglong-Dong/add-function-metadata-support/20250226-202312
base:   https://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next.git master
patch link:    
https://lore.kernel.org/r/20250226121537.752241-1-dongml2%40chinatelecom.cn
patch subject: [PATCH bpf-next v2] add function metadata support
config: i386-randconfig-062-20250227 
(https://download.01.org/0day-ci/archive/20250228/[email protected]/config)
compiler: clang version 19.1.7 (https://github.com/llvm/llvm-project 
cd708029e0b2869e80abe31ddb175f7c35361f90)
reproduce (this is a W=1 build): 
(https://download.01.org/0day-ci/archive/20250228/[email protected]/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 <[email protected]>
| Closes: 
https://lore.kernel.org/oe-kbuild-all/[email protected]/

sparse warnings: (new ones prefixed by >>)
   kernel/trace/kfunc_md.c:12:23: sparse: sparse: symbol 'kfunc_mds' redeclared 
with different type (different address spaces):
   kernel/trace/kfunc_md.c:12:23: sparse:    struct kfunc_md [noderef] __rcu 
*[addressable] [toplevel] kfunc_mds
   kernel/trace/kfunc_md.c: note: in included file:
   include/linux/kfunc_md.h:16:24: sparse: note: previously declared as:
   include/linux/kfunc_md.h:16:24: sparse:    struct kfunc_md *extern 
[addressable] [toplevel] kfunc_mds
   kernel/trace/kfunc_md.c:186:20: sparse: sparse: incorrect type in assignment 
(different address spaces) @@     expected struct kfunc_md *md @@     got 
struct kfunc_md [noderef] __rcu * @@
   kernel/trace/kfunc_md.c:186:20: sparse:     expected struct kfunc_md *md
   kernel/trace/kfunc_md.c:186:20: sparse:     got struct kfunc_md [noderef] 
__rcu *
>> kernel/trace/kfunc_md.c:98:25: sparse: sparse: non size-preserving pointer 
>> to integer cast

vim +98 kernel/trace/kfunc_md.c

    10  
    11  static u32 kfunc_md_count = ENTRIES_PER_PAGE, kfunc_md_used;
  > 12  struct kfunc_md __rcu *kfunc_mds;
    13  EXPORT_SYMBOL_GPL(kfunc_mds);
    14  
    15  static DEFINE_MUTEX(kfunc_md_mutex);
    16  
    17  
    18  void kfunc_md_unlock(void)
    19  {
    20          mutex_unlock(&kfunc_md_mutex);
    21  }
    22  EXPORT_SYMBOL_GPL(kfunc_md_unlock);
    23  
    24  void kfunc_md_lock(void)
    25  {
    26          mutex_lock(&kfunc_md_mutex);
    27  }
    28  EXPORT_SYMBOL_GPL(kfunc_md_lock);
    29  
    30  static u32 kfunc_md_get_index(void *ip)
    31  {
    32          return *(u32 *)(ip - KFUNC_MD_DATA_OFFSET);
    33  }
    34  
    35  static void kfunc_md_init(struct kfunc_md *mds, u32 start, u32 end)
    36  {
    37          u32 i;
    38  
    39          for (i = start; i < end; i++)
    40                  mds[i].users = 0;
    41  }
    42  
    43  static int kfunc_md_page_order(void)
    44  {
    45          return fls(DIV_ROUND_UP(kfunc_md_count, ENTRIES_PER_PAGE)) - 1;
    46  }
    47  
    48  /* Get next usable function metadata. On success, return the usable
    49   * kfunc_md and store the index of it to *index. If no usable kfunc_md 
is
    50   * found in kfunc_mds, a larger array will be allocated.
    51   */
    52  static struct kfunc_md *kfunc_md_get_next(u32 *index)
    53  {
    54          struct kfunc_md *new_mds, *mds;
    55          u32 i, order;
    56  
    57          mds = rcu_dereference(kfunc_mds);
    58          if (mds == NULL) {
    59                  order = kfunc_md_page_order();
    60                  new_mds = (void *)__get_free_pages(GFP_KERNEL, order);
    61                  if (!new_mds)
    62                          return NULL;
    63                  kfunc_md_init(new_mds, 0, kfunc_md_count);
    64                  /* The first time to initialize kfunc_mds, so it is not
    65                   * used anywhere yet, and we can update it directly.
    66                   */
    67                  rcu_assign_pointer(kfunc_mds, new_mds);
    68                  mds = new_mds;
    69          }
    70  
    71          if (likely(kfunc_md_used < kfunc_md_count)) {
    72                  /* maybe we can manage the used function metadata entry
    73                   * with a bit map ?
    74                   */
    75                  for (i = 0; i < kfunc_md_count; i++) {
    76                          if (!mds[i].users) {
    77                                  kfunc_md_used++;
    78                                  *index = i;
    79                                  mds[i].users++;
    80                                  return mds + i;
    81                          }
    82                  }
    83          }
    84  
    85          order = kfunc_md_page_order();
    86          /* no available function metadata, so allocate a bigger function
    87           * metadata array.
    88           */
    89          new_mds = (void *)__get_free_pages(GFP_KERNEL, order + 1);
    90          if (!new_mds)
    91                  return NULL;
    92  
    93          memcpy(new_mds, mds, kfunc_md_count * sizeof(*new_mds));
    94          kfunc_md_init(new_mds, kfunc_md_count, kfunc_md_count * 2);
    95  
    96          rcu_assign_pointer(kfunc_mds, new_mds);
    97          synchronize_rcu();
  > 98          free_pages((u64)mds, order);
    99  
   100          mds = new_mds + kfunc_md_count;
   101          *index = kfunc_md_count;
   102          kfunc_md_count <<= 1;
   103          kfunc_md_used++;
   104          mds->users++;
   105  
   106          return mds;
   107  }
   108  

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

Reply via email to