Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

selftest/bpf: Add BTF_KIND_FLOAT tests

Test the good variants as well as the potential malformed ones.

Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Acked-by: Yonghong Song <yhs@fb.com>
Acked-by: Andrii Nakryiko <andrii@kernel.org>
Link: https://lore.kernel.org/bpf/20210226202256.116518-8-iii@linux.ibm.com

authored by

Ilya Leoshkevich and committed by
Alexei Starovoitov
7e72aad3 b1828f0b

+138
+4
tools/testing/selftests/bpf/btf_helpers.c
··· 23 23 [BTF_KIND_FUNC_PROTO] = "FUNC_PROTO", 24 24 [BTF_KIND_VAR] = "VAR", 25 25 [BTF_KIND_DATASEC] = "DATASEC", 26 + [BTF_KIND_FLOAT] = "FLOAT", 26 27 }; 27 28 28 29 static const char *btf_kind_str(__u16 kind) ··· 174 173 } 175 174 break; 176 175 } 176 + case BTF_KIND_FLOAT: 177 + fprintf(out, " size=%u", t->size); 178 + break; 177 179 default: 178 180 break; 179 181 }
+131
tools/testing/selftests/bpf/prog_tests/btf.c
··· 3531 3531 .max_entries = 1, 3532 3532 }, 3533 3533 3534 + { 3535 + .descr = "float test #1, well-formed", 3536 + .raw_types = { 3537 + BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), 3538 + /* [1] */ 3539 + BTF_TYPE_FLOAT_ENC(NAME_TBD, 2), /* [2] */ 3540 + BTF_TYPE_FLOAT_ENC(NAME_TBD, 4), /* [3] */ 3541 + BTF_TYPE_FLOAT_ENC(NAME_TBD, 8), /* [4] */ 3542 + BTF_TYPE_FLOAT_ENC(NAME_TBD, 12), /* [5] */ 3543 + BTF_TYPE_FLOAT_ENC(NAME_TBD, 16), /* [6] */ 3544 + BTF_STRUCT_ENC(NAME_TBD, 5, 48), /* [7] */ 3545 + BTF_MEMBER_ENC(NAME_TBD, 2, 0), 3546 + BTF_MEMBER_ENC(NAME_TBD, 3, 32), 3547 + BTF_MEMBER_ENC(NAME_TBD, 4, 64), 3548 + BTF_MEMBER_ENC(NAME_TBD, 5, 128), 3549 + BTF_MEMBER_ENC(NAME_TBD, 6, 256), 3550 + BTF_END_RAW, 3551 + }, 3552 + BTF_STR_SEC("\0int\0_Float16\0float\0double\0_Float80\0long_double" 3553 + "\0floats\0a\0b\0c\0d\0e"), 3554 + .map_type = BPF_MAP_TYPE_ARRAY, 3555 + .map_name = "float_type_check_btf", 3556 + .key_size = sizeof(int), 3557 + .value_size = 48, 3558 + .key_type_id = 1, 3559 + .value_type_id = 7, 3560 + .max_entries = 1, 3561 + }, 3562 + { 3563 + .descr = "float test #2, invalid vlen", 3564 + .raw_types = { 3565 + BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), 3566 + /* [1] */ 3567 + BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_FLOAT, 0, 1), 4), 3568 + /* [2] */ 3569 + BTF_END_RAW, 3570 + }, 3571 + BTF_STR_SEC("\0int\0float"), 3572 + .map_type = BPF_MAP_TYPE_ARRAY, 3573 + .map_name = "float_type_check_btf", 3574 + .key_size = sizeof(int), 3575 + .value_size = 4, 3576 + .key_type_id = 1, 3577 + .value_type_id = 2, 3578 + .max_entries = 1, 3579 + .btf_load_err = true, 3580 + .err_str = "vlen != 0", 3581 + }, 3582 + { 3583 + .descr = "float test #3, invalid kind_flag", 3584 + .raw_types = { 3585 + BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), 3586 + /* [1] */ 3587 + BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_FLOAT, 1, 0), 4), 3588 + /* [2] */ 3589 + BTF_END_RAW, 3590 + }, 3591 + BTF_STR_SEC("\0int\0float"), 3592 + .map_type = BPF_MAP_TYPE_ARRAY, 3593 + .map_name = "float_type_check_btf", 3594 + .key_size = sizeof(int), 3595 + .value_size = 4, 3596 + .key_type_id = 1, 3597 + .value_type_id = 2, 3598 + .max_entries = 1, 3599 + .btf_load_err = true, 3600 + .err_str = "Invalid btf_info kind_flag", 3601 + }, 3602 + { 3603 + .descr = "float test #4, member does not fit", 3604 + .raw_types = { 3605 + BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), 3606 + /* [1] */ 3607 + BTF_TYPE_FLOAT_ENC(NAME_TBD, 4), /* [2] */ 3608 + BTF_STRUCT_ENC(NAME_TBD, 1, 2), /* [3] */ 3609 + BTF_MEMBER_ENC(NAME_TBD, 2, 0), 3610 + BTF_END_RAW, 3611 + }, 3612 + BTF_STR_SEC("\0int\0float\0floats\0x"), 3613 + .map_type = BPF_MAP_TYPE_ARRAY, 3614 + .map_name = "float_type_check_btf", 3615 + .key_size = sizeof(int), 3616 + .value_size = 4, 3617 + .key_type_id = 1, 3618 + .value_type_id = 3, 3619 + .max_entries = 1, 3620 + .btf_load_err = true, 3621 + .err_str = "Member exceeds struct_size", 3622 + }, 3623 + { 3624 + .descr = "float test #5, member is not properly aligned", 3625 + .raw_types = { 3626 + BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), 3627 + /* [1] */ 3628 + BTF_TYPE_FLOAT_ENC(NAME_TBD, 4), /* [2] */ 3629 + BTF_STRUCT_ENC(NAME_TBD, 1, 8), /* [3] */ 3630 + BTF_MEMBER_ENC(NAME_TBD, 2, 8), 3631 + BTF_END_RAW, 3632 + }, 3633 + BTF_STR_SEC("\0int\0float\0floats\0x"), 3634 + .map_type = BPF_MAP_TYPE_ARRAY, 3635 + .map_name = "float_type_check_btf", 3636 + .key_size = sizeof(int), 3637 + .value_size = 4, 3638 + .key_type_id = 1, 3639 + .value_type_id = 3, 3640 + .max_entries = 1, 3641 + .btf_load_err = true, 3642 + .err_str = "Member is not properly aligned", 3643 + }, 3644 + { 3645 + .descr = "float test #6, invalid size", 3646 + .raw_types = { 3647 + BTF_TYPE_INT_ENC(NAME_TBD, BTF_INT_SIGNED, 0, 32, 4), 3648 + /* [1] */ 3649 + BTF_TYPE_FLOAT_ENC(NAME_TBD, 6), /* [2] */ 3650 + BTF_END_RAW, 3651 + }, 3652 + BTF_STR_SEC("\0int\0float"), 3653 + .map_type = BPF_MAP_TYPE_ARRAY, 3654 + .map_name = "float_type_check_btf", 3655 + .key_size = sizeof(int), 3656 + .value_size = 6, 3657 + .key_type_id = 1, 3658 + .value_type_id = 2, 3659 + .max_entries = 1, 3660 + .btf_load_err = true, 3661 + .err_str = "Invalid type_size", 3662 + }, 3663 + 3534 3664 }; /* struct btf_raw_test raw_tests[] */ 3535 3665 3536 3666 static const char *get_next_str(const char *start, const char *end) ··· 6760 6630 case BTF_KIND_PTR: 6761 6631 case BTF_KIND_TYPEDEF: 6762 6632 case BTF_KIND_FUNC: 6633 + case BTF_KIND_FLOAT: 6763 6634 return base_size; 6764 6635 case BTF_KIND_INT: 6765 6636 return base_size + sizeof(__u32);
+3
tools/testing/selftests/bpf/test_btf.h
··· 66 66 #define BTF_FUNC_ENC(name, func_proto) \ 67 67 BTF_TYPE_ENC(name, BTF_INFO_ENC(BTF_KIND_FUNC, 0, 0), func_proto) 68 68 69 + #define BTF_TYPE_FLOAT_ENC(name, sz) \ 70 + BTF_TYPE_ENC(name, BTF_INFO_ENC(BTF_KIND_FLOAT, 0, 0), sz) 71 + 69 72 #endif /* _TEST_BTF_H */