lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [day] [month] [year] [list]
Message-ID: <202207310100.xQT6NlLP-lkp@intel.com>
Date:   Sun, 31 Jul 2022 01:56:31 +0800
From:   kernel test robot <lkp@...el.com>
To:     Jiri Olsa <jolsa@...nel.org>
Cc:     kbuild-all@...ts.01.org, linux-kernel@...r.kernel.org
Subject: [jolsa-perf:bpf/tracing_multi_4 24/35] kernel/bpf/syscall.c:3157:22:
 error: implicit declaration of function 'bpf_trampoline_multi_detach'

tree:   https://git.kernel.org/pub/scm/linux/kernel/git/jolsa/perf.git bpf/tracing_multi_4
head:   a63fc296e166a76b3f7250a966df4651e3a846f1
commit: 2792d334c3d8d0f27276319d17dcb166c41794b7 [24/35] bpf: Add support for tracing multi link
config: m68k-amiga_defconfig (https://download.01.org/0day-ci/archive/20220731/202207310100.xQT6NlLP-lkp@intel.com/config)
compiler: m68k-linux-gcc (GCC) 12.1.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://git.kernel.org/pub/scm/linux/kernel/git/jolsa/perf.git/commit/?id=2792d334c3d8d0f27276319d17dcb166c41794b7
        git remote add jolsa-perf https://git.kernel.org/pub/scm/linux/kernel/git/jolsa/perf.git
        git fetch --no-tags jolsa-perf bpf/tracing_multi_4
        git checkout 2792d334c3d8d0f27276319d17dcb166c41794b7
        # save the config file
        mkdir build_dir && cp config build_dir/.config
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.1.0 make.cross W=1 O=build_dir ARCH=m68k SHELL=/bin/bash

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

All errors (new ones prefixed by >>):

   kernel/bpf/syscall.c: In function 'bpf_prog_load':
   kernel/bpf/syscall.c:2523:22: error: implicit declaration of function 'is_tracing_multi' [-Werror=implicit-function-declaration]
    2523 |         multi_func = is_tracing_multi(attr->expected_attach_type);
         |                      ^~~~~~~~~~~~~~~~
   In file included from include/asm-generic/bug.h:7,
                    from arch/m68k/include/asm/bug.h:32,
                    from include/linux/ktime.h:26,
                    from include/linux/timer.h:6,
                    from include/linux/workqueue.h:9,
                    from include/linux/bpf.h:10,
                    from kernel/bpf/syscall.c:4:
   kernel/bpf/syscall.c: In function 'bpf_tracing_multi_link_release':
>> kernel/bpf/syscall.c:3157:22: error: implicit declaration of function 'bpf_trampoline_multi_detach' [-Werror=implicit-function-declaration]
    3157 |         WARN_ON_ONCE(bpf_trampoline_multi_detach(&tr_link->tp, tr_link->id));
         |                      ^~~~~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/once_lite.h:15:41: note: in definition of macro 'DO_ONCE_LITE_IF'
      15 |                 bool __ret_do_once = !!(condition);                     \
         |                                         ^~~~~~~~~
   kernel/bpf/syscall.c:3157:9: note: in expansion of macro 'WARN_ON_ONCE'
    3157 |         WARN_ON_ONCE(bpf_trampoline_multi_detach(&tr_link->tp, tr_link->id));
         |         ^~~~~~~~~~~~
   kernel/bpf/syscall.c: In function 'bpf_tracing_multi_link_dealloc':
>> kernel/bpf/syscall.c:3165:9: error: implicit declaration of function 'bpf_tramp_id_put'; did you mean 'bpf_trampoline_put'? [-Werror=implicit-function-declaration]
    3165 |         bpf_tramp_id_put(tr_link->id);
         |         ^~~~~~~~~~~~~~~~
         |         bpf_trampoline_put
   kernel/bpf/syscall.c: In function 'bpf_tracing_multi_attach':
>> kernel/bpf/syscall.c:3328:14: error: implicit declaration of function 'bpf_tramp_id_alloc'; did you mean 'bpf_tramp_id_resolve'? [-Werror=implicit-function-declaration]
    3328 |         id = bpf_tramp_id_alloc(cnt);
         |              ^~~~~~~~~~~~~~~~~~
         |              bpf_tramp_id_resolve
   kernel/bpf/syscall.c:3328:12: warning: assignment to 'struct bpf_tramp_id *' from 'int' makes pointer from integer without a cast [-Wint-conversion]
    3328 |         id = bpf_tramp_id_alloc(cnt);
         |            ^
>> kernel/bpf/syscall.c:3369:15: error: implicit declaration of function 'bpf_trampoline_multi_attach'; did you mean 'bpf_tracing_multi_attach'? [-Werror=implicit-function-declaration]
    3369 |         err = bpf_trampoline_multi_attach(&link->tp, id);
         |               ^~~~~~~~~~~~~~~~~~~~~~~~~~~
         |               bpf_tracing_multi_attach
   cc1: some warnings being treated as errors


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

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

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

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ