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