Skip to content

Commit

Permalink
selftests/bpf: add CO-RE relocs nesting tests
Browse files Browse the repository at this point in the history
Add a bunch of test validating correct handling of nested
structs/unions.

Signed-off-by: Andrii Nakryiko <andriin@fb.com>
Acked-by: Song Liu <songliubraving@fb.com>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
  • Loading branch information
Andrii Nakryiko authored and Alexei Starovoitov committed Aug 7, 2019
1 parent 002d3af commit ec6438a
Show file tree
Hide file tree
Showing 16 changed files with 421 additions and 0 deletions.
39 changes: 39 additions & 0 deletions tools/testing/selftests/bpf/prog_tests/core_reloc.c
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,29 @@
.fails = true, \
}

#define NESTING_DATA(struct_name) STRUCT_TO_CHAR_PTR(struct_name) { \
.a = { .a = { .a = 42 } }, \
.b = { .b = { .b = 0xc001 } }, \
}

#define NESTING_CASE_COMMON(name) \
.case_name = #name, \
.bpf_obj_file = "test_core_reloc_nesting.o", \
.btf_src_file = "btf__core_reloc_" #name ".o"

#define NESTING_CASE(name) { \
NESTING_CASE_COMMON(name), \
.input = NESTING_DATA(core_reloc_##name), \
.input_len = sizeof(struct core_reloc_##name), \
.output = NESTING_DATA(core_reloc_nesting), \
.output_len = sizeof(struct core_reloc_nesting) \
}

#define NESTING_ERR_CASE(name) { \
NESTING_CASE_COMMON(name), \
.fails = true, \
}

struct core_reloc_test_case {
const char *case_name;
const char *bpf_obj_file;
Expand Down Expand Up @@ -57,6 +80,22 @@ static struct core_reloc_test_case test_cases[] = {
FLAVORS_CASE(flavors),

FLAVORS_ERR_CASE(flavors__err_wrong_name),

/* various struct/enum nesting and resolution scenarios */
NESTING_CASE(nesting),
NESTING_CASE(nesting___anon_embed),
NESTING_CASE(nesting___struct_union_mixup),
NESTING_CASE(nesting___extra_nesting),
NESTING_CASE(nesting___dup_compat_types),

NESTING_ERR_CASE(nesting___err_missing_field),
NESTING_ERR_CASE(nesting___err_array_field),
NESTING_ERR_CASE(nesting___err_missing_container),
NESTING_ERR_CASE(nesting___err_nonstruct_container),
NESTING_ERR_CASE(nesting___err_array_container),
NESTING_ERR_CASE(nesting___err_dup_incompat_types),
NESTING_ERR_CASE(nesting___err_partial_match_dups),
NESTING_ERR_CASE(nesting___err_too_deep),
};

struct data {
Expand Down
3 changes: 3 additions & 0 deletions tools/testing/selftests/bpf/progs/btf__core_reloc_nesting.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
#include "core_reloc_types.h"

void f(struct core_reloc_nesting x) {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
#include "core_reloc_types.h"

void f(struct core_reloc_nesting___anon_embed x) {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
#include "core_reloc_types.h"

void f1(struct core_reloc_nesting___dup_compat_types x) {}
void f2(struct core_reloc_nesting___dup_compat_types__2 x) {}
void f3(struct core_reloc_nesting___dup_compat_types__3 x) {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
#include "core_reloc_types.h"

void f(struct core_reloc_nesting___err_array_container x) {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
#include "core_reloc_types.h"

void f(struct core_reloc_nesting___err_array_field x) {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
#include "core_reloc_types.h"

void f1(struct core_reloc_nesting___err_dup_incompat_types__1 x) {}
void f2(struct core_reloc_nesting___err_dup_incompat_types__2 x) {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
#include "core_reloc_types.h"

void f(struct core_reloc_nesting___err_missing_container x) {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
#include "core_reloc_types.h"

void f(struct core_reloc_nesting___err_missing_field x) {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
#include "core_reloc_types.h"

void f(struct core_reloc_nesting___err_nonstruct_container x) {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
#include "core_reloc_types.h"

void f1(struct core_reloc_nesting___err_partial_match_dups__a x) {}
void f2(struct core_reloc_nesting___err_partial_match_dups__b x) {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
#include "core_reloc_types.h"

void f(struct core_reloc_nesting___err_too_deep x) {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
#include "core_reloc_types.h"

void f(struct core_reloc_nesting___extra_nesting x) {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
#include "core_reloc_types.h"

void f(struct core_reloc_nesting___struct_union_mixup x) {}
Loading

0 comments on commit ec6438a

Please sign in to comment.