[jolsa-perf:bpf/tramp_29 26/32] kernel/bpf/syscall.c:3137:15: error: call to undeclared function 'bpf_trampoline_multi_detach'; ISO C99 and later do not support implicit function declarations

From: kernel test robot
Date: Mon Jul 11 2022 - 18:02:51 EST


tree: https://git.kernel.org/pub/scm/linux/kernel/git/jolsa/perf.git bpf/tramp_29
head: ec522c20e55e48f561146afbb81513e20870ee12
commit: 75c50c5a148820bf4b1fafa3fb834bbfaeccc6c2 [26/32] bpf: Add support for tracing multi link
config: x86_64-randconfig-a001 (https://download.01.org/0day-ci/archive/20220712/202207120523.yVSHsCLv-lkp@xxxxxxxxx/config)
compiler: clang version 15.0.0 (https://github.com/llvm/llvm-project badda4ac3c489a8c8cccdad1f74b9308c350a9e0)
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://git.kernel.org/pub/scm/linux/kernel/git/jolsa/perf.git/commit/?id=75c50c5a148820bf4b1fafa3fb834bbfaeccc6c2
git remote add jolsa-perf https://git.kernel.org/pub/scm/linux/kernel/git/jolsa/perf.git
git fetch --no-tags jolsa-perf bpf/tramp_29
git checkout 75c50c5a148820bf4b1fafa3fb834bbfaeccc6c2
# save the config file
mkdir build_dir && cp config build_dir/.config
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=x86_64 SHELL=/bin/bash

If you fix the issue, kindly add following tag where applicable
Reported-by: kernel test robot <lkp@xxxxxxxxx>

All errors (new ones prefixed by >>):

kernel/bpf/syscall.c:2503:15: error: call to undeclared function 'is_tracing_multi'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
multi_func = is_tracing_multi(attr->expected_attach_type);
^
>> kernel/bpf/syscall.c:3137:15: error: call to undeclared function 'bpf_trampoline_multi_detach'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
WARN_ON_ONCE(bpf_trampoline_multi_detach(&tr_link->tp, tr_link->id));
^
kernel/bpf/syscall.c:3145:2: error: call to undeclared function 'bpf_tramp_id_put'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
bpf_tramp_id_put(tr_link->id);
^
kernel/bpf/syscall.c:3145:2: note: did you mean 'bpf_trampoline_put'?
include/linux/bpf.h:1013:20: note: 'bpf_trampoline_put' declared here
static inline void bpf_trampoline_put(struct bpf_trampoline *tr) {}
^
>> kernel/bpf/syscall.c:3308:7: error: call to undeclared function 'bpf_tramp_id_alloc'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
id = bpf_tramp_id_alloc(cnt);
^
kernel/bpf/syscall.c:3308:5: warning: incompatible integer to pointer conversion assigning to 'struct bpf_tramp_id *' from 'int' [-Wint-conversion]
id = bpf_tramp_id_alloc(cnt);
^ ~~~~~~~~~~~~~~~~~~~~~~~
>> kernel/bpf/syscall.c:3349:8: error: call to undeclared function 'bpf_trampoline_multi_attach'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
err = bpf_trampoline_multi_attach(&link->tp, id);
^
kernel/bpf/syscall.c:3349:8: note: did you mean 'bpf_tracing_multi_attach'?
kernel/bpf/syscall.c:3293:12: note: 'bpf_tracing_multi_attach' declared here
static int bpf_tracing_multi_attach(struct bpf_prog *prog,
^
kernel/bpf/syscall.c:4821:12: error: call to undeclared function 'is_tracing_multi'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
else if (is_tracing_multi(prog->expected_attach_type))
^
1 warning and 6 errors generated.


vim +/bpf_trampoline_multi_detach +3137 kernel/bpf/syscall.c

3131
3132 static void bpf_tracing_multi_link_release(struct bpf_link *link)
3133 {
3134 struct bpf_tracing_multi_link *tr_link =
3135 container_of(link, struct bpf_tracing_multi_link, link);
3136
> 3137 WARN_ON_ONCE(bpf_trampoline_multi_detach(&tr_link->tp, tr_link->id));
3138 }
3139
3140 static void bpf_tracing_multi_link_dealloc(struct bpf_link *link)
3141 {
3142 struct bpf_tracing_multi_link *tr_link =
3143 container_of(link, struct bpf_tracing_multi_link, link);
3144
3145 bpf_tramp_id_put(tr_link->id);
3146 kfree(tr_link);
3147 }
3148
3149 static void bpf_tracing_multi_link_show_fdinfo(const struct bpf_link *link,
3150 struct seq_file *seq)
3151 {
3152 struct bpf_tracing_multi_link *tr_link =
3153 container_of(link, struct bpf_tracing_multi_link, link);
3154
3155 seq_printf(seq, "attach_type:\t%d\n", tr_link->attach_type);
3156 }
3157
3158 static int bpf_tracing_multi_link_fill_link_info(const struct bpf_link *link,
3159 struct bpf_link_info *info)
3160 {
3161 struct bpf_tracing_multi_link *tr_link =
3162 container_of(link, struct bpf_tracing_multi_link, link);
3163
3164 info->tracing.attach_type = tr_link->attach_type;
3165 return 0;
3166 }
3167
3168 static const struct bpf_link_ops bpf_tracing_multi_link_lops = {
3169 .release = bpf_tracing_multi_link_release,
3170 .dealloc = bpf_tracing_multi_link_dealloc,
3171 .show_fdinfo = bpf_tracing_multi_link_show_fdinfo,
3172 .fill_link_info = bpf_tracing_multi_link_fill_link_info,
3173 };
3174
3175 static int check_multi_prog_type(struct bpf_prog *prog)
3176 {
3177 if (prog->expected_attach_type != BPF_TRACE_FENTRY_MULTI &&
3178 prog->expected_attach_type != BPF_TRACE_FEXIT_MULTI)
3179 return -EINVAL;
3180 return 0;
3181 }
3182
3183 static int btf_ids_cmp(const void *a, const void *b)
3184 {
3185 const u32 *x = a;
3186 const u32 *y = b;
3187
3188 if (*x == *y)
3189 return 0;
3190 return *x < *y ? -1 : 1;
3191 }
3192
3193 struct resolve_id {
3194 const char *name;
3195 void *addr;
3196 u32 id;
3197 };
3198
3199 static int rid_name_cmp(const void *a, const void *b)
3200 {
3201 const struct resolve_id *x = a;
3202 const struct resolve_id *y = b;
3203
3204 return strcmp(x->name, y->name);
3205 }
3206
3207 static int rid_id_cmp(const void *a, const void *b)
3208 {
3209 const struct resolve_id *x = a;
3210 const struct resolve_id *y = b;
3211
3212 if (x->id == y->id)
3213 return 0;
3214 return x->id < y->id ? -1 : 1;
3215 }
3216
3217 struct kallsyms_data {
3218 struct resolve_id *rid;
3219 u32 cnt;
3220 u32 found;
3221 };
3222
3223 static int kallsyms_callback(void *data, const char *name,
3224 struct module *mod, unsigned long addr)
3225 {
3226 struct kallsyms_data *args = data;
3227 struct resolve_id *rid, id = {
3228 .name = name,
3229 };
3230
3231 rid = bsearch(&id, args->rid, args->cnt, sizeof(*rid), rid_name_cmp);
3232 if (rid && !rid->addr) {
3233 rid->addr = (void *) addr;
3234 args->found++;
3235 }
3236 return args->found == args->cnt ? 1 : 0;
3237 }
3238
3239 static int bpf_tramp_id_resolve(struct bpf_tramp_id *id, struct bpf_prog *prog)
3240 {
3241 struct kallsyms_data args;
3242 const struct btf_type *t;
3243 struct resolve_id *rid;
3244 const char *name;
3245 struct btf *btf;
3246 int err = 0;
3247 u32 i;
3248
3249 btf = prog->aux->attach_btf;
3250 if (!btf)
3251 return -EINVAL;
3252
3253 rid = kzalloc(id->cnt * sizeof(*rid), GFP_KERNEL);
3254 if (!rid)
3255 return -ENOMEM;
3256
3257 err = -EINVAL;
3258 for (i = 0; i < id->cnt; i++) {
3259 t = btf_type_by_id(btf, id->id[i]);
3260 if (!t)
3261 goto out_free;
3262
3263 name = btf_name_by_offset(btf, t->name_off);
3264 if (!name)
3265 goto out_free;
3266
3267 rid[i].name = name;
3268 rid[i].id = id->id[i];
3269 }
3270
3271 sort(rid, id->cnt, sizeof(*rid), rid_name_cmp, NULL);
3272
3273 args.rid = rid;
3274 args.cnt = id->cnt;
3275 args.found = 0;
3276 kallsyms_on_each_symbol(kallsyms_callback, &args);
3277
3278 sort(rid, id->cnt, sizeof(*rid), rid_id_cmp, NULL);
3279
3280 for (i = 0; i < id->cnt; i++) {
3281 if (!rid[i].addr) {
3282 err = -EINVAL;
3283 goto out_free;
3284 }
3285 id->addr[i] = rid[i].addr;
3286 }
3287 err = 0;
3288 out_free:
3289 kfree(rid);
3290 return err;
3291 }
3292
3293 static int bpf_tracing_multi_attach(struct bpf_prog *prog,
3294 const union bpf_attr *attr)
3295 {
3296 void __user *uids = u64_to_user_ptr(attr->link_create.tracing_multi.btf_ids);
3297 u32 cnt_size, cnt = attr->link_create.tracing_multi.btf_ids_cnt;
3298 struct bpf_tracing_multi_link *link = NULL;
3299 struct bpf_link_primer link_primer;
3300 struct bpf_tramp_id *id = NULL;
3301 int err = -EINVAL;
3302
3303 if (check_multi_prog_type(prog))
3304 return -EINVAL;
3305 if (!cnt || !uids)
3306 return -EINVAL;
3307
> 3308 id = bpf_tramp_id_alloc(cnt);
3309 if (!id)
3310 return -ENOMEM;
3311
3312 err = -EFAULT;
3313 cnt_size = cnt * sizeof(id->id[0]);
3314 if (copy_from_user(id->id, uids, cnt_size))
3315 goto out_free_id;
3316
3317 id->cnt = cnt;
3318 id->obj_id = btf_obj_id(prog->aux->attach_btf);
3319
3320 /* Sort user provided BTF ids, so we can use memcmp
3321 * and bsearch on top of it later.
3322 */
3323 sort(id->id, cnt, sizeof(u32), btf_ids_cmp, NULL);
3324
3325 err = bpf_tramp_id_resolve(id, prog);
3326 if (err)
3327 goto out_free_id;
3328
3329 link = kzalloc(sizeof(*link), GFP_KERNEL);
3330 if (!link) {
3331 err = -ENOMEM;
3332 goto out_free_id;
3333 }
3334
3335 bpf_link_init(&link->link, BPF_LINK_TYPE_TRACING_MULTI,
3336 &bpf_tracing_multi_link_lops, prog);
3337 link->attach_type = prog->expected_attach_type;
3338
3339 err = bpf_link_prime(&link->link, &link_primer);
3340 if (err) {
3341 kfree(link);
3342 goto out_free_id;
3343 }
3344
3345 link->id = id;
3346 link->tp.cookie = 0;
3347 link->tp.prog = prog;
3348
3349 err = bpf_trampoline_multi_attach(&link->tp, id);
3350 if (err) {
3351 bpf_link_cleanup(&link_primer);
3352 goto out_free_id;
3353 }
3354 return bpf_link_settle(&link_primer);
3355 out_free_id:
3356 kfree(id);
3357 return err;
3358 }
3359

--
0-DAY CI Kernel Test Service
https://01.org/lkp