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

selftests/bpf: Test BTF_KIND_ENUM64 for deduplication

Add a few unit tests for BTF_KIND_ENUM64 deduplication.

Acked-by: Andrii Nakryiko <andrii@kernel.org>
Signed-off-by: Yonghong Song <yhs@fb.com>
Link: https://lore.kernel.org/r/20220607062713.3725409-1-yhs@fb.com
Signed-off-by: Alexei Starovoitov <ast@kernel.org>

authored by

Yonghong Song and committed by
Alexei Starovoitov
adc26d13 3b532518

+95 -2
+95 -2
tools/testing/selftests/bpf/prog_tests/btf.c
··· 7016 7016 BTF_DECL_TAG_ENC(NAME_TBD, 13, 1), /* [16] decl_tag */ 7017 7017 BTF_DECL_TAG_ENC(NAME_TBD, 7, -1), /* [17] decl_tag */ 7018 7018 BTF_TYPE_TAG_ENC(NAME_TBD, 8), /* [18] type_tag */ 7019 + BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_ENUM64, 0, 2), 8), /* [19] enum64 */ 7020 + BTF_ENUM64_ENC(NAME_TBD, 0, 0), 7021 + BTF_ENUM64_ENC(NAME_TBD, 1, 1), 7019 7022 BTF_END_RAW, 7020 7023 }, 7021 - BTF_STR_SEC("\0A\0B\0C\0D\0E\0F\0G\0H\0I\0J\0K\0L\0M\0N\0O\0P\0Q\0R"), 7024 + BTF_STR_SEC("\0A\0B\0C\0D\0E\0F\0G\0H\0I\0J\0K\0L\0M\0N\0O\0P\0Q\0R\0S\0T\0U"), 7022 7025 }, 7023 7026 .expect = { 7024 7027 .raw_types = { ··· 7049 7046 BTF_DECL_TAG_ENC(NAME_TBD, 13, 1), /* [16] decl_tag */ 7050 7047 BTF_DECL_TAG_ENC(NAME_TBD, 7, -1), /* [17] decl_tag */ 7051 7048 BTF_TYPE_TAG_ENC(NAME_TBD, 8), /* [18] type_tag */ 7049 + BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_ENUM64, 0, 2), 8), /* [19] enum64 */ 7050 + BTF_ENUM64_ENC(NAME_TBD, 0, 0), 7051 + BTF_ENUM64_ENC(NAME_TBD, 1, 1), 7052 7052 BTF_END_RAW, 7053 7053 }, 7054 - BTF_STR_SEC("\0A\0B\0C\0D\0E\0F\0G\0H\0I\0J\0K\0L\0M\0N\0O\0P\0Q\0R"), 7054 + BTF_STR_SEC("\0A\0B\0C\0D\0E\0F\0G\0H\0I\0J\0K\0L\0M\0N\0O\0P\0Q\0R\0S\0T\0U"), 7055 7055 }, 7056 7056 }, 7057 7057 { ··· 7515 7509 BTF_STR_SEC("\0tag1\0t\0m"), 7516 7510 }, 7517 7511 }, 7512 + { 7513 + .descr = "dedup: enum64, standalone", 7514 + .input = { 7515 + .raw_types = { 7516 + BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM64, 0, 1), 8), 7517 + BTF_ENUM64_ENC(NAME_NTH(2), 1, 123), 7518 + BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM64, 0, 1), 8), 7519 + BTF_ENUM64_ENC(NAME_NTH(2), 1, 123), 7520 + BTF_END_RAW, 7521 + }, 7522 + BTF_STR_SEC("\0e1\0e1_val"), 7523 + }, 7524 + .expect = { 7525 + .raw_types = { 7526 + BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM64, 0, 1), 8), 7527 + BTF_ENUM64_ENC(NAME_NTH(2), 1, 123), 7528 + BTF_END_RAW, 7529 + }, 7530 + BTF_STR_SEC("\0e1\0e1_val"), 7531 + }, 7532 + }, 7533 + { 7534 + .descr = "dedup: enum64, fwd resolution", 7535 + .input = { 7536 + .raw_types = { 7537 + /* [1] fwd enum64 'e1' before full enum */ 7538 + BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM64, 0, 0), 8), 7539 + /* [2] full enum64 'e1' after fwd */ 7540 + BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM64, 0, 1), 8), 7541 + BTF_ENUM64_ENC(NAME_NTH(2), 1, 123), 7542 + /* [3] full enum64 'e2' before fwd */ 7543 + BTF_TYPE_ENC(NAME_NTH(3), BTF_INFO_ENC(BTF_KIND_ENUM64, 0, 1), 8), 7544 + BTF_ENUM64_ENC(NAME_NTH(4), 0, 456), 7545 + /* [4] fwd enum64 'e2' after full enum */ 7546 + BTF_TYPE_ENC(NAME_NTH(3), BTF_INFO_ENC(BTF_KIND_ENUM64, 0, 0), 8), 7547 + /* [5] incompatible full enum64 with different value */ 7548 + BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM64, 0, 1), 8), 7549 + BTF_ENUM64_ENC(NAME_NTH(2), 0, 321), 7550 + BTF_END_RAW, 7551 + }, 7552 + BTF_STR_SEC("\0e1\0e1_val\0e2\0e2_val"), 7553 + }, 7554 + .expect = { 7555 + .raw_types = { 7556 + /* [1] full enum64 'e1' */ 7557 + BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM64, 0, 1), 8), 7558 + BTF_ENUM64_ENC(NAME_NTH(2), 1, 123), 7559 + /* [2] full enum64 'e2' */ 7560 + BTF_TYPE_ENC(NAME_NTH(3), BTF_INFO_ENC(BTF_KIND_ENUM64, 0, 1), 8), 7561 + BTF_ENUM64_ENC(NAME_NTH(4), 0, 456), 7562 + /* [3] incompatible full enum64 with different value */ 7563 + BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM64, 0, 1), 8), 7564 + BTF_ENUM64_ENC(NAME_NTH(2), 0, 321), 7565 + BTF_END_RAW, 7566 + }, 7567 + BTF_STR_SEC("\0e1\0e1_val\0e2\0e2_val"), 7568 + }, 7569 + }, 7570 + { 7571 + .descr = "dedup: enum and enum64, no dedup", 7572 + .input = { 7573 + .raw_types = { 7574 + /* [1] enum 'e1' */ 7575 + BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 4), 7576 + BTF_ENUM_ENC(NAME_NTH(2), 1), 7577 + /* [2] enum64 'e1' */ 7578 + BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM64, 0, 1), 4), 7579 + BTF_ENUM64_ENC(NAME_NTH(2), 1, 0), 7580 + BTF_END_RAW, 7581 + }, 7582 + BTF_STR_SEC("\0e1\0e1_val"), 7583 + }, 7584 + .expect = { 7585 + .raw_types = { 7586 + /* [1] enum 'e1' */ 7587 + BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 4), 7588 + BTF_ENUM_ENC(NAME_NTH(2), 1), 7589 + /* [2] enum64 'e1' */ 7590 + BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM64, 0, 1), 4), 7591 + BTF_ENUM64_ENC(NAME_NTH(2), 1, 0), 7592 + BTF_END_RAW, 7593 + }, 7594 + BTF_STR_SEC("\0e1\0e1_val"), 7595 + }, 7596 + }, 7518 7597 7519 7598 }; 7520 7599 ··· 7624 7533 return base_size + sizeof(__u32); 7625 7534 case BTF_KIND_ENUM: 7626 7535 return base_size + vlen * sizeof(struct btf_enum); 7536 + case BTF_KIND_ENUM64: 7537 + return base_size + vlen * sizeof(struct btf_enum64); 7627 7538 case BTF_KIND_ARRAY: 7628 7539 return base_size + sizeof(struct btf_array); 7629 7540 case BTF_KIND_STRUCT: