aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexei Starovoitov <ast@kernel.org>2018-03-28 15:05:40 -0400
committerDaniel Borkmann <daniel@iogearbox.net>2018-03-28 16:55:19 -0400
commit3bbe0869884ceebffd59d5519c1d560207c6e116 (patch)
treef8f5e66c8fba220b34783b0d38518192bc53bf39
parent4662a4e53890badf4da17e441606a2885f29d56d (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.c91
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;
955disable_pmu: 950disable_pmu:
951 error_cnt++;
952disable_pmu_noerr:
956 ioctl(pmu_fd, PERF_EVENT_IOC_DISABLE); 953 ioctl(pmu_fd, PERF_EVENT_IOC_DISABLE);
957
958close_pmu:
959 close(pmu_fd); 954 close(pmu_fd);
960
961close_prog: 955close_prog:
962 bpf_object__close(obj); 956 bpf_object__close(obj);
957}
963 958
964out: 959static 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;
1010close_prog:
1011 error_cnt++;
1012close_prog_noerr:
1013 bpf_object__close(obj);
966} 1014}
967 1015
968static int extract_build_id(char *build_id, size_t size) 1016static 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;