Skip to content

Commit 3a20de5

Browse files
committed
selftests/bpf: Fix core_reloc test failures on 32-bit
Update memory-layout, alignment, and expected results to ensure consistent behaviour regardless of 32/64-bit host architecture, similar to a previous fix [0]. All tests now pass on 32-bit armhf after these changes: root@qemu-armhf:/usr/libexec/kselftests-bpf# ./test_progs -a core_reloc torvalds#75/1 core_reloc/kernel:OK torvalds#75/2 core_reloc/module_probed:OK torvalds#75/3 core_reloc/module_direct:OK [...] torvalds#75/78 core_reloc/enum64val___err_missing:OK torvalds#75 core_reloc:OK Summary: 1/78 PASSED, 0 SKIPPED, 0 FAILED 0: 5705d70 ("selftests/bpf: Correct various core_reloc 64-bit assumptions") Signed-off-by: Tony Ambardar <[email protected]>
1 parent 0d48b23 commit 3a20de5

File tree

2 files changed

+23
-19
lines changed

2 files changed

+23
-19
lines changed

tools/testing/selftests/bpf/prog_tests/core_reloc.c

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -790,11 +790,11 @@ static const struct core_reloc_test_case test_cases[] = {
790790
.enum_sz = sizeof(enum an_enum),
791791
.typedef_named_struct_sz = sizeof(named_struct_typedef),
792792
.typedef_anon_struct_sz = sizeof(anon_struct_typedef),
793-
.typedef_struct_ptr_sz = sizeof(struct_ptr_typedef),
793+
.typedef_struct_ptr_sz = 8, /* always 8-byte pointer for BPF */
794794
.typedef_int_sz = sizeof(int_typedef),
795795
.typedef_enum_sz = sizeof(enum_typedef),
796-
.typedef_void_ptr_sz = sizeof(void_ptr_typedef),
797-
.typedef_func_proto_sz = sizeof(func_proto_typedef),
796+
.typedef_void_ptr_sz = 8, /* always 8-byte pointer for BPF */
797+
.typedef_func_proto_sz = 8, /* always 8-byte pointer for BPF */
798798
.typedef_arr_sz = sizeof(arr_typedef),
799799
}),
800800
TYPE_BASED_CASE(type_based___all_missing, {
@@ -832,11 +832,11 @@ static const struct core_reloc_test_case test_cases[] = {
832832
.enum_sz = sizeof(enum an_enum___diff),
833833
.typedef_named_struct_sz = sizeof(named_struct_typedef___diff),
834834
.typedef_anon_struct_sz = sizeof(anon_struct_typedef___diff),
835-
.typedef_struct_ptr_sz = sizeof(struct_ptr_typedef___diff),
835+
.typedef_struct_ptr_sz = 8, /* always 8-byte pointer for BPF */
836836
.typedef_int_sz = sizeof(int_typedef___diff),
837837
.typedef_enum_sz = sizeof(enum_typedef___diff),
838-
.typedef_void_ptr_sz = sizeof(void_ptr_typedef___diff),
839-
.typedef_func_proto_sz = sizeof(func_proto_typedef___diff),
838+
.typedef_void_ptr_sz = 8, /* always 8-byte pointer for BPF */
839+
.typedef_func_proto_sz = 8, /* always 8-byte pointer for BPF */
840840
.typedef_arr_sz = sizeof(arr_typedef___diff),
841841
}),
842842
TYPE_BASED_CASE(type_based___diff_sz, {
@@ -869,11 +869,11 @@ static const struct core_reloc_test_case test_cases[] = {
869869
.enum_sz = sizeof(enum an_enum___diff_sz),
870870
.typedef_named_struct_sz = sizeof(named_struct_typedef___diff_sz),
871871
.typedef_anon_struct_sz = sizeof(anon_struct_typedef___diff_sz),
872-
.typedef_struct_ptr_sz = sizeof(struct_ptr_typedef___diff_sz),
872+
.typedef_struct_ptr_sz = 8, /* always 8-byte pointer for BPF */
873873
.typedef_int_sz = sizeof(int_typedef___diff_sz),
874874
.typedef_enum_sz = sizeof(enum_typedef___diff_sz),
875-
.typedef_void_ptr_sz = sizeof(void_ptr_typedef___diff_sz),
876-
.typedef_func_proto_sz = sizeof(func_proto_typedef___diff_sz),
875+
.typedef_void_ptr_sz = 8, /* always 8-byte pointer for BPF */
876+
.typedef_func_proto_sz = 8, /* always 8-byte pointer for BPF */
877877
.typedef_arr_sz = sizeof(arr_typedef___diff_sz),
878878
}),
879879
TYPE_BASED_CASE(type_based___incompat, {

tools/testing/selftests/bpf/progs/core_reloc_types.h

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -818,8 +818,8 @@ struct core_reloc_size {
818818
struct { int x; } struct_field;
819819
union { int x; } union_field;
820820
int arr_field[4];
821-
void *ptr_field;
822-
enum { VALUE = 123 } enum_field;
821+
void *ptr_field __bpf_aligned;
822+
enum { VALUE = 123 } enum_field __bpf_aligned;
823823
float float_field;
824824
};
825825

@@ -828,16 +828,16 @@ struct core_reloc_size___diff_sz {
828828
struct { int x; int y; int z; } struct_field;
829829
union { int x; char bla[123]; } union_field;
830830
char arr_field[10];
831-
void *ptr_field;
832-
enum { OTHER_VALUE = 0xFFFFFFFFFFFFFFFF } enum_field;
831+
void *ptr_field __bpf_aligned;
832+
enum { OTHER_VALUE = 0xFFFFFFFFFFFFFFFF } enum_field __bpf_aligned;
833833
double float_field;
834834
};
835835

836836
struct core_reloc_size___diff_offs {
837837
float float_field;
838838
enum { YET_OTHER_VALUE = 123 } enum_field;
839-
void *ptr_field;
840-
int arr_field[4];
839+
void * ptr_field __bpf_aligned;
840+
int arr_field[4] __bpf_aligned;
841841
union { int x; } union_field;
842842
struct { int x; } struct_field;
843843
int int_field;
@@ -1041,8 +1041,8 @@ struct core_reloc_type_based___diff {
10411041

10421042
/* different type sizes, extra modifiers, anon vs named enums, etc */
10431043
struct a_struct___diff_sz {
1044-
long x;
1045-
int y;
1044+
long x __bpf_aligned;
1045+
int y __bpf_aligned;
10461046
char z;
10471047
};
10481048

@@ -1053,7 +1053,11 @@ union a_union___diff_sz {
10531053

10541054
typedef struct a_struct___diff_sz named_struct_typedef___diff_sz;
10551055

1056-
typedef struct { long xx, yy, zzz; } anon_struct_typedef___diff_sz;
1056+
typedef struct {
1057+
long xx __bpf_aligned;
1058+
long yy __bpf_aligned;
1059+
long zz __bpf_aligned;
1060+
} anon_struct_typedef___diff_sz;
10571061

10581062
typedef struct {
10591063
char aa[1], bb[2], cc[3];
@@ -1064,7 +1068,7 @@ enum an_enum___diff_sz {
10641068
AN_ENUM_VAL2___diff_sz = 2,
10651069
};
10661070

1067-
typedef unsigned long int_typedef___diff_sz;
1071+
typedef unsigned int int_typedef___diff_sz;
10681072

10691073
typedef enum an_enum___diff_sz enum_typedef___diff_sz;
10701074

0 commit comments

Comments
 (0)