Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-only
0002 /* Copyright (c) 2019 Facebook */
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     /* base line run */
0106     test_run("base");
0107 
0108     /* attach kprobe */
0109     link = bpf_program__attach_kprobe(kprobe_prog, false /* retprobe */,
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     /* attach kretprobe */
0117     link = bpf_program__attach_kprobe(kretprobe_prog, true /* retprobe */,
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     /* attach raw_tp */
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     /* attach fentry */
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     /* attach fexit */
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 }