150c6b8a9SHao Luo // SPDX-License-Identifier: GPL-2.0
250c6b8a9SHao Luo /* Copyright (c) 2022 Google */
350c6b8a9SHao Luo #include "vmlinux.h"
450c6b8a9SHao Luo #include <bpf/bpf_helpers.h>
550c6b8a9SHao Luo #include <bpf/bpf_tracing.h>
650c6b8a9SHao Luo 
750c6b8a9SHao Luo struct bpf_testmod_btf_type_tag_1 {
850c6b8a9SHao Luo 	int a;
950c6b8a9SHao Luo };
1050c6b8a9SHao Luo 
1150c6b8a9SHao Luo struct bpf_testmod_btf_type_tag_2 {
1250c6b8a9SHao Luo 	struct bpf_testmod_btf_type_tag_1 *p;
1350c6b8a9SHao Luo };
1450c6b8a9SHao Luo 
1550c6b8a9SHao Luo __u64 g;
1650c6b8a9SHao Luo 
1750c6b8a9SHao Luo SEC("fentry/bpf_testmod_test_btf_type_tag_percpu_1")
BPF_PROG(test_percpu1,struct bpf_testmod_btf_type_tag_1 * arg)1850c6b8a9SHao Luo int BPF_PROG(test_percpu1, struct bpf_testmod_btf_type_tag_1 *arg)
1950c6b8a9SHao Luo {
2050c6b8a9SHao Luo 	g = arg->a;
2150c6b8a9SHao Luo 	return 0;
2250c6b8a9SHao Luo }
2350c6b8a9SHao Luo 
2450c6b8a9SHao Luo SEC("fentry/bpf_testmod_test_btf_type_tag_percpu_2")
BPF_PROG(test_percpu2,struct bpf_testmod_btf_type_tag_2 * arg)2550c6b8a9SHao Luo int BPF_PROG(test_percpu2, struct bpf_testmod_btf_type_tag_2 *arg)
2650c6b8a9SHao Luo {
2750c6b8a9SHao Luo 	g = arg->p->a;
2850c6b8a9SHao Luo 	return 0;
2950c6b8a9SHao Luo }
3050c6b8a9SHao Luo 
3150c6b8a9SHao Luo /* trace_cgroup_mkdir(struct cgroup *cgrp, const char *path)
3250c6b8a9SHao Luo  *
3350c6b8a9SHao Luo  * struct cgroup_rstat_cpu {
3450c6b8a9SHao Luo  *   ...
3550c6b8a9SHao Luo  *   struct cgroup *updated_children;
3650c6b8a9SHao Luo  *   ...
3750c6b8a9SHao Luo  * };
3850c6b8a9SHao Luo  *
3950c6b8a9SHao Luo  * struct cgroup {
4050c6b8a9SHao Luo  *   ...
4150c6b8a9SHao Luo  *   struct cgroup_rstat_cpu __percpu *rstat_cpu;
4250c6b8a9SHao Luo  *   ...
4350c6b8a9SHao Luo  * };
4450c6b8a9SHao Luo  */
4550c6b8a9SHao Luo SEC("tp_btf/cgroup_mkdir")
BPF_PROG(test_percpu_load,struct cgroup * cgrp,const char * path)4650c6b8a9SHao Luo int BPF_PROG(test_percpu_load, struct cgroup *cgrp, const char *path)
4750c6b8a9SHao Luo {
4850c6b8a9SHao Luo 	g = (__u64)cgrp->rstat_cpu->updated_children;
4950c6b8a9SHao Luo 	return 0;
5050c6b8a9SHao Luo }
5150c6b8a9SHao Luo 
5250c6b8a9SHao Luo SEC("tp_btf/cgroup_mkdir")
BPF_PROG(test_percpu_helper,struct cgroup * cgrp,const char * path)5350c6b8a9SHao Luo int BPF_PROG(test_percpu_helper, struct cgroup *cgrp, const char *path)
5450c6b8a9SHao Luo {
5550c6b8a9SHao Luo 	struct cgroup_rstat_cpu *rstat;
5650c6b8a9SHao Luo 	__u32 cpu;
5750c6b8a9SHao Luo 
5850c6b8a9SHao Luo 	cpu = bpf_get_smp_processor_id();
5950c6b8a9SHao Luo 	rstat = (struct cgroup_rstat_cpu *)bpf_per_cpu_ptr(cgrp->rstat_cpu, cpu);
6050c6b8a9SHao Luo 	if (rstat) {
6150c6b8a9SHao Luo 		/* READ_ONCE */
6250c6b8a9SHao Luo 		*(volatile int *)rstat;
6350c6b8a9SHao Luo 	}
6450c6b8a9SHao Luo 
6550c6b8a9SHao Luo 	return 0;
6650c6b8a9SHao Luo }
67*c67cae55SAlexei Starovoitov char _license[] SEC("license") = "GPL";
68