Re: kernel/bpf/cpumask.c:41:21: warning: no previous declaration for 'bpf_cpumask_create'

From: David Vernet
Date: Wed Aug 16 2023 - 10:08:51 EST


On Wed, Aug 16, 2023 at 09:25:30PM +0800, kernel test robot wrote:
> tree: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master
> head: 4853c74bd7ab7fdb83f319bd9ace8a08c031e9b6
> commit: 516f4d3397c9e90f4da04f59986c856016269aa1 bpf: Enable cpumasks to be queried and used as kptrs
> date: 7 months ago
> config: x86_64-randconfig-x076-20230816 (https://download.01.org/0day-ci/archive/20230816/202308162115.Hn23vv3n-lkp@xxxxxxxxx/config)
> compiler: gcc-7 (Ubuntu 7.5.0-6ubuntu2) 7.5.0
> reproduce: (https://download.01.org/0day-ci/archive/20230816/202308162115.Hn23vv3n-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/202308162115.Hn23vv3n-lkp@xxxxxxxxx/
>
> All warnings (new ones prefixed by >>):
>
> >> kernel/bpf/cpumask.c:41:21: warning: no previous declaration for 'bpf_cpumask_create' [-Wmissing-declarations]
> struct bpf_cpumask *bpf_cpumask_create(void)

Meh, more noise from lkp because of kfuncs. It would be nice if as a
courtesy, these warnings were fixed before they got turned on and the
email list got spammed 7 months after the commit landed; especially
given that this is essentially redundant with -Wmissing-prototypes.

Anyways, the solution here is to just add the following around all
kfuncs that already have -Wmissing-prototypes disabled:

__diag_push();
__diag_ignore_all("-Wmissing-declarations",
"Global kfuncs as their definitions will be in BTF");

I'll send out a patch that adds this around all kfuncs so we can avoid
all of these warnings in one go.

> ^~~~~~~~~~~~~~~~~~
> >> kernel/bpf/cpumask.c:55:21: warning: no previous declaration for 'bpf_cpumask_acquire' [-Wmissing-declarations]
> struct bpf_cpumask *bpf_cpumask_acquire(struct bpf_cpumask *cpumask)
> ^~~~~~~~~~~~~~~~~~~
> kernel/bpf/cpumask.c:61:21: warning: no previous declaration for 'bpf_cpumask_kptr_get' [-Wmissing-declarations]
> struct bpf_cpumask *bpf_cpumask_kptr_get(struct bpf_cpumask **cpumaskp)
> ^~~~~~~~~~~~~~~~~~~~
> >> kernel/bpf/cpumask.c:79:6: warning: no previous declaration for 'bpf_cpumask_release' [-Wmissing-declarations]
> void bpf_cpumask_release(struct bpf_cpumask *cpumask)
> ^~~~~~~~~~~~~~~~~~~
> >> kernel/bpf/cpumask.c:91:5: warning: no previous declaration for 'bpf_cpumask_first' [-Wmissing-declarations]
> u32 bpf_cpumask_first(const struct cpumask *cpumask)
> ^~~~~~~~~~~~~~~~~
> >> kernel/bpf/cpumask.c:96:5: warning: no previous declaration for 'bpf_cpumask_first_zero' [-Wmissing-declarations]
> u32 bpf_cpumask_first_zero(const struct cpumask *cpumask)
> ^~~~~~~~~~~~~~~~~~~~~~
> >> kernel/bpf/cpumask.c:101:6: warning: no previous declaration for 'bpf_cpumask_set_cpu' [-Wmissing-declarations]
> void bpf_cpumask_set_cpu(u32 cpu, struct bpf_cpumask *cpumask)
> ^~~~~~~~~~~~~~~~~~~
> >> kernel/bpf/cpumask.c:109:6: warning: no previous declaration for 'bpf_cpumask_clear_cpu' [-Wmissing-declarations]
> void bpf_cpumask_clear_cpu(u32 cpu, struct bpf_cpumask *cpumask)
> ^~~~~~~~~~~~~~~~~~~~~
> >> kernel/bpf/cpumask.c:117:6: warning: no previous declaration for 'bpf_cpumask_test_cpu' [-Wmissing-declarations]
> bool bpf_cpumask_test_cpu(u32 cpu, const struct cpumask *cpumask)
> ^~~~~~~~~~~~~~~~~~~~
> >> kernel/bpf/cpumask.c:125:6: warning: no previous declaration for 'bpf_cpumask_test_and_set_cpu' [-Wmissing-declarations]
> bool bpf_cpumask_test_and_set_cpu(u32 cpu, struct bpf_cpumask *cpumask)
> ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
> >> kernel/bpf/cpumask.c:133:6: warning: no previous declaration for 'bpf_cpumask_test_and_clear_cpu' [-Wmissing-declarations]
> bool bpf_cpumask_test_and_clear_cpu(u32 cpu, struct bpf_cpumask *cpumask)
> ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> >> kernel/bpf/cpumask.c:141:6: warning: no previous declaration for 'bpf_cpumask_setall' [-Wmissing-declarations]
> void bpf_cpumask_setall(struct bpf_cpumask *cpumask)
> ^~~~~~~~~~~~~~~~~~
> >> kernel/bpf/cpumask.c:146:6: warning: no previous declaration for 'bpf_cpumask_clear' [-Wmissing-declarations]
> void bpf_cpumask_clear(struct bpf_cpumask *cpumask)
> ^~~~~~~~~~~~~~~~~
> >> kernel/bpf/cpumask.c:151:6: warning: no previous declaration for 'bpf_cpumask_and' [-Wmissing-declarations]
> bool bpf_cpumask_and(struct bpf_cpumask *dst,
> ^~~~~~~~~~~~~~~
> >> kernel/bpf/cpumask.c:158:6: warning: no previous declaration for 'bpf_cpumask_or' [-Wmissing-declarations]
> void bpf_cpumask_or(struct bpf_cpumask *dst,
> ^~~~~~~~~~~~~~
> >> kernel/bpf/cpumask.c:165:6: warning: no previous declaration for 'bpf_cpumask_xor' [-Wmissing-declarations]
> void bpf_cpumask_xor(struct bpf_cpumask *dst,
> ^~~~~~~~~~~~~~~
> >> kernel/bpf/cpumask.c:172:6: warning: no previous declaration for 'bpf_cpumask_equal' [-Wmissing-declarations]
> bool bpf_cpumask_equal(const struct cpumask *src1, const struct cpumask *src2)
> ^~~~~~~~~~~~~~~~~
> >> kernel/bpf/cpumask.c:177:6: warning: no previous declaration for 'bpf_cpumask_intersects' [-Wmissing-declarations]
> bool bpf_cpumask_intersects(const struct cpumask *src1, const struct cpumask *src2)
> ^~~~~~~~~~~~~~~~~~~~~~
> >> kernel/bpf/cpumask.c:182:6: warning: no previous declaration for 'bpf_cpumask_subset' [-Wmissing-declarations]
> bool bpf_cpumask_subset(const struct cpumask *src1, const struct cpumask *src2)
> ^~~~~~~~~~~~~~~~~~
> >> kernel/bpf/cpumask.c:187:6: warning: no previous declaration for 'bpf_cpumask_empty' [-Wmissing-declarations]
> bool bpf_cpumask_empty(const struct cpumask *cpumask)
> ^~~~~~~~~~~~~~~~~
> >> kernel/bpf/cpumask.c:192:6: warning: no previous declaration for 'bpf_cpumask_full' [-Wmissing-declarations]
> bool bpf_cpumask_full(const struct cpumask *cpumask)
> ^~~~~~~~~~~~~~~~
> kernel/bpf/cpumask.c:197:6: warning: no previous declaration for 'bpf_cpumask_copy' [-Wmissing-declarations]
> void bpf_cpumask_copy(struct bpf_cpumask *dst, const struct cpumask *src)
> ^~~~~~~~~~~~~~~~
> kernel/bpf/cpumask.c:202:5: warning: no previous declaration for 'bpf_cpumask_any' [-Wmissing-declarations]
> u32 bpf_cpumask_any(const struct cpumask *cpumask)
> ^~~~~~~~~~~~~~~
> kernel/bpf/cpumask.c:207:5: warning: no previous declaration for 'bpf_cpumask_any_and' [-Wmissing-declarations]
> u32 bpf_cpumask_any_and(const struct cpumask *src1, const struct cpumask *src2)
> ^~~~~~~~~~~~~~~~~~~
>
>
> vim +/bpf_cpumask_create +41 kernel/bpf/cpumask.c
>
> 36
> 37 __diag_push();
> 38 __diag_ignore_all("-Wmissing-prototypes",
> 39 "Global kfuncs as their definitions will be in BTF");
> 40
> > 41 struct bpf_cpumask *bpf_cpumask_create(void)
> 42 {
> 43 struct bpf_cpumask *cpumask;
> 44
> 45 cpumask = bpf_mem_alloc(&bpf_cpumask_ma, sizeof(*cpumask));
> 46 if (!cpumask)
> 47 return NULL;
> 48
> 49 memset(cpumask, 0, sizeof(*cpumask));
> 50 refcount_set(&cpumask->usage, 1);
> 51
> 52 return cpumask;
> 53 }
> 54
> > 55 struct bpf_cpumask *bpf_cpumask_acquire(struct bpf_cpumask *cpumask)
> 56 {
> 57 refcount_inc(&cpumask->usage);
> 58 return cpumask;
> 59 }
> 60
> > 61 struct bpf_cpumask *bpf_cpumask_kptr_get(struct bpf_cpumask **cpumaskp)
> 62 {
> 63 struct bpf_cpumask *cpumask;
> 64
> 65 /* The BPF memory allocator frees memory backing its caches in an RCU
> 66 * callback. Thus, we can safely use RCU to ensure that the cpumask is
> 67 * safe to read.
> 68 */
> 69 rcu_read_lock();
> 70
> 71 cpumask = READ_ONCE(*cpumaskp);
> 72 if (cpumask && !refcount_inc_not_zero(&cpumask->usage))
> 73 cpumask = NULL;
> 74
> 75 rcu_read_unlock();
> 76 return cpumask;
> 77 }
> 78
> > 79 void bpf_cpumask_release(struct bpf_cpumask *cpumask)
> 80 {
> 81 if (!cpumask)
> 82 return;
> 83
> 84 if (refcount_dec_and_test(&cpumask->usage)) {
> 85 migrate_disable();
> 86 bpf_mem_free(&bpf_cpumask_ma, cpumask);
> 87 migrate_enable();
> 88 }
> 89 }
> 90
> > 91 u32 bpf_cpumask_first(const struct cpumask *cpumask)
> 92 {
> 93 return cpumask_first(cpumask);
> 94 }
> 95
> > 96 u32 bpf_cpumask_first_zero(const struct cpumask *cpumask)
> 97 {
> 98 return cpumask_first_zero(cpumask);
> 99 }
> 100
> > 101 void bpf_cpumask_set_cpu(u32 cpu, struct bpf_cpumask *cpumask)
> 102 {
> 103 if (!cpu_valid(cpu))
> 104 return;
> 105
> 106 cpumask_set_cpu(cpu, (struct cpumask *)cpumask);
> 107 }
> 108
> > 109 void bpf_cpumask_clear_cpu(u32 cpu, struct bpf_cpumask *cpumask)
> 110 {
> 111 if (!cpu_valid(cpu))
> 112 return;
> 113
> 114 cpumask_clear_cpu(cpu, (struct cpumask *)cpumask);
> 115 }
> 116
> > 117 bool bpf_cpumask_test_cpu(u32 cpu, const struct cpumask *cpumask)
> 118 {
> 119 if (!cpu_valid(cpu))
> 120 return false;
> 121
> 122 return cpumask_test_cpu(cpu, (struct cpumask *)cpumask);
> 123 }
> 124
> > 125 bool bpf_cpumask_test_and_set_cpu(u32 cpu, struct bpf_cpumask *cpumask)
> 126 {
> 127 if (!cpu_valid(cpu))
> 128 return false;
> 129
> 130 return cpumask_test_and_set_cpu(cpu, (struct cpumask *)cpumask);
> 131 }
> 132
> > 133 bool bpf_cpumask_test_and_clear_cpu(u32 cpu, struct bpf_cpumask *cpumask)
> 134 {
> 135 if (!cpu_valid(cpu))
> 136 return false;
> 137
> 138 return cpumask_test_and_clear_cpu(cpu, (struct cpumask *)cpumask);
> 139 }
> 140
> > 141 void bpf_cpumask_setall(struct bpf_cpumask *cpumask)
> 142 {
> 143 cpumask_setall((struct cpumask *)cpumask);
> 144 }
> 145
> > 146 void bpf_cpumask_clear(struct bpf_cpumask *cpumask)
> 147 {
> 148 cpumask_clear((struct cpumask *)cpumask);
> 149 }
> 150
> > 151 bool bpf_cpumask_and(struct bpf_cpumask *dst,
> 152 const struct cpumask *src1,
> 153 const struct cpumask *src2)
> 154 {
> 155 return cpumask_and((struct cpumask *)dst, src1, src2);
> 156 }
> 157
> > 158 void bpf_cpumask_or(struct bpf_cpumask *dst,
> 159 const struct cpumask *src1,
> 160 const struct cpumask *src2)
> 161 {
> 162 cpumask_or((struct cpumask *)dst, src1, src2);
> 163 }
> 164
> > 165 void bpf_cpumask_xor(struct bpf_cpumask *dst,
> 166 const struct cpumask *src1,
> 167 const struct cpumask *src2)
> 168 {
> 169 cpumask_xor((struct cpumask *)dst, src1, src2);
> 170 }
> 171
> > 172 bool bpf_cpumask_equal(const struct cpumask *src1, const struct cpumask *src2)
> 173 {
> 174 return cpumask_equal(src1, src2);
> 175 }
> 176
> > 177 bool bpf_cpumask_intersects(const struct cpumask *src1, const struct cpumask *src2)
> 178 {
> 179 return cpumask_intersects(src1, src2);
> 180 }
> 181
> > 182 bool bpf_cpumask_subset(const struct cpumask *src1, const struct cpumask *src2)
> 183 {
> 184 return cpumask_subset(src1, src2);
> 185 }
> 186
> > 187 bool bpf_cpumask_empty(const struct cpumask *cpumask)
> 188 {
> 189 return cpumask_empty(cpumask);
> 190 }
> 191
> > 192 bool bpf_cpumask_full(const struct cpumask *cpumask)
> 193 {
> 194 return cpumask_full(cpumask);
> 195 }
> 196
> > 197 void bpf_cpumask_copy(struct bpf_cpumask *dst, const struct cpumask *src)
> 198 {
> 199 cpumask_copy((struct cpumask *)dst, src);
> 200 }
> 201
>
> --
> 0-DAY CI Kernel Test Service
> https://github.com/intel/lkp-tests/wiki