xref: /linux/tools/testing/selftests/bpf/progs/cgroup_iter_memcg.c (revision f17b474e36647c23801ef8fdaf2255ab66dd2973)
1 // SPDX-License-Identifier: GPL-2.0
2 /* Copyright (c) 2025 Meta Platforms, Inc. and affiliates. */
3 #include <vmlinux.h>
4 #include <bpf/bpf_core_read.h>
5 #include "cgroup_iter_memcg.h"
6 
7 char _license[] SEC("license") = "GPL";
8 
9 /* The latest values read are stored here. */
10 struct memcg_query memcg_query SEC(".data.query");
11 
12 SEC("iter.s/cgroup")
13 int cgroup_memcg_query(struct bpf_iter__cgroup *ctx)
14 {
15 	struct cgroup *cgrp = ctx->cgroup;
16 	struct cgroup_subsys_state *css;
17 	struct mem_cgroup *memcg;
18 
19 	if (!cgrp)
20 		return 1;
21 
22 	css = &cgrp->self;
23 	memcg = bpf_get_mem_cgroup(css);
24 	if (!memcg)
25 		return 1;
26 
27 	bpf_mem_cgroup_flush_stats(memcg);
28 
29 	memcg_query.nr_anon_mapped = bpf_mem_cgroup_page_state(memcg, NR_ANON_MAPPED);
30 	memcg_query.nr_shmem = bpf_mem_cgroup_page_state(memcg, NR_SHMEM);
31 	memcg_query.nr_file_pages = bpf_mem_cgroup_page_state(memcg, NR_FILE_PAGES);
32 	memcg_query.nr_file_mapped = bpf_mem_cgroup_page_state(memcg, NR_FILE_MAPPED);
33 	memcg_query.memcg_kmem = bpf_mem_cgroup_page_state(memcg, MEMCG_KMEM);
34 	memcg_query.pgfault = bpf_mem_cgroup_vm_events(memcg, PGFAULT);
35 
36 	bpf_put_mem_cgroup(memcg);
37 
38 	return 0;
39 }
40