diff options
author | Alexei Starovoitov <ast@kernel.org> | 2018-03-28 15:05:40 -0400 |
---|---|---|
committer | Daniel Borkmann <daniel@iogearbox.net> | 2018-03-28 16:55:19 -0400 |
commit | 3bbe0869884ceebffd59d5519c1d560207c6e116 (patch) | |
tree | f8f5e66c8fba220b34783b0d38518192bc53bf39 | |
parent | 4662a4e53890badf4da17e441606a2885f29d56d (diff) |
selftests/bpf: test for bpf_get_stackid() from raw tracepoints
similar to traditional traceopint test add bpf_get_stackid() test
from raw tracepoints
and reduce verbosity of existing stackmap test
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
-rw-r--r-- | tools/testing/selftests/bpf/test_progs.c | 91 |
1 files changed, 70 insertions, 21 deletions
diff --git a/tools/testing/selftests/bpf/test_progs.c b/tools/testing/selftests/bpf/test_progs.c index e9df48b306df..faadbe233966 100644 --- a/tools/testing/selftests/bpf/test_progs.c +++ b/tools/testing/selftests/bpf/test_progs.c | |||
@@ -877,7 +877,7 @@ static void test_stacktrace_map() | |||
877 | 877 | ||
878 | err = bpf_prog_load(file, BPF_PROG_TYPE_TRACEPOINT, &obj, &prog_fd); | 878 | err = bpf_prog_load(file, BPF_PROG_TYPE_TRACEPOINT, &obj, &prog_fd); |
879 | if (CHECK(err, "prog_load", "err %d errno %d\n", err, errno)) | 879 | if (CHECK(err, "prog_load", "err %d errno %d\n", err, errno)) |
880 | goto out; | 880 | return; |
881 | 881 | ||
882 | /* Get the ID for the sched/sched_switch tracepoint */ | 882 | /* Get the ID for the sched/sched_switch tracepoint */ |
883 | snprintf(buf, sizeof(buf), | 883 | snprintf(buf, sizeof(buf), |
@@ -888,8 +888,7 @@ static void test_stacktrace_map() | |||
888 | 888 | ||
889 | bytes = read(efd, buf, sizeof(buf)); | 889 | bytes = read(efd, buf, sizeof(buf)); |
890 | close(efd); | 890 | close(efd); |
891 | if (CHECK(bytes <= 0 || bytes >= sizeof(buf), | 891 | if (bytes <= 0 || bytes >= sizeof(buf)) |
892 | "read", "bytes %d errno %d\n", bytes, errno)) | ||
893 | goto close_prog; | 892 | goto close_prog; |
894 | 893 | ||
895 | /* Open the perf event and attach bpf progrram */ | 894 | /* Open the perf event and attach bpf progrram */ |
@@ -906,29 +905,24 @@ static void test_stacktrace_map() | |||
906 | goto close_prog; | 905 | goto close_prog; |
907 | 906 | ||
908 | err = ioctl(pmu_fd, PERF_EVENT_IOC_ENABLE, 0); | 907 | err = ioctl(pmu_fd, PERF_EVENT_IOC_ENABLE, 0); |
909 | if (CHECK(err, "perf_event_ioc_enable", "err %d errno %d\n", | 908 | if (err) |
910 | err, errno)) | 909 | goto disable_pmu; |
911 | goto close_pmu; | ||
912 | 910 | ||
913 | err = ioctl(pmu_fd, PERF_EVENT_IOC_SET_BPF, prog_fd); | 911 | err = ioctl(pmu_fd, PERF_EVENT_IOC_SET_BPF, prog_fd); |
914 | if (CHECK(err, "perf_event_ioc_set_bpf", "err %d errno %d\n", | 912 | if (err) |
915 | err, errno)) | ||
916 | goto disable_pmu; | 913 | goto disable_pmu; |
917 | 914 | ||
918 | /* find map fds */ | 915 | /* find map fds */ |
919 | control_map_fd = bpf_find_map(__func__, obj, "control_map"); | 916 | control_map_fd = bpf_find_map(__func__, obj, "control_map"); |
920 | if (CHECK(control_map_fd < 0, "bpf_find_map control_map", | 917 | if (control_map_fd < 0) |
921 | "err %d errno %d\n", err, errno)) | ||
922 | goto disable_pmu; | 918 | goto disable_pmu; |
923 | 919 | ||
924 | stackid_hmap_fd = bpf_find_map(__func__, obj, "stackid_hmap"); | 920 | stackid_hmap_fd = bpf_find_map(__func__, obj, "stackid_hmap"); |
925 | if (CHECK(stackid_hmap_fd < 0, "bpf_find_map stackid_hmap", | 921 | if (stackid_hmap_fd < 0) |
926 | "err %d errno %d\n", err, errno)) | ||
927 | goto disable_pmu; | 922 | goto disable_pmu; |
928 | 923 | ||
929 | stackmap_fd = bpf_find_map(__func__, obj, "stackmap"); | 924 | stackmap_fd = bpf_find_map(__func__, obj, "stackmap"); |
930 | if (CHECK(stackmap_fd < 0, "bpf_find_map stackmap", "err %d errno %d\n", | 925 | if (stackmap_fd < 0) |
931 | err, errno)) | ||
932 | goto disable_pmu; | 926 | goto disable_pmu; |
933 | 927 | ||
934 | /* give some time for bpf program run */ | 928 | /* give some time for bpf program run */ |
@@ -945,24 +939,78 @@ static void test_stacktrace_map() | |||
945 | err = compare_map_keys(stackid_hmap_fd, stackmap_fd); | 939 | err = compare_map_keys(stackid_hmap_fd, stackmap_fd); |
946 | if (CHECK(err, "compare_map_keys stackid_hmap vs. stackmap", | 940 | if (CHECK(err, "compare_map_keys stackid_hmap vs. stackmap", |
947 | "err %d errno %d\n", err, errno)) | 941 | "err %d errno %d\n", err, errno)) |
948 | goto disable_pmu; | 942 | goto disable_pmu_noerr; |
949 | 943 | ||
950 | err = compare_map_keys(stackmap_fd, stackid_hmap_fd); | 944 | err = compare_map_keys(stackmap_fd, stackid_hmap_fd); |
951 | if (CHECK(err, "compare_map_keys stackmap vs. stackid_hmap", | 945 | if (CHECK(err, "compare_map_keys stackmap vs. stackid_hmap", |
952 | "err %d errno %d\n", err, errno)) | 946 | "err %d errno %d\n", err, errno)) |
953 | ; /* fall through */ | 947 | goto disable_pmu_noerr; |
954 | 948 | ||
949 | goto disable_pmu_noerr; | ||
955 | disable_pmu: | 950 | disable_pmu: |
951 | error_cnt++; | ||
952 | disable_pmu_noerr: | ||
956 | ioctl(pmu_fd, PERF_EVENT_IOC_DISABLE); | 953 | ioctl(pmu_fd, PERF_EVENT_IOC_DISABLE); |
957 | |||
958 | close_pmu: | ||
959 | close(pmu_fd); | 954 | close(pmu_fd); |
960 | |||
961 | close_prog: | 955 | close_prog: |
962 | bpf_object__close(obj); | 956 | bpf_object__close(obj); |
957 | } | ||
963 | 958 | ||
964 | out: | 959 | static void test_stacktrace_map_raw_tp() |
965 | return; | 960 | { |
961 | int control_map_fd, stackid_hmap_fd, stackmap_fd; | ||
962 | const char *file = "./test_stacktrace_map.o"; | ||
963 | int efd, err, prog_fd; | ||
964 | __u32 key, val, duration = 0; | ||
965 | struct bpf_object *obj; | ||
966 | |||
967 | err = bpf_prog_load(file, BPF_PROG_TYPE_RAW_TRACEPOINT, &obj, &prog_fd); | ||
968 | if (CHECK(err, "prog_load raw tp", "err %d errno %d\n", err, errno)) | ||
969 | return; | ||
970 | |||
971 | efd = bpf_raw_tracepoint_open("sched_switch", prog_fd); | ||
972 | if (CHECK(efd < 0, "raw_tp_open", "err %d errno %d\n", efd, errno)) | ||
973 | goto close_prog; | ||
974 | |||
975 | /* find map fds */ | ||
976 | control_map_fd = bpf_find_map(__func__, obj, "control_map"); | ||
977 | if (control_map_fd < 0) | ||
978 | goto close_prog; | ||
979 | |||
980 | stackid_hmap_fd = bpf_find_map(__func__, obj, "stackid_hmap"); | ||
981 | if (stackid_hmap_fd < 0) | ||
982 | goto close_prog; | ||
983 | |||
984 | stackmap_fd = bpf_find_map(__func__, obj, "stackmap"); | ||
985 | if (stackmap_fd < 0) | ||
986 | goto close_prog; | ||
987 | |||
988 | /* give some time for bpf program run */ | ||
989 | sleep(1); | ||
990 | |||
991 | /* disable stack trace collection */ | ||
992 | key = 0; | ||
993 | val = 1; | ||
994 | bpf_map_update_elem(control_map_fd, &key, &val, 0); | ||
995 | |||
996 | /* for every element in stackid_hmap, we can find a corresponding one | ||
997 | * in stackmap, and vise versa. | ||
998 | */ | ||
999 | err = compare_map_keys(stackid_hmap_fd, stackmap_fd); | ||
1000 | if (CHECK(err, "compare_map_keys stackid_hmap vs. stackmap", | ||
1001 | "err %d errno %d\n", err, errno)) | ||
1002 | goto close_prog; | ||
1003 | |||
1004 | err = compare_map_keys(stackmap_fd, stackid_hmap_fd); | ||
1005 | if (CHECK(err, "compare_map_keys stackmap vs. stackid_hmap", | ||
1006 | "err %d errno %d\n", err, errno)) | ||
1007 | goto close_prog; | ||
1008 | |||
1009 | goto close_prog_noerr; | ||
1010 | close_prog: | ||
1011 | error_cnt++; | ||
1012 | close_prog_noerr: | ||
1013 | bpf_object__close(obj); | ||
966 | } | 1014 | } |
967 | 1015 | ||
968 | static int extract_build_id(char *build_id, size_t size) | 1016 | static int extract_build_id(char *build_id, size_t size) |
@@ -1138,6 +1186,7 @@ int main(void) | |||
1138 | test_tp_attach_query(); | 1186 | test_tp_attach_query(); |
1139 | test_stacktrace_map(); | 1187 | test_stacktrace_map(); |
1140 | test_stacktrace_build_id(); | 1188 | test_stacktrace_build_id(); |
1189 | test_stacktrace_map_raw_tp(); | ||
1141 | 1190 | ||
1142 | printf("Summary: %d PASSED, %d FAILED\n", pass_cnt, error_cnt); | 1191 | printf("Summary: %d PASSED, %d FAILED\n", pass_cnt, error_cnt); |
1143 | return error_cnt ? EXIT_FAILURE : EXIT_SUCCESS; | 1192 | return error_cnt ? EXIT_FAILURE : EXIT_SUCCESS; |