blob: 05e88aa63009c5bb0aeeb126c33d2b601136f8cc [file] [log] [blame]
Thomas Gleixner25763b32019-05-28 10:10:09 -07001// SPDX-License-Identifier: GPL-2.0-only
Martin KaFai Laua3f74612016-06-30 10:28:45 -07002/* Copyright (c) 2016 Facebook
Martin KaFai Laua3f74612016-06-30 10:28:45 -07003 */
4#include <linux/unistd.h>
5#include <linux/bpf.h>
6
7#include <stdio.h>
8#include <stdint.h>
9#include <unistd.h>
10#include <string.h>
11#include <errno.h>
12#include <fcntl.h>
13
Jakub Kicinski2bf3e2e2018-05-14 22:35:02 -070014#include <bpf/bpf.h>
Martin KaFai Laua3f74612016-06-30 10:28:45 -070015
16static void usage(void)
17{
18 printf("Usage: test_cgrp2_array_pin [...]\n");
19 printf(" -F <file> File to pin an BPF cgroup array\n");
20 printf(" -U <file> Update an already pinned BPF cgroup array\n");
21 printf(" -v <value> Full path of the cgroup2\n");
22 printf(" -h Display this help\n");
23}
24
25int main(int argc, char **argv)
26{
27 const char *pinned_file = NULL, *cg2 = NULL;
28 int create_array = 1;
29 int array_key = 0;
30 int array_fd = -1;
31 int cg2_fd = -1;
32 int ret = -1;
33 int opt;
34
35 while ((opt = getopt(argc, argv, "F:U:v:")) != -1) {
36 switch (opt) {
37 /* General args */
38 case 'F':
39 pinned_file = optarg;
40 break;
41 case 'U':
42 pinned_file = optarg;
43 create_array = 0;
44 break;
45 case 'v':
46 cg2 = optarg;
47 break;
48 default:
49 usage();
50 goto out;
51 }
52 }
53
54 if (!cg2 || !pinned_file) {
55 usage();
56 goto out;
57 }
58
59 cg2_fd = open(cg2, O_RDONLY);
60 if (cg2_fd < 0) {
61 fprintf(stderr, "open(%s,...): %s(%d)\n",
62 cg2, strerror(errno), errno);
63 goto out;
64 }
65
66 if (create_array) {
Andrii Nakryikoc58f9812021-12-01 15:28:23 -080067 array_fd = bpf_map_create(BPF_MAP_TYPE_CGROUP_ARRAY, NULL,
Martin KaFai Laua3f74612016-06-30 10:28:45 -070068 sizeof(uint32_t), sizeof(uint32_t),
Andrii Nakryikoc58f9812021-12-01 15:28:23 -080069 1, NULL);
Martin KaFai Laua3f74612016-06-30 10:28:45 -070070 if (array_fd < 0) {
71 fprintf(stderr,
72 "bpf_create_map(BPF_MAP_TYPE_CGROUP_ARRAY,...): %s(%d)\n",
73 strerror(errno), errno);
74 goto out;
75 }
76 } else {
77 array_fd = bpf_obj_get(pinned_file);
78 if (array_fd < 0) {
79 fprintf(stderr, "bpf_obj_get(%s): %s(%d)\n",
80 pinned_file, strerror(errno), errno);
81 goto out;
82 }
83 }
84
Joe Stringerd40fc182016-12-14 14:43:38 -080085 ret = bpf_map_update_elem(array_fd, &array_key, &cg2_fd, 0);
Martin KaFai Laua3f74612016-06-30 10:28:45 -070086 if (ret) {
Joe Stringerd40fc182016-12-14 14:43:38 -080087 perror("bpf_map_update_elem");
Martin KaFai Laua3f74612016-06-30 10:28:45 -070088 goto out;
89 }
90
91 if (create_array) {
92 ret = bpf_obj_pin(array_fd, pinned_file);
93 if (ret) {
94 fprintf(stderr, "bpf_obj_pin(..., %s): %s(%d)\n",
95 pinned_file, strerror(errno), errno);
96 goto out;
97 }
98 }
99
100out:
101 if (array_fd != -1)
102 close(array_fd);
103 if (cg2_fd != -1)
104 close(cg2_fd);
105 return ret;
106}