1// SPDX-License-Identifier: GPL-2.0-only
2/* Copyright (c) 2016 Facebook
3 */
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
14#include <bpf/bpf.h>
15
16static void usage(void)
17{
18 printf(format: "Usage: test_cgrp2_array_pin [...]\n");
19 printf(format: " -F <file> File to pin an BPF cgroup array\n");
20 printf(format: " -U <file> Update an already pinned BPF cgroup array\n");
21 printf(format: " -v <value> Full path of the cgroup2\n");
22 printf(format: " -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: argc, argv: argv, shortopts: "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(file: cg2, O_RDONLY);
60 if (cg2_fd < 0) {
61 fprintf(stderr, format: "open(%s,...): %s(%d)\n",
62 cg2, strerror(errno), errno);
63 goto out;
64 }
65
66 if (create_array) {
67 array_fd = bpf_map_create(BPF_MAP_TYPE_CGROUP_ARRAY, NULL,
68 sizeof(uint32_t), sizeof(uint32_t),
69 1, NULL);
70 if (array_fd < 0) {
71 fprintf(stderr,
72 format: "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, format: "bpf_obj_get(%s): %s(%d)\n",
80 pinned_file, strerror(errno), errno);
81 goto out;
82 }
83 }
84
85 ret = bpf_map_update_elem(array_fd, &array_key, &cg2_fd, 0);
86 if (ret) {
87 perror(s: "bpf_map_update_elem");
88 goto out;
89 }
90
91 if (create_array) {
92 ret = bpf_obj_pin(array_fd, pinned_file);
93 if (ret) {
94 fprintf(stderr, format: "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(fd: array_fd);
103 if (cg2_fd != -1)
104 close(fd: cg2_fd);
105 return ret;
106}
107

source code of linux/samples/bpf/test_cgrp2_array_pin.c