| From: |
| Chengkaitao <pilgrimtao-AT-gmail.com> |
| To: |
| axboe-AT-kernel.dk, pjw-AT-kernel.org, palmer-AT-dabbelt.com, aou-AT-eecs.berkeley.edu, alex-AT-ghiti.fr, ojeda-AT-kernel.org, boqun-AT-kernel.org, gary-AT-garyguo.net, bjorn3_gh-AT-protonmail.com, lossin-AT-kernel.org, a.hindborg-AT-kernel.org, aliceryhl-AT-google.com, tmgross-AT-umich.edu, dakr-AT-kernel.org, nathan-AT-kernel.org, nick.desaulniers+lkml-AT-gmail.com, morbo-AT-google.com, justinstitt-AT-google.com |
| Subject: |
| [RFC 0/2] block: Introduce a BPF-based I/O scheduler |
| Date: |
| Fri, 27 Mar 2026 19:47:39 +0800 |
| Message-ID: |
| <20260327114741.91500-1-pilgrimtao@gmail.com> |
| Cc: |
| linux-block-AT-vger.kernel.org, linux-kernel-AT-vger.kernel.org, linux-riscv-AT-lists.infradead.org, rust-for-linux-AT-vger.kernel.org, bpf-AT-vger.kernel.org, llvm-AT-lists.linux.dev, Kaitao Cheng <chengkaitao-AT-kylinos.cn> |
| Archive-link: |
| Article |
From: Kaitao Cheng <chengkaitao@kylinos.cn>
I have been working on adding a new BPF-based I/O scheduler. It has both
kernel and user-space parts. In kernel space, using per-ctx, I implemented
a simple elevator that exposes a set of BPF hooks. The goal is to move the
policy side of I/O scheduling out of the kernel and into user space, which
should greatly increase flexibility and applicability. To verify that the
whole stack works end to end, I wrote a simple BPF example program. I am
calling this feature the UFQ (User-programmable Flexible Queueing) I/O
scheduler.
This patch depends on new BPF functionality that I have already posted to
the BPF community but that is not yet in mainline. Details are in these
two threads:
https://lore.kernel.org/all/20260214124042.62229-1-pilgri...
https://lore.kernel.org/all/20260316112843.78657-1-pilgri...
To try it, you need to apply the patches from those series first.
Note: This is still somewhat experimental. I have only done basic testing,
there may be bugs or security issues, which I plan to address in follow-up
work. I am also looking for community feedback on whether this direction
and the implementation approach make sense, and what else we should
consider.
Kaitao Cheng (2):
block: Introduce the UFQ I/O scheduler
tools/ufq_iosched: add BPF example scheduler and build scaffolding
block/Kconfig.iosched | 8 +
block/Makefile | 1 +
block/blk-merge.c | 49 +-
block/blk-mq-sched.h | 4 +
block/blk-mq.c | 8 +-
block/blk-mq.h | 2 +-
block/blk.h | 2 +
block/ufq-bpfops.c | 213 +++++++
block/ufq-iosched.c | 526 ++++++++++++++++++
block/ufq-iosched.h | 38 ++
block/ufq-kfunc.c | 91 +++
tools/ufq_iosched/.gitignore | 2 +
tools/ufq_iosched/Makefile | 262 +++++++++
tools/ufq_iosched/README.md | 136 +++++
.../include/bpf-compat/gnu/stubs.h | 12 +
tools/ufq_iosched/include/ufq/common.bpf.h | 73 +++
tools/ufq_iosched/include/ufq/common.h | 91 +++
tools/ufq_iosched/include/ufq/simple_stat.h | 21 +
tools/ufq_iosched/ufq_simple.bpf.c | 445 +++++++++++++++
tools/ufq_iosched/ufq_simple.c | 118 ++++
20 files changed, 2094 insertions(+), 8 deletions(-)
create mode 100644 block/ufq-bpfops.c
create mode 100644 block/ufq-iosched.c
create mode 100644 block/ufq-iosched.h
create mode 100644 block/ufq-kfunc.c
create mode 100644 tools/ufq_iosched/.gitignore
create mode 100644 tools/ufq_iosched/Makefile
create mode 100644 tools/ufq_iosched/README.md
create mode 100644 tools/ufq_iosched/include/bpf-compat/gnu/stubs.h
create mode 100644 tools/ufq_iosched/include/ufq/common.bpf.h
create mode 100644 tools/ufq_iosched/include/ufq/common.h
create mode 100644 tools/ufq_iosched/include/ufq/simple_stat.h
create mode 100644 tools/ufq_iosched/ufq_simple.bpf.c
create mode 100644 tools/ufq_iosched/ufq_simple.c
--
2.43.0