1 #ifndef __BPF_UTIL__ 2 #define __BPF_UTIL__ 3 4 #include <stdio.h> 5 #include <stdlib.h> 6 #include <string.h> 7 #include <errno.h> 8 9 static inline unsigned int bpf_num_possible_cpus(void) 10 { 11 static const char *fcpu = "/sys/devices/system/cpu/possible"; 12 unsigned int start, end, possible_cpus = 0; 13 char buff[128]; 14 FILE *fp; 15 int n; 16 17 fp = fopen(fcpu, "r"); 18 if (!fp) { 19 printf("Failed to open %s: '%s'!\n", fcpu, strerror(errno)); 20 exit(1); 21 } 22 23 while (fgets(buff, sizeof(buff), fp)) { 24 n = sscanf(buff, "%u-%u", &start, &end); 25 if (n == 0) { 26 printf("Failed to retrieve # possible CPUs!\n"); 27 exit(1); 28 } else if (n == 1) { 29 end = start; 30 } 31 possible_cpus = start == 0 ? end + 1 : 0; 32 break; 33 } 34 fclose(fp); 35 36 return possible_cpus; 37 } 38 39 #define __bpf_percpu_val_align __attribute__((__aligned__(8))) 40 41 #define BPF_DECLARE_PERCPU(type, name) \ 42 struct { type v; /* padding */ } __bpf_percpu_val_align \ 43 name[bpf_num_possible_cpus()] 44 #define bpf_percpu(name, cpu) name[(cpu)].v 45 46 #endif /* __BPF_UTIL__ */ 47