Message ID | 20210906163635.302307-1-jean-philippe@linaro.org (mailing list archive) |
---|---|
State | Accepted |
Commit | 3a029e1f3d6e2ee809e85abecce619a48016bd4b |
Delegated to: | BPF |
Headers | show |
Series | [bpf-next,v2] selftests/bpf: Fix build of task_pt_regs test for arm64 | expand |
Context | Check | Description |
---|---|---|
netdev/cover_letter | success | Link |
netdev/fixes_present | success | Link |
netdev/patch_count | success | Link |
netdev/tree_selection | success | Clearly marked for bpf-next |
netdev/subject_prefix | success | Link |
netdev/cc_maintainers | warning | 1 maintainers not CCed: netdev@vger.kernel.org |
netdev/source_inline | success | Was 0 now: 0 |
netdev/verify_signedoff | success | Link |
netdev/module_param | success | Was 0 now: 0 |
netdev/build_32bit | fail | Errors and warnings before: 384 this patch: 433 |
netdev/kdoc | success | Errors and warnings before: 0 this patch: 0 |
netdev/verify_fixes | success | Link |
netdev/checkpatch | success | total: 0 errors, 0 warnings, 0 checks, 40 lines checked |
netdev/build_allmodconfig_warn | fail | Errors and warnings before: 508 this patch: 450 |
netdev/header_inline | success | Link |
bpf/vmtest-bpf-next | fail | VM_Test |
bpf/vmtest-bpf-next-PR | fail | PR summary |
On Mon, 2021-09-06 at 17:36 +0100, Jean-Philippe Brucker wrote: > struct pt_regs is not exported to userspace on all archs. arm64 and > s390 > export "user_pt_regs" instead, which causes build failure at the > moment: > > progs/test_task_pt_regs.c:8:16: error: variable has incomplete type > 'struct pt_regs' > struct pt_regs current_regs = {}; > > Instead of using pt_regs from ptrace.h, use the larger kernel struct > from vmlinux.h directly. Since the test runner task_pt_regs.c does not > have access to the kernel struct definition, copy it into a char array. > > Fixes: 576d47bb1a92 ("bpf: selftests: Add bpf_task_pt_regs() selftest") > Suggested-by: Andrii Nakryiko <andrii.nakryiko@gmail.com> > Signed-off-by: Jean-Philippe Brucker <jean-philippe@linaro.org> > --- > v2: Work on struct pt_regs from vmlinux.h > v1: > https://lore.kernel.org/bpf/20210902090925.2010528-1-jean-philippe@linaro.org/ > --- > .../selftests/bpf/prog_tests/task_pt_regs.c | 1 - > .../selftests/bpf/progs/test_task_pt_regs.c | 19 +++++++++++++------ > 2 files changed, 13 insertions(+), 7 deletions(-) > > diff --git a/tools/testing/selftests/bpf/prog_tests/task_pt_regs.c > b/tools/testing/selftests/bpf/prog_tests/task_pt_regs.c > index 53f0e0fa1a53..37c20b5ffa70 100644 > --- a/tools/testing/selftests/bpf/prog_tests/task_pt_regs.c > +++ b/tools/testing/selftests/bpf/prog_tests/task_pt_regs.c > @@ -1,7 +1,6 @@ > // SPDX-License-Identifier: GPL-2.0 > #define _GNU_SOURCE > #include <test_progs.h> > -#include <linux/ptrace.h> > #include "test_task_pt_regs.skel.h" > > void test_task_pt_regs(void) > diff --git a/tools/testing/selftests/bpf/progs/test_task_pt_regs.c > b/tools/testing/selftests/bpf/progs/test_task_pt_regs.c > index 6c059f1cfa1b..e6cb09259408 100644 > --- a/tools/testing/selftests/bpf/progs/test_task_pt_regs.c > +++ b/tools/testing/selftests/bpf/progs/test_task_pt_regs.c > @@ -1,12 +1,17 @@ > // SPDX-License-Identifier: GPL-2.0 > > -#include <linux/ptrace.h> > -#include <linux/bpf.h> > +#include "vmlinux.h" > #include <bpf/bpf_helpers.h> > #include <bpf/bpf_tracing.h> > > -struct pt_regs current_regs = {}; > -struct pt_regs ctx_regs = {}; > +#define PT_REGS_SIZE sizeof(struct pt_regs) > + > +/* > + * The kernel struct pt_regs isn't exported in its entirety to > userspace. > + * Pass it as an array to task_pt_regs.c > + */ > +char current_regs[PT_REGS_SIZE] = {}; > +char ctx_regs[PT_REGS_SIZE] = {}; > int uprobe_res = 0; > > SEC("uprobe/trigger_func") > @@ -17,8 +22,10 @@ int handle_uprobe(struct pt_regs *ctx) > > current = bpf_get_current_task_btf(); > regs = (struct pt_regs *) bpf_task_pt_regs(current); > - __builtin_memcpy(¤t_regs, regs, sizeof(*regs)); > - __builtin_memcpy(&ctx_regs, ctx, sizeof(*ctx)); > + if (bpf_probe_read_kernel(current_regs, PT_REGS_SIZE, regs)) > + return 0; > + if (bpf_probe_read_kernel(ctx_regs, PT_REGS_SIZE, ctx)) > + return 0; > > /* Prove that uprobe was run */ > uprobe_res = 1; I've tested this patch on s390 and it does indeed fix the build issue. Thanks! Tested-by: Ilya Leoshkevich <iii@linux.ibm.com> Acked-by: Ilya Leoshkevich <iii@linux.ibm.com>
Hello: This patch was applied to bpf/bpf.git (refs/heads/master): On Mon, 6 Sep 2021 17:36:38 +0100 you wrote: > struct pt_regs is not exported to userspace on all archs. arm64 and s390 > export "user_pt_regs" instead, which causes build failure at the moment: > > progs/test_task_pt_regs.c:8:16: error: variable has incomplete type 'struct pt_regs' > struct pt_regs current_regs = {}; > > Instead of using pt_regs from ptrace.h, use the larger kernel struct > from vmlinux.h directly. Since the test runner task_pt_regs.c does not > have access to the kernel struct definition, copy it into a char array. > > [...] Here is the summary with links: - [bpf-next,v2] selftests/bpf: Fix build of task_pt_regs test for arm64 https://git.kernel.org/bpf/bpf/c/3a029e1f3d6e You are awesome, thank you! -- Deet-doot-dot, I am a bot. https://korg.docs.kernel.org/patchwork/pwbot.html
diff --git a/tools/testing/selftests/bpf/prog_tests/task_pt_regs.c b/tools/testing/selftests/bpf/prog_tests/task_pt_regs.c index 53f0e0fa1a53..37c20b5ffa70 100644 --- a/tools/testing/selftests/bpf/prog_tests/task_pt_regs.c +++ b/tools/testing/selftests/bpf/prog_tests/task_pt_regs.c @@ -1,7 +1,6 @@ // SPDX-License-Identifier: GPL-2.0 #define _GNU_SOURCE #include <test_progs.h> -#include <linux/ptrace.h> #include "test_task_pt_regs.skel.h" void test_task_pt_regs(void) diff --git a/tools/testing/selftests/bpf/progs/test_task_pt_regs.c b/tools/testing/selftests/bpf/progs/test_task_pt_regs.c index 6c059f1cfa1b..e6cb09259408 100644 --- a/tools/testing/selftests/bpf/progs/test_task_pt_regs.c +++ b/tools/testing/selftests/bpf/progs/test_task_pt_regs.c @@ -1,12 +1,17 @@ // SPDX-License-Identifier: GPL-2.0 -#include <linux/ptrace.h> -#include <linux/bpf.h> +#include "vmlinux.h" #include <bpf/bpf_helpers.h> #include <bpf/bpf_tracing.h> -struct pt_regs current_regs = {}; -struct pt_regs ctx_regs = {}; +#define PT_REGS_SIZE sizeof(struct pt_regs) + +/* + * The kernel struct pt_regs isn't exported in its entirety to userspace. + * Pass it as an array to task_pt_regs.c + */ +char current_regs[PT_REGS_SIZE] = {}; +char ctx_regs[PT_REGS_SIZE] = {}; int uprobe_res = 0; SEC("uprobe/trigger_func") @@ -17,8 +22,10 @@ int handle_uprobe(struct pt_regs *ctx) current = bpf_get_current_task_btf(); regs = (struct pt_regs *) bpf_task_pt_regs(current); - __builtin_memcpy(¤t_regs, regs, sizeof(*regs)); - __builtin_memcpy(&ctx_regs, ctx, sizeof(*ctx)); + if (bpf_probe_read_kernel(current_regs, PT_REGS_SIZE, regs)) + return 0; + if (bpf_probe_read_kernel(ctx_regs, PT_REGS_SIZE, ctx)) + return 0; /* Prove that uprobe was run */ uprobe_res = 1;
struct pt_regs is not exported to userspace on all archs. arm64 and s390 export "user_pt_regs" instead, which causes build failure at the moment: progs/test_task_pt_regs.c:8:16: error: variable has incomplete type 'struct pt_regs' struct pt_regs current_regs = {}; Instead of using pt_regs from ptrace.h, use the larger kernel struct from vmlinux.h directly. Since the test runner task_pt_regs.c does not have access to the kernel struct definition, copy it into a char array. Fixes: 576d47bb1a92 ("bpf: selftests: Add bpf_task_pt_regs() selftest") Suggested-by: Andrii Nakryiko <andrii.nakryiko@gmail.com> Signed-off-by: Jean-Philippe Brucker <jean-philippe@linaro.org> --- v2: Work on struct pt_regs from vmlinux.h v1: https://lore.kernel.org/bpf/20210902090925.2010528-1-jean-philippe@linaro.org/ --- .../selftests/bpf/prog_tests/task_pt_regs.c | 1 - .../selftests/bpf/progs/test_task_pt_regs.c | 19 +++++++++++++------ 2 files changed, 13 insertions(+), 7 deletions(-)