Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
[linux-2.6-block.git] / samples / bpf / test_current_task_under_cgroup_user.c
1 // SPDX-License-Identifier: GPL-2.0-only
2 /* Copyright (c) 2016 Sargun Dhillon <sargun@sargun.me>
3  */
4
5 #define _GNU_SOURCE
6 #include <stdio.h>
7 #include <linux/bpf.h>
8 #include <unistd.h>
9 #include <bpf/bpf.h>
10 #include "bpf_load.h"
11 #include "cgroup_helpers.h"
12
13 #define CGROUP_PATH             "/my-cgroup"
14
15 int main(int argc, char **argv)
16 {
17         pid_t remote_pid, local_pid = getpid();
18         int cg2, idx = 0, rc = 0;
19         char filename[256];
20
21         snprintf(filename, sizeof(filename), "%s_kern.o", argv[0]);
22         if (load_bpf_file(filename)) {
23                 printf("%s", bpf_log_buf);
24                 return 1;
25         }
26
27         if (setup_cgroup_environment())
28                 goto err;
29
30         cg2 = create_and_get_cgroup(CGROUP_PATH);
31
32         if (cg2 < 0)
33                 goto err;
34
35         if (bpf_map_update_elem(map_fd[0], &idx, &cg2, BPF_ANY)) {
36                 log_err("Adding target cgroup to map");
37                 goto err;
38         }
39
40         if (join_cgroup(CGROUP_PATH))
41                 goto err;
42
43         /*
44          * The installed helper program catched the sync call, and should
45          * write it to the map.
46          */
47
48         sync();
49         bpf_map_lookup_elem(map_fd[1], &idx, &remote_pid);
50
51         if (local_pid != remote_pid) {
52                 fprintf(stderr,
53                         "BPF Helper didn't write correct PID to map, but: %d\n",
54                         remote_pid);
55                 goto err;
56         }
57
58         /* Verify the negative scenario; leave the cgroup */
59         if (join_cgroup("/"))
60                 goto err;
61
62         remote_pid = 0;
63         bpf_map_update_elem(map_fd[1], &idx, &remote_pid, BPF_ANY);
64
65         sync();
66         bpf_map_lookup_elem(map_fd[1], &idx, &remote_pid);
67
68         if (local_pid == remote_pid) {
69                 fprintf(stderr, "BPF cgroup negative test did not work\n");
70                 goto err;
71         }
72
73         goto out;
74 err:
75         rc = 1;
76
77 out:
78         close(cg2);
79         cleanup_cgroup_environment();
80         return rc;
81 }