bpftool: Align bpf_load_and_run_opts insns and data

A C string lacks alignment so use aligned arrays to avoid potential
alignment problems. Switch to using sizeof (less 1 for the \0
terminator) rather than a hardcode size constant.

Signed-off-by: Ian Rogers <irogers@google.com>
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Acked-by: Quentin Monnet <quentin@isovalent.com>
Link: https://lore.kernel.org/bpf/20231007044439.25171-2-irogers@google.com
This commit is contained in:
Ian Rogers 2023-10-06 21:44:39 -07:00 committed by Andrii Nakryiko
parent 23671f4dfd
commit 1be84ca53c
1 changed files with 23 additions and 20 deletions

View File

@ -708,17 +708,22 @@ static int gen_trace(struct bpf_object *obj, const char *obj_name, const char *h
codegen("\ codegen("\
\n\ \n\
skel->%1$s = skel_prep_map_data((void *)\"\\ \n\ { \n\
", ident); static const char data[] __attribute__((__aligned__(8))) = \"\\\n\
");
mmap_data = bpf_map__initial_value(map, &mmap_size); mmap_data = bpf_map__initial_value(map, &mmap_size);
print_hex(mmap_data, mmap_size); print_hex(mmap_data, mmap_size);
codegen("\ codegen("\
\n\ \n\
\", %1$zd, %2$zd); \n\ \"; \n\
if (!skel->%3$s) \n\ \n\
skel->%1$s = skel_prep_map_data((void *)data, %2$zd,\n\
sizeof(data) - 1);\n\
if (!skel->%1$s) \n\
goto cleanup; \n\ goto cleanup; \n\
skel->maps.%3$s.initial_value = (__u64) (long) skel->%3$s;\n\ skel->maps.%1$s.initial_value = (__u64) (long) skel->%1$s;\n\
", bpf_map_mmap_sz(map), mmap_size, ident); } \n\
", ident, bpf_map_mmap_sz(map));
} }
codegen("\ codegen("\
\n\ \n\
@ -733,32 +738,30 @@ static int gen_trace(struct bpf_object *obj, const char *obj_name, const char *h
{ \n\ { \n\
struct bpf_load_and_run_opts opts = {}; \n\ struct bpf_load_and_run_opts opts = {}; \n\
int err; \n\ int err; \n\
\n\ static const char opts_data[] __attribute__((__aligned__(8))) = \"\\\n\
opts.ctx = (struct bpf_loader_ctx *)skel; \n\
opts.data_sz = %2$d; \n\
opts.data = (void *)\"\\ \n\
", ",
obj_name, opts.data_sz); obj_name);
print_hex(opts.data, opts.data_sz); print_hex(opts.data, opts.data_sz);
codegen("\ codegen("\
\n\ \n\
\"; \n\ \"; \n\
static const char opts_insn[] __attribute__((__aligned__(8))) = \"\\\n\
"); ");
codegen("\
\n\
opts.insns_sz = %d; \n\
opts.insns = (void *)\"\\ \n\
",
opts.insns_sz);
print_hex(opts.insns, opts.insns_sz); print_hex(opts.insns, opts.insns_sz);
codegen("\ codegen("\
\n\ \n\
\"; \n\ \"; \n\
\n\
opts.ctx = (struct bpf_loader_ctx *)skel; \n\
opts.data_sz = sizeof(opts_data) - 1; \n\
opts.data = (void *)opts_data; \n\
opts.insns_sz = sizeof(opts_insn) - 1; \n\
opts.insns = (void *)opts_insn; \n\
\n\
err = bpf_load_and_run(&opts); \n\ err = bpf_load_and_run(&opts); \n\
if (err < 0) \n\ if (err < 0) \n\
return err; \n\ return err; \n\
", obj_name); ");
bpf_object__for_each_map(map, obj) { bpf_object__for_each_map(map, obj) {
const char *mmap_flags; const char *mmap_flags;