[PATCH v2 0/2] block: expose blkcg io.stat to BPF

From: Ziyang Men

Date: Mon Aug 17 2026 - 17:42:28 EST


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