This series exposes the block I/O controller's per-device statistics (io.stat) to BPF via read-only kfuncs, mirroring the kfuncs for the memory controller in mm/bpf_memcontrol.c.
Motivation: Collecting cgroup statistics is expensive: the existing method is to open and parse a cgroup file for every cgroup of interest. memcg already has an efficient alternative through BPF; this series extends that idea to block. The main difference from the memory controller is that blkcg keeps one blkg (one io.stat line) per block device, so the readers operate on a blkg and the iterator yields them under RCU. Reads take the same u64_stats seqlock as the io.stat file, so the kfuncs add no fast-path cost. The root cgroup needs its own path. It is not accounted through rstat at all, so bpf_blkcg_flush_stats() branches the way blkcg_print_stat() does and refills the root's per-device aggregates from the disks' own statistics. That is the only reason the series touches blk-cgroup.c and blk-cgroup.h: blkcg_fill_root_iostats() is no longer static. Nothing on the I/O path changes. Patch 1 adds the kfuncs (block/bpf_blkcg.c); patch 2 adds a test_progs selftest that drives direct I/O to a loop device and checks 1) that the measured values are non-zero (as cgroup_iter_memcg does), 2) that each kfunc value exactly matches the cgroup's io.stat file for that device, and 3) that the same device read through the root block cgroup is at or above what the test cgroup was charged. Tested on v7.2-rc5 with the series applied: all five cgroup_iter_io subtests pass (write/read/dev/match/root). 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 | 315 ++++++++++++++++++ tools/testing/selftests/bpf/cgroup_iter_io.h | 17 + tools/testing/selftests/bpf/config | 1 + .../selftests/bpf/prog_tests/cgroup_iter_io.c | 310 +++++++++++++++++ .../selftests/bpf/progs/cgroup_iter_io.c | 107 ++++++ 9 files changed, 756 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

