1 /* SPDX-License-Identifier: GPL-2.0 */ 2 #ifndef __BPF_UTIL__ 3 #define __BPF_UTIL__ 4 5 #include <stdio.h> 6 #include <stdlib.h> 7 #include <string.h> 8 #include <errno.h> 9 #include <bpf/libbpf.h> /* libbpf_num_possible_cpus */ 10 11 static inline unsigned int bpf_num_possible_cpus(void) 12 { 13 int possible_cpus = libbpf_num_possible_cpus(); 14 15 if (possible_cpus < 0) { 16 printf("Failed to get # of possible cpus: '%s'!\n", 17 strerror(-possible_cpus)); 18 exit(1); 19 } 20 return possible_cpus; 21 } 22 23 #define __bpf_percpu_val_align __attribute__((__aligned__(8))) 24 25 #define BPF_DECLARE_PERCPU(type, name) \ 26 struct { type v; /* padding */ } __bpf_percpu_val_align \ 27 name[bpf_num_possible_cpus()] 28 #define bpf_percpu(name, cpu) name[(cpu)].v 29 30 #ifndef ARRAY_SIZE 31 # define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) 32 #endif 33 34 #ifndef sizeof_field 35 #define sizeof_field(TYPE, MEMBER) sizeof((((TYPE *)0)->MEMBER)) 36 #endif 37 38 #ifndef offsetofend 39 #define offsetofend(TYPE, MEMBER) \ 40 (offsetof(TYPE, MEMBER) + sizeof_field(TYPE, MEMBER)) 41 #endif 42 43 #endif /* __BPF_UTIL__ */ 44