1/* 2 * bpf-script-example.c 3 * Test basic LLVM building 4 */ 5#ifndef LINUX_VERSION_CODE 6# error Need LINUX_VERSION_CODE 7# error Example: for 4.2 kernel, put 'clang-opt="-DLINUX_VERSION_CODE=0x40200" into llvm section of ~/.perfconfig' 8#endif 9#define BPF_ANY 0 10#define BPF_MAP_TYPE_ARRAY 2 11#define BPF_FUNC_map_lookup_elem 1 12#define BPF_FUNC_map_update_elem 2 13 14static void *(*bpf_map_lookup_elem)(void *map, void *key) = 15 (void *) BPF_FUNC_map_lookup_elem; 16static void *(*bpf_map_update_elem)(void *map, void *key, void *value, int flags) = 17 (void *) BPF_FUNC_map_update_elem; 18 19struct bpf_map_def { 20 unsigned int type; 21 unsigned int key_size; 22 unsigned int value_size; 23 unsigned int max_entries; 24}; 25 26#define SEC(NAME) __attribute__((section(NAME), used)) 27struct bpf_map_def SEC("maps") flip_table = { 28 .type = BPF_MAP_TYPE_ARRAY, 29 .key_size = sizeof(int), 30 .value_size = sizeof(int), 31 .max_entries = 1, 32}; 33 34SEC("func=sys_epoll_pwait") 35int bpf_func__sys_epoll_pwait(void *ctx) 36{ 37 int ind =0; 38 int *flag = bpf_map_lookup_elem(&flip_table, &ind); 39 int new_flag; 40 if (!flag) 41 return 0; 42 /* flip flag and store back */ 43 new_flag = !*flag; 44 bpf_map_update_elem(&flip_table, &ind, &new_flag, BPF_ANY); 45 return new_flag; 46} 47char _license[] SEC("license") = "GPL"; 48int _version SEC("version") = LINUX_VERSION_CODE; 49