Blame view

samples/bpf/test_cgrp2_array_pin.c 2.24 KB
a3f746173   Martin KaFai Lau   cgroup: bpf: Add ...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
  /* Copyright (c) 2016 Facebook
   *
   * This program is free software; you can redistribute it and/or
   * modify it under the terms of version 2 of the GNU General Public
   * License as published by the Free Software Foundation.
   */
  #include <linux/unistd.h>
  #include <linux/bpf.h>
  
  #include <stdio.h>
  #include <stdint.h>
  #include <unistd.h>
  #include <string.h>
  #include <errno.h>
  #include <fcntl.h>
  
  #include "libbpf.h"
  
  static void usage(void)
  {
  	printf("Usage: test_cgrp2_array_pin [...]
  ");
  	printf("       -F <file>   File to pin an BPF cgroup array
  ");
  	printf("       -U <file>   Update an already pinned BPF cgroup array
  ");
  	printf("       -v <value>  Full path of the cgroup2
  ");
  	printf("       -h          Display this help
  ");
  }
  
  int main(int argc, char **argv)
  {
  	const char *pinned_file = NULL, *cg2 = NULL;
  	int create_array = 1;
  	int array_key = 0;
  	int array_fd = -1;
  	int cg2_fd = -1;
  	int ret = -1;
  	int opt;
  
  	while ((opt = getopt(argc, argv, "F:U:v:")) != -1) {
  		switch (opt) {
  		/* General args */
  		case 'F':
  			pinned_file = optarg;
  			break;
  		case 'U':
  			pinned_file = optarg;
  			create_array = 0;
  			break;
  		case 'v':
  			cg2 = optarg;
  			break;
  		default:
  			usage();
  			goto out;
  		}
  	}
  
  	if (!cg2 || !pinned_file) {
  		usage();
  		goto out;
  	}
  
  	cg2_fd = open(cg2, O_RDONLY);
  	if (cg2_fd < 0) {
  		fprintf(stderr, "open(%s,...): %s(%d)
  ",
  			cg2, strerror(errno), errno);
  		goto out;
  	}
  
  	if (create_array) {
  		array_fd = bpf_create_map(BPF_MAP_TYPE_CGROUP_ARRAY,
  					  sizeof(uint32_t), sizeof(uint32_t),
  					  1, 0);
  		if (array_fd < 0) {
  			fprintf(stderr,
  				"bpf_create_map(BPF_MAP_TYPE_CGROUP_ARRAY,...): %s(%d)
  ",
  				strerror(errno), errno);
  			goto out;
  		}
  	} else {
  		array_fd = bpf_obj_get(pinned_file);
  		if (array_fd < 0) {
  			fprintf(stderr, "bpf_obj_get(%s): %s(%d)
  ",
  				pinned_file, strerror(errno), errno);
  			goto out;
  		}
  	}
d40fc181e   Joe Stringer   samples/bpf: Make...
95
  	ret = bpf_map_update_elem(array_fd, &array_key, &cg2_fd, 0);
a3f746173   Martin KaFai Lau   cgroup: bpf: Add ...
96
  	if (ret) {
d40fc181e   Joe Stringer   samples/bpf: Make...
97
  		perror("bpf_map_update_elem");
a3f746173   Martin KaFai Lau   cgroup: bpf: Add ...
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
  		goto out;
  	}
  
  	if (create_array) {
  		ret = bpf_obj_pin(array_fd, pinned_file);
  		if (ret) {
  			fprintf(stderr, "bpf_obj_pin(..., %s): %s(%d)
  ",
  				pinned_file, strerror(errno), errno);
  			goto out;
  		}
  	}
  
  out:
  	if (array_fd != -1)
  		close(array_fd);
  	if (cg2_fd != -1)
  		close(cg2_fd);
  	return ret;
  }