Collecting cgroup statistics is expensive: the existing method is to open and parse a cgroup file for every cgroup of interest. The memory controller already has an efficient alternative through BPF; this series extends that model to the block I/O controller's per-device io.stat.
Patch 1 adds the blkcg flush and per-device iterator. Patch 2 adds a selftest that performs direct I/O on a private loop device and compares every counter read by BPF with io.stat. === Changes since v1. - Drop the blkcg acquire/release helpers. The program reads the io controller's css from cgroup->subsys[] under RCU instead. - Remove the kfuncs that read the blkg device ID and counters; BPF programs can read those fields with BPF_CORE_READ(). - Keep the flush sleepable. It now takes a struct cgroup * and pins its CSS internally. - Make the blkg iterator take an RCU-protected CSS. Tested on VM with v7.2-rc5. Ziyang Men (2): block: add BPF kfuncs to read blkcg io.stat selftests/bpf: add test for blkcg io.stat BPF kfuncs MAINTAINERS | 1 + block/Makefile | 3 + block/blk-cgroup.c | 2 +- block/blk-cgroup.h | 1 + block/bpf_blkcg.c | 154 ++++++++++ tools/testing/selftests/bpf/cgroup_iter_io.h | 17 ++ tools/testing/selftests/bpf/config | 1 + .../selftests/bpf/prog_tests/cgroup_iter_io.c | 277 ++++++++++++++++++ .../selftests/bpf/progs/cgroup_iter_io.c | 99 +++++++ 9 files changed, 554 insertions(+), 1 deletion(-) create mode 100644 block/bpf_blkcg.c create mode 100644 tools/testing/selftests/bpf/cgroup_iter_io.h create mode 100644 tools/testing/selftests/bpf/prog_tests/cgroup_iter_io.c create mode 100644 tools/testing/selftests/bpf/progs/cgroup_iter_io.c -- 2.53.0-Meta

