0001
0002
0003 #define _GNU_SOURCE
0004 #include <sched.h>
0005 #include <sys/prctl.h>
0006 #include <test_progs.h>
0007
0008 #define MAX_CNT 100000
0009
0010 static __u64 time_get_ns(void)
0011 {
0012 struct timespec ts;
0013
0014 clock_gettime(CLOCK_MONOTONIC, &ts);
0015 return ts.tv_sec * 1000000000ull + ts.tv_nsec;
0016 }
0017
0018 static int test_task_rename(const char *prog)
0019 {
0020 int i, fd, duration = 0, err;
0021 char buf[] = "test_overhead";
0022 __u64 start_time;
0023
0024 fd = open("/proc/self/comm", O_WRONLY|O_TRUNC);
0025 if (CHECK(fd < 0, "open /proc", "err %d", errno))
0026 return -1;
0027 start_time = time_get_ns();
0028 for (i = 0; i < MAX_CNT; i++) {
0029 err = write(fd, buf, sizeof(buf));
0030 if (err < 0) {
0031 CHECK(err < 0, "task rename", "err %d", errno);
0032 close(fd);
0033 return -1;
0034 }
0035 }
0036 printf("task_rename %s\t%lluK events per sec\n", prog,
0037 MAX_CNT * 1000000ll / (time_get_ns() - start_time));
0038 close(fd);
0039 return 0;
0040 }
0041
0042 static void test_run(const char *prog)
0043 {
0044 test_task_rename(prog);
0045 }
0046
0047 static void setaffinity(void)
0048 {
0049 cpu_set_t cpuset;
0050 int cpu = 0;
0051
0052 CPU_ZERO(&cpuset);
0053 CPU_SET(cpu, &cpuset);
0054 sched_setaffinity(0, sizeof(cpuset), &cpuset);
0055 }
0056
0057 void test_test_overhead(void)
0058 {
0059 const char *kprobe_name = "prog1";
0060 const char *kretprobe_name = "prog2";
0061 const char *raw_tp_name = "prog3";
0062 const char *fentry_name = "prog4";
0063 const char *fexit_name = "prog5";
0064 const char *kprobe_func = "__set_task_comm";
0065 struct bpf_program *kprobe_prog, *kretprobe_prog, *raw_tp_prog;
0066 struct bpf_program *fentry_prog, *fexit_prog;
0067 struct bpf_object *obj;
0068 struct bpf_link *link;
0069 int err, duration = 0;
0070 char comm[16] = {};
0071
0072 if (CHECK_FAIL(prctl(PR_GET_NAME, comm, 0L, 0L, 0L)))
0073 return;
0074
0075 obj = bpf_object__open_file("./test_overhead.o", NULL);
0076 if (!ASSERT_OK_PTR(obj, "obj_open_file"))
0077 return;
0078
0079 kprobe_prog = bpf_object__find_program_by_name(obj, kprobe_name);
0080 if (CHECK(!kprobe_prog, "find_probe",
0081 "prog '%s' not found\n", kprobe_name))
0082 goto cleanup;
0083 kretprobe_prog = bpf_object__find_program_by_name(obj, kretprobe_name);
0084 if (CHECK(!kretprobe_prog, "find_probe",
0085 "prog '%s' not found\n", kretprobe_name))
0086 goto cleanup;
0087 raw_tp_prog = bpf_object__find_program_by_name(obj, raw_tp_name);
0088 if (CHECK(!raw_tp_prog, "find_probe",
0089 "prog '%s' not found\n", raw_tp_name))
0090 goto cleanup;
0091 fentry_prog = bpf_object__find_program_by_name(obj, fentry_name);
0092 if (CHECK(!fentry_prog, "find_probe",
0093 "prog '%s' not found\n", fentry_name))
0094 goto cleanup;
0095 fexit_prog = bpf_object__find_program_by_name(obj, fexit_name);
0096 if (CHECK(!fexit_prog, "find_probe",
0097 "prog '%s' not found\n", fexit_name))
0098 goto cleanup;
0099 err = bpf_object__load(obj);
0100 if (CHECK(err, "obj_load", "err %d\n", err))
0101 goto cleanup;
0102
0103 setaffinity();
0104
0105
0106 test_run("base");
0107
0108
0109 link = bpf_program__attach_kprobe(kprobe_prog, false ,
0110 kprobe_func);
0111 if (!ASSERT_OK_PTR(link, "attach_kprobe"))
0112 goto cleanup;
0113 test_run("kprobe");
0114 bpf_link__destroy(link);
0115
0116
0117 link = bpf_program__attach_kprobe(kretprobe_prog, true ,
0118 kprobe_func);
0119 if (!ASSERT_OK_PTR(link, "attach_kretprobe"))
0120 goto cleanup;
0121 test_run("kretprobe");
0122 bpf_link__destroy(link);
0123
0124
0125 link = bpf_program__attach_raw_tracepoint(raw_tp_prog, "task_rename");
0126 if (!ASSERT_OK_PTR(link, "attach_raw_tp"))
0127 goto cleanup;
0128 test_run("raw_tp");
0129 bpf_link__destroy(link);
0130
0131
0132 link = bpf_program__attach_trace(fentry_prog);
0133 if (!ASSERT_OK_PTR(link, "attach_fentry"))
0134 goto cleanup;
0135 test_run("fentry");
0136 bpf_link__destroy(link);
0137
0138
0139 link = bpf_program__attach_trace(fexit_prog);
0140 if (!ASSERT_OK_PTR(link, "attach_fexit"))
0141 goto cleanup;
0142 test_run("fexit");
0143 bpf_link__destroy(link);
0144
0145 cleanup:
0146 prctl(PR_SET_NAME, comm, 0L, 0L, 0L);
0147 bpf_object__close(obj);
0148 }