18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 28c2ecf20Sopenharmony_ci/* Copyright (c) 2016 Facebook 38c2ecf20Sopenharmony_ci */ 48c2ecf20Sopenharmony_ci#include <linux/unistd.h> 58c2ecf20Sopenharmony_ci#include <linux/bpf.h> 68c2ecf20Sopenharmony_ci 78c2ecf20Sopenharmony_ci#include <stdio.h> 88c2ecf20Sopenharmony_ci#include <stdint.h> 98c2ecf20Sopenharmony_ci#include <unistd.h> 108c2ecf20Sopenharmony_ci#include <string.h> 118c2ecf20Sopenharmony_ci#include <errno.h> 128c2ecf20Sopenharmony_ci#include <fcntl.h> 138c2ecf20Sopenharmony_ci 148c2ecf20Sopenharmony_ci#include <bpf/bpf.h> 158c2ecf20Sopenharmony_ci 168c2ecf20Sopenharmony_cistatic void usage(void) 178c2ecf20Sopenharmony_ci{ 188c2ecf20Sopenharmony_ci printf("Usage: test_cgrp2_array_pin [...]\n"); 198c2ecf20Sopenharmony_ci printf(" -F <file> File to pin an BPF cgroup array\n"); 208c2ecf20Sopenharmony_ci printf(" -U <file> Update an already pinned BPF cgroup array\n"); 218c2ecf20Sopenharmony_ci printf(" -v <value> Full path of the cgroup2\n"); 228c2ecf20Sopenharmony_ci printf(" -h Display this help\n"); 238c2ecf20Sopenharmony_ci} 248c2ecf20Sopenharmony_ci 258c2ecf20Sopenharmony_ciint main(int argc, char **argv) 268c2ecf20Sopenharmony_ci{ 278c2ecf20Sopenharmony_ci const char *pinned_file = NULL, *cg2 = NULL; 288c2ecf20Sopenharmony_ci int create_array = 1; 298c2ecf20Sopenharmony_ci int array_key = 0; 308c2ecf20Sopenharmony_ci int array_fd = -1; 318c2ecf20Sopenharmony_ci int cg2_fd = -1; 328c2ecf20Sopenharmony_ci int ret = -1; 338c2ecf20Sopenharmony_ci int opt; 348c2ecf20Sopenharmony_ci 358c2ecf20Sopenharmony_ci while ((opt = getopt(argc, argv, "F:U:v:")) != -1) { 368c2ecf20Sopenharmony_ci switch (opt) { 378c2ecf20Sopenharmony_ci /* General args */ 388c2ecf20Sopenharmony_ci case 'F': 398c2ecf20Sopenharmony_ci pinned_file = optarg; 408c2ecf20Sopenharmony_ci break; 418c2ecf20Sopenharmony_ci case 'U': 428c2ecf20Sopenharmony_ci pinned_file = optarg; 438c2ecf20Sopenharmony_ci create_array = 0; 448c2ecf20Sopenharmony_ci break; 458c2ecf20Sopenharmony_ci case 'v': 468c2ecf20Sopenharmony_ci cg2 = optarg; 478c2ecf20Sopenharmony_ci break; 488c2ecf20Sopenharmony_ci default: 498c2ecf20Sopenharmony_ci usage(); 508c2ecf20Sopenharmony_ci goto out; 518c2ecf20Sopenharmony_ci } 528c2ecf20Sopenharmony_ci } 538c2ecf20Sopenharmony_ci 548c2ecf20Sopenharmony_ci if (!cg2 || !pinned_file) { 558c2ecf20Sopenharmony_ci usage(); 568c2ecf20Sopenharmony_ci goto out; 578c2ecf20Sopenharmony_ci } 588c2ecf20Sopenharmony_ci 598c2ecf20Sopenharmony_ci cg2_fd = open(cg2, O_RDONLY); 608c2ecf20Sopenharmony_ci if (cg2_fd < 0) { 618c2ecf20Sopenharmony_ci fprintf(stderr, "open(%s,...): %s(%d)\n", 628c2ecf20Sopenharmony_ci cg2, strerror(errno), errno); 638c2ecf20Sopenharmony_ci goto out; 648c2ecf20Sopenharmony_ci } 658c2ecf20Sopenharmony_ci 668c2ecf20Sopenharmony_ci if (create_array) { 678c2ecf20Sopenharmony_ci array_fd = bpf_create_map(BPF_MAP_TYPE_CGROUP_ARRAY, 688c2ecf20Sopenharmony_ci sizeof(uint32_t), sizeof(uint32_t), 698c2ecf20Sopenharmony_ci 1, 0); 708c2ecf20Sopenharmony_ci if (array_fd < 0) { 718c2ecf20Sopenharmony_ci fprintf(stderr, 728c2ecf20Sopenharmony_ci "bpf_create_map(BPF_MAP_TYPE_CGROUP_ARRAY,...): %s(%d)\n", 738c2ecf20Sopenharmony_ci strerror(errno), errno); 748c2ecf20Sopenharmony_ci goto out; 758c2ecf20Sopenharmony_ci } 768c2ecf20Sopenharmony_ci } else { 778c2ecf20Sopenharmony_ci array_fd = bpf_obj_get(pinned_file); 788c2ecf20Sopenharmony_ci if (array_fd < 0) { 798c2ecf20Sopenharmony_ci fprintf(stderr, "bpf_obj_get(%s): %s(%d)\n", 808c2ecf20Sopenharmony_ci pinned_file, strerror(errno), errno); 818c2ecf20Sopenharmony_ci goto out; 828c2ecf20Sopenharmony_ci } 838c2ecf20Sopenharmony_ci } 848c2ecf20Sopenharmony_ci 858c2ecf20Sopenharmony_ci ret = bpf_map_update_elem(array_fd, &array_key, &cg2_fd, 0); 868c2ecf20Sopenharmony_ci if (ret) { 878c2ecf20Sopenharmony_ci perror("bpf_map_update_elem"); 888c2ecf20Sopenharmony_ci goto out; 898c2ecf20Sopenharmony_ci } 908c2ecf20Sopenharmony_ci 918c2ecf20Sopenharmony_ci if (create_array) { 928c2ecf20Sopenharmony_ci ret = bpf_obj_pin(array_fd, pinned_file); 938c2ecf20Sopenharmony_ci if (ret) { 948c2ecf20Sopenharmony_ci fprintf(stderr, "bpf_obj_pin(..., %s): %s(%d)\n", 958c2ecf20Sopenharmony_ci pinned_file, strerror(errno), errno); 968c2ecf20Sopenharmony_ci goto out; 978c2ecf20Sopenharmony_ci } 988c2ecf20Sopenharmony_ci } 998c2ecf20Sopenharmony_ci 1008c2ecf20Sopenharmony_ciout: 1018c2ecf20Sopenharmony_ci if (array_fd != -1) 1028c2ecf20Sopenharmony_ci close(array_fd); 1038c2ecf20Sopenharmony_ci if (cg2_fd != -1) 1048c2ecf20Sopenharmony_ci close(cg2_fd); 1058c2ecf20Sopenharmony_ci return ret; 1068c2ecf20Sopenharmony_ci} 107