Loading...
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 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 | #include "bpf_experimental.h" struct val_t { long b, c, d; }; struct elem { long sum; struct val_t __percpu_kptr *pc; }; struct { __uint(type, BPF_MAP_TYPE_CGRP_STORAGE); __uint(map_flags, BPF_F_NO_PREALLOC); __type(key, int); __type(value, struct elem); } cgrp SEC(".maps"); const volatile int nr_cpus; /* Initialize the percpu object */ SEC("fentry/bpf_fentry_test1") int BPF_PROG(test_cgrp_local_storage_1) { struct task_struct *task; struct val_t __percpu_kptr *p; struct elem *e; task = bpf_get_current_task_btf(); e = bpf_cgrp_storage_get(&cgrp, task->cgroups->dfl_cgrp, 0, BPF_LOCAL_STORAGE_GET_F_CREATE); if (!e) return 0; p = bpf_percpu_obj_new(struct val_t); if (!p) return 0; p = bpf_kptr_xchg(&e->pc, p); if (p) bpf_percpu_obj_drop(p); return 0; } /* Percpu data collection */ SEC("fentry/bpf_fentry_test2") int BPF_PROG(test_cgrp_local_storage_2) { struct task_struct *task; struct val_t __percpu_kptr *p; struct val_t *v; struct elem *e; task = bpf_get_current_task_btf(); e = bpf_cgrp_storage_get(&cgrp, task->cgroups->dfl_cgrp, 0, 0); if (!e) return 0; p = e->pc; if (!p) return 0; v = bpf_per_cpu_ptr(p, 0); if (!v) return 0; v->c = 1; v->d = 2; return 0; } int cpu0_field_d, sum_field_c; int my_pid; /* Summarize percpu data collection */ SEC("fentry/bpf_fentry_test3") int BPF_PROG(test_cgrp_local_storage_3) { struct task_struct *task; struct val_t __percpu_kptr *p; struct val_t *v; struct elem *e; int i; if ((bpf_get_current_pid_tgid() >> 32) != my_pid) return 0; task = bpf_get_current_task_btf(); e = bpf_cgrp_storage_get(&cgrp, task->cgroups->dfl_cgrp, 0, 0); if (!e) return 0; p = e->pc; if (!p) return 0; bpf_for(i, 0, nr_cpus) { v = bpf_per_cpu_ptr(p, i); if (v) { if (i == 0) cpu0_field_d = v->d; sum_field_c += v->c; } } return 0; } char _license[] SEC("license") = "GPL"; |