* [PATCH bpf-next v8 0/2] Fix attaching fentry/fexit/fmod_ret/lsm to modules
@ 2023-02-22 14:35 Viktor Malik
2023-02-22 14:35 ` [PATCH bpf-next v8 1/2] bpf: " Viktor Malik
` (2 more replies)
0 siblings, 3 replies; 7+ messages in thread
From: Viktor Malik @ 2023-02-22 14:35 UTC (permalink / raw)
To: bpf
Cc: Alexei Starovoitov, Daniel Borkmann, John Fastabend,
Andrii Nakryiko, Martin KaFai Lau, Song Liu, Yonghong Song,
KP Singh, Stanislav Fomichev, Hao Luo, Jiri Olsa,
Luis Chamberlain, Viktor Malik
I noticed that the verifier behaves incorrectly when attaching to fentry
of multiple functions of the same name located in different modules (or
in vmlinux). The reason for this is that if the target program is not
specified, the verifier will search kallsyms for the trampoline address
to attach to. The entire kallsyms is always searched, not respecting the
module in which the function to attach to is located.
As Yonghong correctly pointed out, there is yet another issue - the
trampoline acquires the module reference in register_fentry which means
that if the module is unloaded between the place where the address is
found in the verifier and register_fentry, it is possible that another
module is loaded to the same address in the meantime, which may lead to
errors.
This patch fixes the above issues by extracting the module name from the
BTF of the attachment target (which must be specified) and by doing the
search in kallsyms of the correct module. At the same time, the module
reference is acquired right after the address is found and only released
right before the program itself is unloaded.
---
Changes in v8:
- added module_put to error paths in bpf_check_attach_target after the
module reference is acquired
Changes in v7:
- refactored the module reference manipulation (comments by Jiri Olsa)
- cleaned up the test (comments by Andrii Nakryiko)
Changes in v6:
- storing the module reference inside bpf_prog_aux instead of
bpf_trampoline and releasing it when the program is unloaded
(suggested by Jiri Olsa)
Changes in v5:
- fixed acquiring and releasing of module references by trampolines to
prevent modules being unloaded between address lookup and trampoline
allocation
Changes in v4:
- reworked module kallsyms lookup approach using existing functions,
verifier now calls btf_try_get_module to retrieve the module and
find_kallsyms_symbol_value to get the symbol address (suggested by
Alexei)
- included Jiri Olsa's comments
- improved description of the new test and added it as a comment into
the test source
Changes in v3:
- added trivial implementation for kallsyms_lookup_name_in_module() for
!CONFIG_MODULES (noticed by test robot, fix suggested by Hao Luo)
Changes in v2:
- introduced and used more space-efficient kallsyms lookup function,
suggested by Jiri Olsa
- included Hao Luo's comments
Viktor Malik (2):
bpf: Fix attaching fentry/fexit/fmod_ret/lsm to modules
bpf/selftests: Test fentry attachment to shadowed functions
include/linux/bpf.h | 2 +
kernel/bpf/syscall.c | 6 +
kernel/bpf/trampoline.c | 27 ----
kernel/bpf/verifier.c | 18 ++-
kernel/module/internal.h | 5 +
net/bpf/test_run.c | 5 +
.../selftests/bpf/bpf_testmod/bpf_testmod.c | 6 +
.../bpf/prog_tests/module_attach_shadow.c | 128 ++++++++++++++++++
8 files changed, 169 insertions(+), 28 deletions(-)
create mode 100644 tools/testing/selftests/bpf/prog_tests/module_attach_shadow.c
--
2.39.1
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH bpf-next v8 1/2] bpf: Fix attaching fentry/fexit/fmod_ret/lsm to modules
2023-02-22 14:35 [PATCH bpf-next v8 0/2] Fix attaching fentry/fexit/fmod_ret/lsm to modules Viktor Malik
@ 2023-02-22 14:35 ` Viktor Malik
2023-02-23 1:42 ` kernel test robot
2023-02-27 12:58 ` Jiri Olsa
2023-02-22 14:35 ` [PATCH bpf-next v8 2/2] bpf/selftests: Test fentry attachment to shadowed functions Viktor Malik
2023-02-27 12:58 ` [PATCH bpf-next v8 0/2] Fix attaching fentry/fexit/fmod_ret/lsm to modules Jiri Olsa
2 siblings, 2 replies; 7+ messages in thread
From: Viktor Malik @ 2023-02-22 14:35 UTC (permalink / raw)
To: bpf
Cc: Alexei Starovoitov, Daniel Borkmann, John Fastabend,
Andrii Nakryiko, Martin KaFai Lau, Song Liu, Yonghong Song,
KP Singh, Stanislav Fomichev, Hao Luo, Jiri Olsa,
Luis Chamberlain, Viktor Malik
This resolves two problems with attachment of fentry/fexit/fmod_ret/lsm
to functions located in modules:
1. The verifier tries to find the address to attach to in kallsyms. This
is always done by searching the entire kallsyms, not respecting the
module in which the function is located. Such approach causes an
incorrect attachment address to be computed if the function to attach
to is shadowed by a function of the same name located earlier in
kallsyms.
2. If the address to attach to is located in a module, the module
reference is only acquired in register_fentry. If the module is
unloaded between the place where the address is found
(bpf_check_attach_target in the verifier) and register_fentry, it is
possible that another module is loaded to the same address which may
lead to potential errors.
Since the attachment must contain the BTF of the program to attach to,
we extract the module from it and search for the function address in the
correct module (resolving problem no. 1). Then, the module reference is
taken directly in bpf_check_attach_target and stored in the bpf program
(in bpf_prog_aux). The reference is only released when the program is
unloaded (resolving problem no. 2).
Signed-off-by: Viktor Malik <vmalik@redhat.com>
---
include/linux/bpf.h | 2 ++
kernel/bpf/syscall.c | 6 ++++++
kernel/bpf/trampoline.c | 27 ---------------------------
kernel/bpf/verifier.c | 18 +++++++++++++++++-
kernel/module/internal.h | 5 +++++
5 files changed, 30 insertions(+), 28 deletions(-)
diff --git a/include/linux/bpf.h b/include/linux/bpf.h
index 520b238abd5a..ad3333088da5 100644
--- a/include/linux/bpf.h
+++ b/include/linux/bpf.h
@@ -1089,6 +1089,7 @@ struct bpf_trampoline {
struct bpf_attach_target_info {
struct btf_func_model fmodel;
long tgt_addr;
+ struct module *tgt_mod;
const char *tgt_name;
const struct btf_type *tgt_type;
};
@@ -1361,6 +1362,7 @@ struct bpf_prog_aux {
* main prog always has linfo_idx == 0
*/
u32 linfo_idx;
+ struct module *mod;
u32 num_exentries;
struct exception_table_entry *extable;
union {
diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c
index e3fcdc9836a6..3c9de31c892f 100644
--- a/kernel/bpf/syscall.c
+++ b/kernel/bpf/syscall.c
@@ -2049,6 +2049,7 @@ static void __bpf_prog_put_noref(struct bpf_prog *prog, bool deferred)
{
bpf_prog_kallsyms_del_all(prog);
btf_put(prog->aux->btf);
+ module_put(prog->aux->mod);
kvfree(prog->aux->jited_linfo);
kvfree(prog->aux->linfo);
kfree(prog->aux->kfunc_tab);
@@ -3095,6 +3096,11 @@ static int bpf_tracing_prog_attach(struct bpf_prog *prog,
if (err)
goto out_unlock;
+ if (tgt_info.tgt_mod) {
+ module_put(prog->aux->mod);
+ prog->aux->mod = tgt_info.tgt_mod;
+ }
+
tr = bpf_trampoline_get(key, &tgt_info);
if (!tr) {
err = -ENOMEM;
diff --git a/kernel/bpf/trampoline.c b/kernel/bpf/trampoline.c
index d0ed7d6f5eec..ebb20bf252c7 100644
--- a/kernel/bpf/trampoline.c
+++ b/kernel/bpf/trampoline.c
@@ -172,26 +172,6 @@ static struct bpf_trampoline *bpf_trampoline_lookup(u64 key)
return tr;
}
-static int bpf_trampoline_module_get(struct bpf_trampoline *tr)
-{
- struct module *mod;
- int err = 0;
-
- preempt_disable();
- mod = __module_text_address((unsigned long) tr->func.addr);
- if (mod && !try_module_get(mod))
- err = -ENOENT;
- preempt_enable();
- tr->mod = mod;
- return err;
-}
-
-static void bpf_trampoline_module_put(struct bpf_trampoline *tr)
-{
- module_put(tr->mod);
- tr->mod = NULL;
-}
-
static int unregister_fentry(struct bpf_trampoline *tr, void *old_addr)
{
void *ip = tr->func.addr;
@@ -202,8 +182,6 @@ static int unregister_fentry(struct bpf_trampoline *tr, void *old_addr)
else
ret = bpf_arch_text_poke(ip, BPF_MOD_CALL, old_addr, NULL);
- if (!ret)
- bpf_trampoline_module_put(tr);
return ret;
}
@@ -238,9 +216,6 @@ static int register_fentry(struct bpf_trampoline *tr, void *new_addr)
tr->func.ftrace_managed = true;
}
- if (bpf_trampoline_module_get(tr))
- return -ENOENT;
-
if (tr->func.ftrace_managed) {
ftrace_set_filter_ip(tr->fops, (unsigned long)ip, 0, 1);
ret = register_ftrace_direct_multi(tr->fops, (long)new_addr);
@@ -248,8 +223,6 @@ static int register_fentry(struct bpf_trampoline *tr, void *new_addr)
ret = bpf_arch_text_poke(ip, BPF_MOD_CALL, NULL, new_addr);
}
- if (ret)
- bpf_trampoline_module_put(tr);
return ret;
}
diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c
index 272563a0b770..a6efdbd5d674 100644
--- a/kernel/bpf/verifier.c
+++ b/kernel/bpf/verifier.c
@@ -24,6 +24,7 @@
#include <linux/bpf_lsm.h>
#include <linux/btf_ids.h>
#include <linux/poison.h>
+#include "../module/internal.h"
#include "disasm.h"
@@ -17278,6 +17279,7 @@ int bpf_check_attach_target(struct bpf_verifier_log *log,
const char *tname;
struct btf *btf;
long addr = 0;
+ struct module *mod = NULL;
if (!btf_id) {
bpf_log(log, "Tracing programs must provide btf_id\n");
@@ -17451,8 +17453,17 @@ int bpf_check_attach_target(struct bpf_verifier_log *log,
else
addr = (long) tgt_prog->aux->func[subprog]->bpf_func;
} else {
- addr = kallsyms_lookup_name(tname);
+ if (btf_is_module(btf)) {
+ mod = btf_try_get_module(btf);
+ if (mod)
+ addr = find_kallsyms_symbol_value(mod, tname);
+ else
+ addr = 0;
+ } else {
+ addr = kallsyms_lookup_name(tname);
+ }
if (!addr) {
+ module_put(mod);
bpf_log(log,
"The address of function %s cannot be found\n",
tname);
@@ -17492,11 +17503,13 @@ int bpf_check_attach_target(struct bpf_verifier_log *log,
break;
}
if (ret) {
+ module_put(mod);
bpf_log(log, "%s is not sleepable\n", tname);
return ret;
}
} else if (prog->expected_attach_type == BPF_MODIFY_RETURN) {
if (tgt_prog) {
+ module_put(mod);
bpf_log(log, "can't modify return codes of BPF programs\n");
return -EINVAL;
}
@@ -17505,6 +17518,7 @@ int bpf_check_attach_target(struct bpf_verifier_log *log,
!check_attach_modify_return(addr, tname))
ret = 0;
if (ret) {
+ module_put(mod);
bpf_log(log, "%s() is not modifiable\n", tname);
return ret;
}
@@ -17515,6 +17529,7 @@ int bpf_check_attach_target(struct bpf_verifier_log *log,
tgt_info->tgt_addr = addr;
tgt_info->tgt_name = tname;
tgt_info->tgt_type = t;
+ tgt_info->tgt_mod = mod;
return 0;
}
@@ -17594,6 +17609,7 @@ static int check_attach_btf_id(struct bpf_verifier_env *env)
/* store info about the attachment target that will be used later */
prog->aux->attach_func_proto = tgt_info.tgt_type;
prog->aux->attach_func_name = tgt_info.tgt_name;
+ prog->aux->mod = tgt_info.tgt_mod;
if (tgt_prog) {
prog->aux->saved_dst_prog_type = tgt_prog->type;
diff --git a/kernel/module/internal.h b/kernel/module/internal.h
index 2e2bf236f558..5cb103a46018 100644
--- a/kernel/module/internal.h
+++ b/kernel/module/internal.h
@@ -256,6 +256,11 @@ static inline bool sect_empty(const Elf_Shdr *sect)
static inline void init_build_id(struct module *mod, const struct load_info *info) { }
static inline void layout_symtab(struct module *mod, struct load_info *info) { }
static inline void add_kallsyms(struct module *mod, const struct load_info *info) { }
+static inline unsigned long find_kallsyms_symbol_value(struct module *mod
+ const char *name)
+{
+ return 0;
+}
#endif /* CONFIG_KALLSYMS */
#ifdef CONFIG_SYSFS
--
2.39.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH bpf-next v8 2/2] bpf/selftests: Test fentry attachment to shadowed functions
2023-02-22 14:35 [PATCH bpf-next v8 0/2] Fix attaching fentry/fexit/fmod_ret/lsm to modules Viktor Malik
2023-02-22 14:35 ` [PATCH bpf-next v8 1/2] bpf: " Viktor Malik
@ 2023-02-22 14:35 ` Viktor Malik
2023-02-27 12:58 ` Jiri Olsa
2023-02-27 12:58 ` [PATCH bpf-next v8 0/2] Fix attaching fentry/fexit/fmod_ret/lsm to modules Jiri Olsa
2 siblings, 1 reply; 7+ messages in thread
From: Viktor Malik @ 2023-02-22 14:35 UTC (permalink / raw)
To: bpf
Cc: Alexei Starovoitov, Daniel Borkmann, John Fastabend,
Andrii Nakryiko, Martin KaFai Lau, Song Liu, Yonghong Song,
KP Singh, Stanislav Fomichev, Hao Luo, Jiri Olsa,
Luis Chamberlain, Viktor Malik
Adds a new test that tries to attach a program to fentry of two
functions of the same name, one located in vmlinux and the other in
bpf_testmod.
To avoid conflicts with existing tests, a new function
"bpf_fentry_shadow_test" was created both in vmlinux and in bpf_testmod.
The previous commit fixed a bug which caused this test to fail. The
verifier would always use the vmlinux function's address as the target
trampoline address, hence trying to create two trampolines for a single
address, which is forbidden.
Signed-off-by: Viktor Malik <vmalik@redhat.com>
---
net/bpf/test_run.c | 5 +
.../selftests/bpf/bpf_testmod/bpf_testmod.c | 6 +
.../bpf/prog_tests/module_attach_shadow.c | 128 ++++++++++++++++++
3 files changed, 139 insertions(+)
create mode 100644 tools/testing/selftests/bpf/prog_tests/module_attach_shadow.c
diff --git a/net/bpf/test_run.c b/net/bpf/test_run.c
index 6f3d654b3339..aa3a4e6ba701 100644
--- a/net/bpf/test_run.c
+++ b/net/bpf/test_run.c
@@ -560,6 +560,11 @@ long noinline bpf_kfunc_call_test4(signed char a, short b, int c, long d)
return (long)a + (long)b + (long)c + d;
}
+int noinline bpf_fentry_shadow_test(int a)
+{
+ return a + 1;
+}
+
struct prog_test_member1 {
int a;
};
diff --git a/tools/testing/selftests/bpf/bpf_testmod/bpf_testmod.c b/tools/testing/selftests/bpf/bpf_testmod/bpf_testmod.c
index 46500636d8cd..c478b14fdea1 100644
--- a/tools/testing/selftests/bpf/bpf_testmod/bpf_testmod.c
+++ b/tools/testing/selftests/bpf/bpf_testmod/bpf_testmod.c
@@ -229,6 +229,12 @@ static const struct btf_kfunc_id_set bpf_testmod_kfunc_set = {
.set = &bpf_testmod_check_kfunc_ids,
};
+noinline int bpf_fentry_shadow_test(int a)
+{
+ return a + 2;
+}
+EXPORT_SYMBOL_GPL(bpf_fentry_shadow_test);
+
extern int bpf_fentry_test1(int a);
static int bpf_testmod_init(void)
diff --git a/tools/testing/selftests/bpf/prog_tests/module_attach_shadow.c b/tools/testing/selftests/bpf/prog_tests/module_attach_shadow.c
new file mode 100644
index 000000000000..63d122392674
--- /dev/null
+++ b/tools/testing/selftests/bpf/prog_tests/module_attach_shadow.c
@@ -0,0 +1,128 @@
+// SPDX-License-Identifier: GPL-2.0
+/* Copyright (c) 2022 Red Hat */
+#include <test_progs.h>
+#include <bpf/btf.h>
+#include "bpf/libbpf_internal.h"
+#include "cgroup_helpers.h"
+
+static const char *module_name = "bpf_testmod";
+static const char *symbol_name = "bpf_fentry_shadow_test";
+
+static int get_bpf_testmod_btf_fd(void)
+{
+ struct bpf_btf_info info;
+ char name[64];
+ __u32 id = 0, len;
+ int err, fd;
+
+ while (true) {
+ err = bpf_btf_get_next_id(id, &id);
+ if (err) {
+ log_err("failed to iterate BTF objects");
+ return err;
+ }
+
+ fd = bpf_btf_get_fd_by_id(id);
+ if (fd < 0) {
+ if (errno == ENOENT)
+ continue; /* expected race: BTF was unloaded */
+ err = -errno;
+ log_err("failed to get FD for BTF object #%d", id);
+ return err;
+ }
+
+ len = sizeof(info);
+ memset(&info, 0, sizeof(info));
+ info.name = ptr_to_u64(name);
+ info.name_len = sizeof(name);
+
+ err = bpf_obj_get_info_by_fd(fd, &info, &len);
+ if (err) {
+ err = -errno;
+ log_err("failed to get info for BTF object #%d", id);
+ close(fd);
+ return err;
+ }
+
+ if (strcmp(name, module_name) == 0)
+ return fd;
+
+ close(fd);
+ }
+ return -ENOENT;
+}
+
+void test_module_fentry_shadow(void)
+{
+ struct btf *vmlinux_btf = NULL, *mod_btf = NULL;
+ int err, i;
+ int btf_fd[2] = {};
+ int prog_fd[2] = {};
+ int link_fd[2] = {};
+ __s32 btf_id[2] = {};
+
+ LIBBPF_OPTS(bpf_prog_load_opts, load_opts,
+ .expected_attach_type = BPF_TRACE_FENTRY,
+ );
+
+ const struct bpf_insn trace_program[] = {
+ BPF_MOV64_IMM(BPF_REG_0, 0),
+ BPF_EXIT_INSN(),
+ };
+
+ vmlinux_btf = btf__load_vmlinux_btf();
+ if (!ASSERT_OK_PTR(vmlinux_btf, "load_vmlinux_btf"))
+ return;
+
+ btf_fd[1] = get_bpf_testmod_btf_fd();
+ if (!ASSERT_GE(btf_fd[1], 0, "get_bpf_testmod_btf_fd"))
+ goto out;
+
+ mod_btf = btf_get_from_fd(btf_fd[1], vmlinux_btf);
+ if (!ASSERT_OK_PTR(mod_btf, "btf_get_from_fd"))
+ goto out;
+
+ btf_id[0] = btf__find_by_name_kind(vmlinux_btf, symbol_name, BTF_KIND_FUNC);
+ if (!ASSERT_GT(btf_id[0], 0, "btf_find_by_name"))
+ goto out;
+
+ btf_id[1] = btf__find_by_name_kind(mod_btf, symbol_name, BTF_KIND_FUNC);
+ if (!ASSERT_GT(btf_id[1], 0, "btf_find_by_name"))
+ goto out;
+
+ for (i = 0; i < 2; i++) {
+ load_opts.attach_btf_id = btf_id[i];
+ load_opts.attach_btf_obj_fd = btf_fd[i];
+ prog_fd[i] = bpf_prog_load(BPF_PROG_TYPE_TRACING, NULL, "GPL",
+ trace_program,
+ sizeof(trace_program) / sizeof(struct bpf_insn),
+ &load_opts);
+ if (!ASSERT_GE(prog_fd[i], 0, "bpf_prog_load"))
+ goto out;
+
+ /* If the verifier incorrectly resolves addresses of the
+ * shadowed functions and uses the same address for both the
+ * vmlinux and the bpf_testmod functions, this will fail on
+ * attempting to create two trampolines for the same address,
+ * which is forbidden.
+ */
+ link_fd[i] = bpf_link_create(prog_fd[i], 0, BPF_TRACE_FENTRY, NULL);
+ if (!ASSERT_GE(link_fd[i], 0, "bpf_link_create"))
+ goto out;
+ }
+
+ err = bpf_prog_test_run_opts(prog_fd[0], NULL);
+ ASSERT_OK(err, "running test");
+
+out:
+ btf__free(vmlinux_btf);
+ btf__free(mod_btf);
+ for (i = 0; i < 2; i++) {
+ if (btf_fd[i])
+ close(btf_fd[i]);
+ if (prog_fd[i])
+ close(prog_fd[i]);
+ if (link_fd[i])
+ close(link_fd[i]);
+ }
+}
--
2.39.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH bpf-next v8 1/2] bpf: Fix attaching fentry/fexit/fmod_ret/lsm to modules
2023-02-22 14:35 ` [PATCH bpf-next v8 1/2] bpf: " Viktor Malik
@ 2023-02-23 1:42 ` kernel test robot
2023-02-27 12:58 ` Jiri Olsa
1 sibling, 0 replies; 7+ messages in thread
From: kernel test robot @ 2023-02-23 1:42 UTC (permalink / raw)
To: Viktor Malik, bpf
Cc: llvm, oe-kbuild-all, Alexei Starovoitov, Daniel Borkmann,
John Fastabend, Andrii Nakryiko, Martin KaFai Lau, Song Liu,
Yonghong Song, KP Singh, Stanislav Fomichev, Hao Luo, Jiri Olsa,
Luis Chamberlain, Viktor Malik
Hi Viktor,
Thank you for the patch! Yet something to improve:
[auto build test ERROR on bpf-next/master]
url: https://github.com/intel-lab-lkp/linux/commits/Viktor-Malik/bpf-Fix-attaching-fentry-fexit-fmod_ret-lsm-to-modules/20230222-234249
base: https://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next.git master
patch link: https://lore.kernel.org/r/56870b3b449a20872dcff09541967a5a46284c0e.1677075137.git.vmalik%40redhat.com
patch subject: [PATCH bpf-next v8 1/2] bpf: Fix attaching fentry/fexit/fmod_ret/lsm to modules
config: s390-randconfig-r044-20230222 (https://download.01.org/0day-ci/archive/20230223/202302230931.vNIpXwzB-lkp@intel.com/config)
compiler: clang version 17.0.0 (https://github.com/llvm/llvm-project db89896bbbd2251fff457699635acbbedeead27f)
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
# install s390 cross compiling tool for clang build
# apt-get install binutils-s390x-linux-gnu
# https://github.com/intel-lab-lkp/linux/commit/4c466a8ec9e92ae2a14d722fc6a704a7bec5a1c4
git remote add linux-review https://github.com/intel-lab-lkp/linux
git fetch --no-tags linux-review Viktor-Malik/bpf-Fix-attaching-fentry-fexit-fmod_ret-lsm-to-modules/20230222-234249
git checkout 4c466a8ec9e92ae2a14d722fc6a704a7bec5a1c4
# 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=s390 olddefconfig
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=s390 SHELL=/bin/bash kernel/
If you fix the issue, kindly add following tag where applicable
| Reported-by: kernel test robot <lkp@intel.com>
| Link: https://lore.kernel.org/oe-kbuild-all/202302230931.vNIpXwzB-lkp@intel.com/
All errors (new ones prefixed by >>):
In file included from kernel/bpf/verifier.c:7:
In file included from include/linux/bpf-cgroup.h:11:
In file included from include/net/sock.h:46:
In file included from include/linux/netdevice.h:38:
In file included from include/net/net_namespace.h:43:
In file included from include/linux/skbuff.h:28:
In file included from include/linux/dma-mapping.h:10:
In file included from include/linux/scatterlist.h:9:
In file included from arch/s390/include/asm/io.h:75:
include/asm-generic/io.h:547:31: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
val = __raw_readb(PCI_IOBASE + addr);
~~~~~~~~~~ ^
include/asm-generic/io.h:560:61: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
val = __le16_to_cpu((__le16 __force)__raw_readw(PCI_IOBASE + addr));
~~~~~~~~~~ ^
include/uapi/linux/byteorder/big_endian.h:37:59: note: expanded from macro '__le16_to_cpu'
#define __le16_to_cpu(x) __swab16((__force __u16)(__le16)(x))
^
include/uapi/linux/swab.h:102:54: note: expanded from macro '__swab16'
#define __swab16(x) (__u16)__builtin_bswap16((__u16)(x))
^
In file included from kernel/bpf/verifier.c:7:
In file included from include/linux/bpf-cgroup.h:11:
In file included from include/net/sock.h:46:
In file included from include/linux/netdevice.h:38:
In file included from include/net/net_namespace.h:43:
In file included from include/linux/skbuff.h:28:
In file included from include/linux/dma-mapping.h:10:
In file included from include/linux/scatterlist.h:9:
In file included from arch/s390/include/asm/io.h:75:
include/asm-generic/io.h:573:61: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
val = __le32_to_cpu((__le32 __force)__raw_readl(PCI_IOBASE + addr));
~~~~~~~~~~ ^
include/uapi/linux/byteorder/big_endian.h:35:59: note: expanded from macro '__le32_to_cpu'
#define __le32_to_cpu(x) __swab32((__force __u32)(__le32)(x))
^
include/uapi/linux/swab.h:115:54: note: expanded from macro '__swab32'
#define __swab32(x) (__u32)__builtin_bswap32((__u32)(x))
^
In file included from kernel/bpf/verifier.c:7:
In file included from include/linux/bpf-cgroup.h:11:
In file included from include/net/sock.h:46:
In file included from include/linux/netdevice.h:38:
In file included from include/net/net_namespace.h:43:
In file included from include/linux/skbuff.h:28:
In file included from include/linux/dma-mapping.h:10:
In file included from include/linux/scatterlist.h:9:
In file included from arch/s390/include/asm/io.h:75:
include/asm-generic/io.h:584:33: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
__raw_writeb(value, PCI_IOBASE + addr);
~~~~~~~~~~ ^
include/asm-generic/io.h:594:59: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
__raw_writew((u16 __force)cpu_to_le16(value), PCI_IOBASE + addr);
~~~~~~~~~~ ^
include/asm-generic/io.h:604:59: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
__raw_writel((u32 __force)cpu_to_le32(value), PCI_IOBASE + addr);
~~~~~~~~~~ ^
include/asm-generic/io.h:692:20: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
readsb(PCI_IOBASE + addr, buffer, count);
~~~~~~~~~~ ^
include/asm-generic/io.h:700:20: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
readsw(PCI_IOBASE + addr, buffer, count);
~~~~~~~~~~ ^
include/asm-generic/io.h:708:20: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
readsl(PCI_IOBASE + addr, buffer, count);
~~~~~~~~~~ ^
include/asm-generic/io.h:717:21: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
writesb(PCI_IOBASE + addr, buffer, count);
~~~~~~~~~~ ^
include/asm-generic/io.h:726:21: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
writesw(PCI_IOBASE + addr, buffer, count);
~~~~~~~~~~ ^
include/asm-generic/io.h:735:21: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
writesl(PCI_IOBASE + addr, buffer, count);
~~~~~~~~~~ ^
In file included from kernel/bpf/verifier.c:27:
>> kernel/bpf/../module/internal.h:212:2: error: incomplete definition of type 'struct module'
list_for_each_entry_rcu(mod, &modules, list,
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/rculist.h:391:13: note: expanded from macro 'list_for_each_entry_rcu'
pos = list_entry_rcu((head)->next, typeof(*pos), member); \
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/rculist.h:307:2: note: expanded from macro 'list_entry_rcu'
container_of(READ_ONCE(ptr), type, member)
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/container_of.h:20:47: note: expanded from macro 'container_of'
static_assert(__same_type(*(ptr), ((type *)0)->member) || \
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~
include/linux/compiler_types.h:340:74: note: expanded from macro '__same_type'
#define __same_type(a, b) __builtin_types_compatible_p(typeof(a), typeof(b))
^
include/linux/build_bug.h:77:50: note: expanded from macro 'static_assert'
#define static_assert(expr, ...) __static_assert(expr, ##__VA_ARGS__, #expr)
~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/build_bug.h:78:56: note: expanded from macro '__static_assert'
#define __static_assert(expr, msg, ...) _Static_assert(expr, msg)
^~~~
include/linux/jump_label.h:196:8: note: forward declaration of 'struct module'
struct module;
^
In file included from kernel/bpf/verifier.c:27:
>> kernel/bpf/../module/internal.h:212:2: error: offsetof of incomplete type 'typeof (*mod)' (aka 'struct module')
list_for_each_entry_rcu(mod, &modules, list,
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/rculist.h:391:13: note: expanded from macro 'list_for_each_entry_rcu'
pos = list_entry_rcu((head)->next, typeof(*pos), member); \
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/rculist.h:307:2: note: expanded from macro 'list_entry_rcu'
container_of(READ_ONCE(ptr), type, member)
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/container_of.h:23:21: note: expanded from macro 'container_of'
((type *)(__mptr - offsetof(type, member))); })
^~~~~~~~~~~~~~~~~~~~~~
include/linux/stddef.h:16:32: note: expanded from macro 'offsetof'
#define offsetof(TYPE, MEMBER) __builtin_offsetof(TYPE, MEMBER)
^ ~~~~
include/linux/jump_label.h:196:8: note: forward declaration of 'struct module'
struct module;
^
In file included from kernel/bpf/verifier.c:27:
>> kernel/bpf/../module/internal.h:212:2: error: assigning to 'struct module *' from incompatible type 'void'
list_for_each_entry_rcu(mod, &modules, list,
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/rculist.h:391:11: note: expanded from macro 'list_for_each_entry_rcu'
pos = list_entry_rcu((head)->next, typeof(*pos), member); \
^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from kernel/bpf/verifier.c:27:
>> kernel/bpf/../module/internal.h:212:2: error: incomplete definition of type 'struct module'
list_for_each_entry_rcu(mod, &modules, list,
^ ~~~
include/linux/rculist.h:392:7: note: expanded from macro 'list_for_each_entry_rcu'
&pos->member != (head); \
~~~^
include/linux/jump_label.h:196:8: note: forward declaration of 'struct module'
struct module;
^
In file included from kernel/bpf/verifier.c:27:
>> kernel/bpf/../module/internal.h:212:2: error: incomplete definition of type 'struct module'
list_for_each_entry_rcu(mod, &modules, list,
^ ~~~
include/linux/rculist.h:393:27: note: expanded from macro 'list_for_each_entry_rcu'
pos = list_entry_rcu(pos->member.next, typeof(*pos), member))
~~~^
include/linux/rculist.h:307:25: note: expanded from macro 'list_entry_rcu'
container_of(READ_ONCE(ptr), type, member)
^~~
include/asm-generic/rwonce.h:49:33: note: expanded from macro 'READ_ONCE'
compiletime_assert_rwonce_type(x); \
^
note: (skipping 3 expansions in backtrace; use -fmacro-backtrace-limit=0 to see all)
include/linux/compiler_types.h:387:23: note: expanded from macro '_compiletime_assert'
__compiletime_assert(condition, msg, prefix, suffix)
^~~~~~~~~
include/linux/compiler_types.h:379:9: note: expanded from macro '__compiletime_assert'
if (!(condition)) \
^~~~~~~~~
include/linux/container_of.h:19:26: note: expanded from macro 'container_of'
void *__mptr = (void *)(ptr); \
^~~
include/linux/jump_label.h:196:8: note: forward declaration of 'struct module'
struct module;
^
In file included from kernel/bpf/verifier.c:27:
>> kernel/bpf/../module/internal.h:212:2: error: incomplete definition of type 'struct module'
list_for_each_entry_rcu(mod, &modules, list,
^ ~~~
include/linux/rculist.h:393:27: note: expanded from macro 'list_for_each_entry_rcu'
pos = list_entry_rcu(pos->member.next, typeof(*pos), member))
~~~^
include/linux/rculist.h:307:25: note: expanded from macro 'list_entry_rcu'
container_of(READ_ONCE(ptr), type, member)
^~~
include/asm-generic/rwonce.h:49:33: note: expanded from macro 'READ_ONCE'
compiletime_assert_rwonce_type(x); \
^
note: (skipping 3 expansions in backtrace; use -fmacro-backtrace-limit=0 to see all)
include/linux/compiler_types.h:387:23: note: expanded from macro '_compiletime_assert'
__compiletime_assert(condition, msg, prefix, suffix)
^~~~~~~~~
include/linux/compiler_types.h:379:9: note: expanded from macro '__compiletime_assert'
if (!(condition)) \
^~~~~~~~~
include/linux/container_of.h:19:26: note: expanded from macro 'container_of'
void *__mptr = (void *)(ptr); \
^~~
include/linux/jump_label.h:196:8: note: forward declaration of 'struct module'
struct module;
^
In file included from kernel/bpf/verifier.c:27:
>> kernel/bpf/../module/internal.h:212:2: error: incomplete definition of type 'struct module'
list_for_each_entry_rcu(mod, &modules, list,
^ ~~~
include/linux/rculist.h:393:27: note: expanded from macro 'list_for_each_entry_rcu'
pos = list_entry_rcu(pos->member.next, typeof(*pos), member))
~~~^
include/linux/rculist.h:307:25: note: expanded from macro 'list_entry_rcu'
container_of(READ_ONCE(ptr), type, member)
^~~
include/asm-generic/rwonce.h:49:33: note: expanded from macro 'READ_ONCE'
compiletime_assert_rwonce_type(x); \
^
note: (skipping 3 expansions in backtrace; use -fmacro-backtrace-limit=0 to see all)
include/linux/compiler_types.h:387:23: note: expanded from macro '_compiletime_assert'
__compiletime_assert(condition, msg, prefix, suffix)
^~~~~~~~~
include/linux/compiler_types.h:379:9: note: expanded from macro '__compiletime_assert'
if (!(condition)) \
^~~~~~~~~
include/linux/container_of.h:19:26: note: expanded from macro 'container_of'
void *__mptr = (void *)(ptr); \
^~~
include/linux/jump_label.h:196:8: note: forward declaration of 'struct module'
struct module;
^
In file included from kernel/bpf/verifier.c:27:
>> kernel/bpf/../module/internal.h:212:2: error: incomplete definition of type 'struct module'
list_for_each_entry_rcu(mod, &modules, list,
^ ~~~
include/linux/rculist.h:393:27: note: expanded from macro 'list_for_each_entry_rcu'
pos = list_entry_rcu(pos->member.next, typeof(*pos), member))
~~~^
include/linux/rculist.h:307:25: note: expanded from macro 'list_entry_rcu'
container_of(READ_ONCE(ptr), type, member)
^~~
include/asm-generic/rwonce.h:49:33: note: expanded from macro 'READ_ONCE'
compiletime_assert_rwonce_type(x); \
^
note: (skipping 3 expansions in backtrace; use -fmacro-backtrace-limit=0 to see all)
include/linux/compiler_types.h:387:23: note: expanded from macro '_compiletime_assert'
__compiletime_assert(condition, msg, prefix, suffix)
^~~~~~~~~
include/linux/compiler_types.h:379:9: note: expanded from macro '__compiletime_assert'
if (!(condition)) \
^~~~~~~~~
include/linux/container_of.h:19:26: note: expanded from macro 'container_of'
void *__mptr = (void *)(ptr); \
^~~
include/linux/jump_label.h:196:8: note: forward declaration of 'struct module'
struct module;
^
In file included from kernel/bpf/verifier.c:27:
>> kernel/bpf/../module/internal.h:212:2: error: incomplete definition of type 'struct module'
list_for_each_entry_rcu(mod, &modules, list,
^ ~~~
include/linux/rculist.h:393:27: note: expanded from macro 'list_for_each_entry_rcu'
pos = list_entry_rcu(pos->member.next, typeof(*pos), member))
~~~^
include/linux/rculist.h:307:25: note: expanded from macro 'list_entry_rcu'
container_of(READ_ONCE(ptr), type, member)
^~~
include/asm-generic/rwonce.h:49:33: note: expanded from macro 'READ_ONCE'
compiletime_assert_rwonce_type(x); \
^
note: (skipping 2 expansions in backtrace; use -fmacro-backtrace-limit=0 to see all)
include/linux/compiler_types.h:387:23: note: expanded from macro '_compiletime_assert'
__compiletime_assert(condition, msg, prefix, suffix)
^~~~~~~~~
include/linux/compiler_types.h:379:9: note: expanded from macro '__compiletime_assert'
if (!(condition)) \
^~~~~~~~~
include/linux/container_of.h:19:26: note: expanded from macro 'container_of'
void *__mptr = (void *)(ptr); \
^~~
include/linux/jump_label.h:196:8: note: forward declaration of 'struct module'
struct module;
^
In file included from kernel/bpf/verifier.c:27:
>> kernel/bpf/../module/internal.h:212:2: error: incomplete definition of type 'struct module'
list_for_each_entry_rcu(mod, &modules, list,
^ ~~~
include/linux/rculist.h:393:27: note: expanded from macro 'list_for_each_entry_rcu'
pos = list_entry_rcu(pos->member.next, typeof(*pos), member))
~~~^
include/linux/rculist.h:307:25: note: expanded from macro 'list_entry_rcu'
container_of(READ_ONCE(ptr), type, member)
^~~
include/asm-generic/rwonce.h:50:14: note: expanded from macro 'READ_ONCE'
__READ_ONCE(x); \
^
include/asm-generic/rwonce.h:44:65: note: expanded from macro '__READ_ONCE'
#define __READ_ONCE(x) (*(const volatile __unqual_scalar_typeof(x) *)&(x))
^
include/linux/compiler_types.h:355:13: note: expanded from macro '__unqual_scalar_typeof'
_Generic((x), \
^
include/linux/container_of.h:19:26: note: expanded from macro 'container_of'
void *__mptr = (void *)(ptr); \
^~~
include/linux/jump_label.h:196:8: note: forward declaration of 'struct module'
struct module;
^
In file included from kernel/bpf/verifier.c:27:
>> kernel/bpf/../module/internal.h:212:2: error: incomplete definition of type 'struct module'
list_for_each_entry_rcu(mod, &modules, list,
^ ~~~
include/linux/rculist.h:393:27: note: expanded from macro 'list_for_each_entry_rcu'
pos = list_entry_rcu(pos->member.next, typeof(*pos), member))
~~~^
include/linux/rculist.h:307:25: note: expanded from macro 'list_entry_rcu'
container_of(READ_ONCE(ptr), type, member)
^~~
include/asm-generic/rwonce.h:50:14: note: expanded from macro 'READ_ONCE'
__READ_ONCE(x); \
^
include/asm-generic/rwonce.h:44:65: note: expanded from macro '__READ_ONCE'
#define __READ_ONCE(x) (*(const volatile __unqual_scalar_typeof(x) *)&(x))
^
include/linux/compiler_types.h:362:15: note: expanded from macro '__unqual_scalar_typeof'
default: (x)))
^
include/linux/container_of.h:19:26: note: expanded from macro 'container_of'
void *__mptr = (void *)(ptr); \
^~~
include/linux/jump_label.h:196:8: note: forward declaration of 'struct module'
struct module;
^
In file included from kernel/bpf/verifier.c:27:
>> kernel/bpf/../module/internal.h:212:2: error: incomplete definition of type 'struct module'
list_for_each_entry_rcu(mod, &modules, list,
^ ~~~
include/linux/rculist.h:393:27: note: expanded from macro 'list_for_each_entry_rcu'
pos = list_entry_rcu(pos->member.next, typeof(*pos), member))
~~~^
include/linux/rculist.h:307:25: note: expanded from macro 'list_entry_rcu'
container_of(READ_ONCE(ptr), type, member)
^~~
include/asm-generic/rwonce.h:50:14: note: expanded from macro 'READ_ONCE'
__READ_ONCE(x); \
^
include/asm-generic/rwonce.h:44:72: note: expanded from macro '__READ_ONCE'
#define __READ_ONCE(x) (*(const volatile __unqual_scalar_typeof(x) *)&(x))
^
include/linux/container_of.h:19:26: note: expanded from macro 'container_of'
void *__mptr = (void *)(ptr); \
^~~
include/linux/jump_label.h:196:8: note: forward declaration of 'struct module'
struct module;
^
In file included from kernel/bpf/verifier.c:27:
>> kernel/bpf/../module/internal.h:212:2: error: operand of type 'void' where arithmetic or pointer type is required
list_for_each_entry_rcu(mod, &modules, list,
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/rculist.h:393:9: note: expanded from macro 'list_for_each_entry_rcu'
pos = list_entry_rcu(pos->member.next, typeof(*pos), member))
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/rculist.h:307:2: note: expanded from macro 'list_entry_rcu'
container_of(READ_ONCE(ptr), type, member)
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/container_of.h:19:25: note: expanded from macro 'container_of'
void *__mptr = (void *)(ptr); \
^~~~~
In file included from kernel/bpf/verifier.c:27:
>> kernel/bpf/../module/internal.h:212:2: error: incomplete definition of type 'struct module'
list_for_each_entry_rcu(mod, &modules, list,
^ ~~~
include/linux/rculist.h:393:27: note: expanded from macro 'list_for_each_entry_rcu'
pos = list_entry_rcu(pos->member.next, typeof(*pos), member))
~~~^
include/linux/rculist.h:307:25: note: expanded from macro 'list_entry_rcu'
container_of(READ_ONCE(ptr), type, member)
^~~
include/asm-generic/rwonce.h:49:33: note: expanded from macro 'READ_ONCE'
compiletime_assert_rwonce_type(x); \
^
note: (skipping 6 expansions in backtrace; use -fmacro-backtrace-limit=0 to see all)
include/linux/compiler_types.h:340:63: note: expanded from macro '__same_type'
#define __same_type(a, b) __builtin_types_compatible_p(typeof(a), typeof(b))
^
include/linux/build_bug.h:77:50: note: expanded from macro 'static_assert'
#define static_assert(expr, ...) __static_assert(expr, ##__VA_ARGS__, #expr)
^~~~
include/linux/build_bug.h:78:56: note: expanded from macro '__static_assert'
#define __static_assert(expr, msg, ...) _Static_assert(expr, msg)
^~~~
include/linux/jump_label.h:196:8: note: forward declaration of 'struct module'
struct module;
^
In file included from kernel/bpf/verifier.c:27:
>> kernel/bpf/../module/internal.h:212:2: error: incomplete definition of type 'struct module'
list_for_each_entry_rcu(mod, &modules, list,
^ ~~~
include/linux/rculist.h:393:27: note: expanded from macro 'list_for_each_entry_rcu'
pos = list_entry_rcu(pos->member.next, typeof(*pos), member))
~~~^
include/linux/rculist.h:307:25: note: expanded from macro 'list_entry_rcu'
container_of(READ_ONCE(ptr), type, member)
^~~
include/asm-generic/rwonce.h:49:33: note: expanded from macro 'READ_ONCE'
compiletime_assert_rwonce_type(x); \
^
note: (skipping 6 expansions in backtrace; use -fmacro-backtrace-limit=0 to see all)
include/linux/compiler_types.h:340:63: note: expanded from macro '__same_type'
#define __same_type(a, b) __builtin_types_compatible_p(typeof(a), typeof(b))
^
include/linux/build_bug.h:77:50: note: expanded from macro 'static_assert'
#define static_assert(expr, ...) __static_assert(expr, ##__VA_ARGS__, #expr)
^~~~
include/linux/build_bug.h:78:56: note: expanded from macro '__static_assert'
#define __static_assert(expr, msg, ...) _Static_assert(expr, msg)
^~~~
include/linux/jump_label.h:196:8: note: forward declaration of 'struct module'
struct module;
^
In file included from kernel/bpf/verifier.c:27:
>> kernel/bpf/../module/internal.h:212:2: error: incomplete definition of type 'struct module'
list_for_each_entry_rcu(mod, &modules, list,
^ ~~~
include/linux/rculist.h:393:27: note: expanded from macro 'list_for_each_entry_rcu'
pos = list_entry_rcu(pos->member.next, typeof(*pos), member))
~~~^
include/linux/rculist.h:307:25: note: expanded from macro 'list_entry_rcu'
container_of(READ_ONCE(ptr), type, member)
^~~
include/asm-generic/rwonce.h:49:33: note: expanded from macro 'READ_ONCE'
compiletime_assert_rwonce_type(x); \
^
note: (skipping 6 expansions in backtrace; use -fmacro-backtrace-limit=0 to see all)
include/linux/compiler_types.h:340:63: note: expanded from macro '__same_type'
#define __same_type(a, b) __builtin_types_compatible_p(typeof(a), typeof(b))
^
include/linux/build_bug.h:77:50: note: expanded from macro 'static_assert'
#define static_assert(expr, ...) __static_assert(expr, ##__VA_ARGS__, #expr)
^~~~
include/linux/build_bug.h:78:56: note: expanded from macro '__static_assert'
#define __static_assert(expr, msg, ...) _Static_assert(expr, msg)
^~~~
include/linux/jump_label.h:196:8: note: forward declaration of 'struct module'
struct module;
^
In file included from kernel/bpf/verifier.c:27:
>> kernel/bpf/../module/internal.h:212:2: error: incomplete definition of type 'struct module'
list_for_each_entry_rcu(mod, &modules, list,
^ ~~~
include/linux/rculist.h:393:27: note: expanded from macro 'list_for_each_entry_rcu'
pos = list_entry_rcu(pos->member.next, typeof(*pos), member))
~~~^
include/linux/rculist.h:307:25: note: expanded from macro 'list_entry_rcu'
container_of(READ_ONCE(ptr), type, member)
^~~
include/asm-generic/rwonce.h:49:33: note: expanded from macro 'READ_ONCE'
compiletime_assert_rwonce_type(x); \
^
note: (skipping 6 expansions in backtrace; use -fmacro-backtrace-limit=0 to see all)
include/linux/compiler_types.h:340:63: note: expanded from macro '__same_type'
#define __same_type(a, b) __builtin_types_compatible_p(typeof(a), typeof(b))
^
include/linux/build_bug.h:77:50: note: expanded from macro 'static_assert'
#define static_assert(expr, ...) __static_assert(expr, ##__VA_ARGS__, #expr)
^~~~
include/linux/build_bug.h:78:56: note: expanded from macro '__static_assert'
#define __static_assert(expr, msg, ...) _Static_assert(expr, msg)
^~~~
include/linux/jump_label.h:196:8: note: forward declaration of 'struct module'
struct module;
^
In file included from kernel/bpf/verifier.c:27:
>> kernel/bpf/../module/internal.h:212:2: error: incomplete definition of type 'struct module'
list_for_each_entry_rcu(mod, &modules, list,
^ ~~~
include/linux/rculist.h:393:27: note: expanded from macro 'list_for_each_entry_rcu'
pos = list_entry_rcu(pos->member.next, typeof(*pos), member))
~~~^
include/linux/rculist.h:307:25: note: expanded from macro 'list_entry_rcu'
container_of(READ_ONCE(ptr), type, member)
^~~
include/asm-generic/rwonce.h:49:33: note: expanded from macro 'READ_ONCE'
compiletime_assert_rwonce_type(x); \
^
note: (skipping 5 expansions in backtrace; use -fmacro-backtrace-limit=0 to see all)
include/linux/compiler_types.h:340:63: note: expanded from macro '__same_type'
#define __same_type(a, b) __builtin_types_compatible_p(typeof(a), typeof(b))
^
include/linux/build_bug.h:77:50: note: expanded from macro 'static_assert'
#define static_assert(expr, ...) __static_assert(expr, ##__VA_ARGS__, #expr)
^~~~
include/linux/build_bug.h:78:56: note: expanded from macro '__static_assert'
#define __static_assert(expr, msg, ...) _Static_assert(expr, msg)
^~~~
include/linux/jump_label.h:196:8: note: forward declaration of 'struct module'
struct module;
^
In file included from kernel/bpf/verifier.c:27:
>> kernel/bpf/../module/internal.h:212:2: error: incomplete definition of type 'struct module'
list_for_each_entry_rcu(mod, &modules, list,
^ ~~~
include/linux/rculist.h:393:27: note: expanded from macro 'list_for_each_entry_rcu'
pos = list_entry_rcu(pos->member.next, typeof(*pos), member))
~~~^
include/linux/rculist.h:307:25: note: expanded from macro 'list_entry_rcu'
container_of(READ_ONCE(ptr), type, member)
^~~
include/asm-generic/rwonce.h:50:14: note: expanded from macro 'READ_ONCE'
__READ_ONCE(x); \
^
note: (skipping 3 expansions in backtrace; use -fmacro-backtrace-limit=0 to see all)
include/linux/compiler_types.h:340:63: note: expanded from macro '__same_type'
#define __same_type(a, b) __builtin_types_compatible_p(typeof(a), typeof(b))
^
include/linux/build_bug.h:77:50: note: expanded from macro 'static_assert'
#define static_assert(expr, ...) __static_assert(expr, ##__VA_ARGS__, #expr)
^~~~
include/linux/build_bug.h:78:56: note: expanded from macro '__static_assert'
#define __static_assert(expr, msg, ...) _Static_assert(expr, msg)
^~~~
include/linux/jump_label.h:196:8: note: forward declaration of 'struct module'
struct module;
^
fatal error: too many errors emitted, stopping now [-ferror-limit=]
12 warnings and 20 errors generated.
vim +212 kernel/bpf/../module/internal.h
58d208de3e8d87 Aaron Tomlin 2022-03-22 204
58d208de3e8d87 Aaron Tomlin 2022-03-22 205 static inline void mod_tree_insert(struct module *mod) { }
58d208de3e8d87 Aaron Tomlin 2022-03-22 206 static inline void mod_tree_remove_init(struct module *mod) { }
58d208de3e8d87 Aaron Tomlin 2022-03-22 207 static inline void mod_tree_remove(struct module *mod) { }
446d55666d5599 Christophe Leroy 2022-02-23 208 static inline struct module *mod_find(unsigned long addr, struct mod_tree_root *tree)
58d208de3e8d87 Aaron Tomlin 2022-03-22 209 {
58d208de3e8d87 Aaron Tomlin 2022-03-22 210 struct module *mod;
58d208de3e8d87 Aaron Tomlin 2022-03-22 211
58d208de3e8d87 Aaron Tomlin 2022-03-22 @212 list_for_each_entry_rcu(mod, &modules, list,
58d208de3e8d87 Aaron Tomlin 2022-03-22 213 lockdep_is_held(&module_mutex)) {
58d208de3e8d87 Aaron Tomlin 2022-03-22 214 if (within_module(addr, mod))
58d208de3e8d87 Aaron Tomlin 2022-03-22 215 return mod;
58d208de3e8d87 Aaron Tomlin 2022-03-22 216 }
58d208de3e8d87 Aaron Tomlin 2022-03-22 217
58d208de3e8d87 Aaron Tomlin 2022-03-22 218 return NULL;
58d208de3e8d87 Aaron Tomlin 2022-03-22 219 }
58d208de3e8d87 Aaron Tomlin 2022-03-22 220 #endif /* CONFIG_MODULES_TREE_LOOKUP */
b33465fe9c52a3 Aaron Tomlin 2022-03-22 221
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH bpf-next v8 1/2] bpf: Fix attaching fentry/fexit/fmod_ret/lsm to modules
2023-02-22 14:35 ` [PATCH bpf-next v8 1/2] bpf: " Viktor Malik
2023-02-23 1:42 ` kernel test robot
@ 2023-02-27 12:58 ` Jiri Olsa
1 sibling, 0 replies; 7+ messages in thread
From: Jiri Olsa @ 2023-02-27 12:58 UTC (permalink / raw)
To: Viktor Malik
Cc: bpf, Alexei Starovoitov, Daniel Borkmann, John Fastabend,
Andrii Nakryiko, Martin KaFai Lau, Song Liu, Yonghong Song,
KP Singh, Stanislav Fomichev, Hao Luo, Luis Chamberlain
On Wed, Feb 22, 2023 at 03:35:28PM +0100, Viktor Malik wrote:
SNIP
> diff --git a/kernel/bpf/trampoline.c b/kernel/bpf/trampoline.c
> index d0ed7d6f5eec..ebb20bf252c7 100644
> --- a/kernel/bpf/trampoline.c
> +++ b/kernel/bpf/trampoline.c
> @@ -172,26 +172,6 @@ static struct bpf_trampoline *bpf_trampoline_lookup(u64 key)
> return tr;
> }
>
nit, I think we can now remove linux/module.h include
jirka
> -static int bpf_trampoline_module_get(struct bpf_trampoline *tr)
> -{
> - struct module *mod;
> - int err = 0;
> -
> - preempt_disable();
> - mod = __module_text_address((unsigned long) tr->func.addr);
> - if (mod && !try_module_get(mod))
> - err = -ENOENT;
> - preempt_enable();
> - tr->mod = mod;
> - return err;
> -}
> -
> -static void bpf_trampoline_module_put(struct bpf_trampoline *tr)
> -{
> - module_put(tr->mod);
> - tr->mod = NULL;
> -}
> -
> static int unregister_fentry(struct bpf_trampoline *tr, void *old_addr)
> {
> void *ip = tr->func.addr;
> @@ -202,8 +182,6 @@ static int unregister_fentry(struct bpf_trampoline *tr, void *old_addr)
> else
> ret = bpf_arch_text_poke(ip, BPF_MOD_CALL, old_addr, NULL);
>
> - if (!ret)
> - bpf_trampoline_module_put(tr);
> return ret;
> }
>
> @@ -238,9 +216,6 @@ static int register_fentry(struct bpf_trampoline *tr, void *new_addr)
> tr->func.ftrace_managed = true;
> }
>
> - if (bpf_trampoline_module_get(tr))
> - return -ENOENT;
> -
> if (tr->func.ftrace_managed) {
> ftrace_set_filter_ip(tr->fops, (unsigned long)ip, 0, 1);
> ret = register_ftrace_direct_multi(tr->fops, (long)new_addr);
> @@ -248,8 +223,6 @@ static int register_fentry(struct bpf_trampoline *tr, void *new_addr)
> ret = bpf_arch_text_poke(ip, BPF_MOD_CALL, NULL, new_addr);
> }
>
> - if (ret)
> - bpf_trampoline_module_put(tr);
> return ret;
> }
>
SNIP
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH bpf-next v8 2/2] bpf/selftests: Test fentry attachment to shadowed functions
2023-02-22 14:35 ` [PATCH bpf-next v8 2/2] bpf/selftests: Test fentry attachment to shadowed functions Viktor Malik
@ 2023-02-27 12:58 ` Jiri Olsa
0 siblings, 0 replies; 7+ messages in thread
From: Jiri Olsa @ 2023-02-27 12:58 UTC (permalink / raw)
To: Viktor Malik
Cc: bpf, Alexei Starovoitov, Daniel Borkmann, John Fastabend,
Andrii Nakryiko, Martin KaFai Lau, Song Liu, Yonghong Song,
KP Singh, Stanislav Fomichev, Hao Luo, Luis Chamberlain
On Wed, Feb 22, 2023 at 03:35:29PM +0100, Viktor Malik wrote:
SNIP
> + for (i = 0; i < 2; i++) {
> + load_opts.attach_btf_id = btf_id[i];
> + load_opts.attach_btf_obj_fd = btf_fd[i];
> + prog_fd[i] = bpf_prog_load(BPF_PROG_TYPE_TRACING, NULL, "GPL",
> + trace_program,
> + sizeof(trace_program) / sizeof(struct bpf_insn),
> + &load_opts);
> + if (!ASSERT_GE(prog_fd[i], 0, "bpf_prog_load"))
> + goto out;
> +
> + /* If the verifier incorrectly resolves addresses of the
> + * shadowed functions and uses the same address for both the
> + * vmlinux and the bpf_testmod functions, this will fail on
> + * attempting to create two trampolines for the same address,
> + * which is forbidden.
> + */
> + link_fd[i] = bpf_link_create(prog_fd[i], 0, BPF_TRACE_FENTRY, NULL);
> + if (!ASSERT_GE(link_fd[i], 0, "bpf_link_create"))
> + goto out;
> + }
> +
> + err = bpf_prog_test_run_opts(prog_fd[0], NULL);
> + ASSERT_OK(err, "running test");
> +
> +out:
> + btf__free(vmlinux_btf);
> + btf__free(mod_btf);
> + for (i = 0; i < 2; i++) {
> + if (btf_fd[i])
> + close(btf_fd[i]);
> + if (prog_fd[i])
> + close(prog_fd[i]);
should we check prog_fd[i] > 0 ? same below
jirka
> + if (link_fd[i])
> + close(link_fd[i]);
> + }
> +}
> --
> 2.39.1
>
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH bpf-next v8 0/2] Fix attaching fentry/fexit/fmod_ret/lsm to modules
2023-02-22 14:35 [PATCH bpf-next v8 0/2] Fix attaching fentry/fexit/fmod_ret/lsm to modules Viktor Malik
2023-02-22 14:35 ` [PATCH bpf-next v8 1/2] bpf: " Viktor Malik
2023-02-22 14:35 ` [PATCH bpf-next v8 2/2] bpf/selftests: Test fentry attachment to shadowed functions Viktor Malik
@ 2023-02-27 12:58 ` Jiri Olsa
2 siblings, 0 replies; 7+ messages in thread
From: Jiri Olsa @ 2023-02-27 12:58 UTC (permalink / raw)
To: Viktor Malik
Cc: bpf, Alexei Starovoitov, Daniel Borkmann, John Fastabend,
Andrii Nakryiko, Martin KaFai Lau, Song Liu, Yonghong Song,
KP Singh, Stanislav Fomichev, Hao Luo, Luis Chamberlain
On Wed, Feb 22, 2023 at 03:35:27PM +0100, Viktor Malik wrote:
> I noticed that the verifier behaves incorrectly when attaching to fentry
> of multiple functions of the same name located in different modules (or
> in vmlinux). The reason for this is that if the target program is not
> specified, the verifier will search kallsyms for the trampoline address
> to attach to. The entire kallsyms is always searched, not respecting the
> module in which the function to attach to is located.
>
> As Yonghong correctly pointed out, there is yet another issue - the
> trampoline acquires the module reference in register_fentry which means
> that if the module is unloaded between the place where the address is
> found in the verifier and register_fentry, it is possible that another
> module is loaded to the same address in the meantime, which may lead to
> errors.
>
> This patch fixes the above issues by extracting the module name from the
> BTF of the attachment target (which must be specified) and by doing the
> search in kallsyms of the correct module. At the same time, the module
> reference is acquired right after the address is found and only released
> right before the program itself is unloaded.
>
> ---
> Changes in v8:
> - added module_put to error paths in bpf_check_attach_target after the
> module reference is acquired
I sent 2 other comments, but other than that it looks good
Acked-by: Jiri Olsa <jolsa@kernel.org>
jirka
>
> Changes in v7:
> - refactored the module reference manipulation (comments by Jiri Olsa)
> - cleaned up the test (comments by Andrii Nakryiko)
>
> Changes in v6:
> - storing the module reference inside bpf_prog_aux instead of
> bpf_trampoline and releasing it when the program is unloaded
> (suggested by Jiri Olsa)
>
> Changes in v5:
> - fixed acquiring and releasing of module references by trampolines to
> prevent modules being unloaded between address lookup and trampoline
> allocation
>
> Changes in v4:
> - reworked module kallsyms lookup approach using existing functions,
> verifier now calls btf_try_get_module to retrieve the module and
> find_kallsyms_symbol_value to get the symbol address (suggested by
> Alexei)
> - included Jiri Olsa's comments
> - improved description of the new test and added it as a comment into
> the test source
>
> Changes in v3:
> - added trivial implementation for kallsyms_lookup_name_in_module() for
> !CONFIG_MODULES (noticed by test robot, fix suggested by Hao Luo)
>
> Changes in v2:
> - introduced and used more space-efficient kallsyms lookup function,
> suggested by Jiri Olsa
> - included Hao Luo's comments
>
> Viktor Malik (2):
> bpf: Fix attaching fentry/fexit/fmod_ret/lsm to modules
> bpf/selftests: Test fentry attachment to shadowed functions
>
> include/linux/bpf.h | 2 +
> kernel/bpf/syscall.c | 6 +
> kernel/bpf/trampoline.c | 27 ----
> kernel/bpf/verifier.c | 18 ++-
> kernel/module/internal.h | 5 +
> net/bpf/test_run.c | 5 +
> .../selftests/bpf/bpf_testmod/bpf_testmod.c | 6 +
> .../bpf/prog_tests/module_attach_shadow.c | 128 ++++++++++++++++++
> 8 files changed, 169 insertions(+), 28 deletions(-)
> create mode 100644 tools/testing/selftests/bpf/prog_tests/module_attach_shadow.c
>
> --
> 2.39.1
>
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2023-02-27 12:58 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-02-22 14:35 [PATCH bpf-next v8 0/2] Fix attaching fentry/fexit/fmod_ret/lsm to modules Viktor Malik
2023-02-22 14:35 ` [PATCH bpf-next v8 1/2] bpf: " Viktor Malik
2023-02-23 1:42 ` kernel test robot
2023-02-27 12:58 ` Jiri Olsa
2023-02-22 14:35 ` [PATCH bpf-next v8 2/2] bpf/selftests: Test fentry attachment to shadowed functions Viktor Malik
2023-02-27 12:58 ` Jiri Olsa
2023-02-27 12:58 ` [PATCH bpf-next v8 0/2] Fix attaching fentry/fexit/fmod_ret/lsm to modules Jiri Olsa
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox