The Linux Kernel Mailing List
 help / color / mirror / Atom feed
* [PATCHSET RFC] sched_ext: Implement cgroup sub-scheduler support
@ 2025-09-20  0:58 Tejun Heo
  2025-09-20  0:58 ` [PATCH 01/46] sched_ext: Use rhashtable_lookup() instead of rhashtable_lookup_fast() Tejun Heo
                   ` (45 more replies)
  0 siblings, 46 replies; 47+ messages in thread
From: Tejun Heo @ 2025-09-20  0:58 UTC (permalink / raw)
  To: void, arighi, multics69; +Cc: linux-kernel, sched-ext, memxor, bpf

This patchset implements cgroup sub-scheduler support for sched_ext,
enabling multiple schedulers to operate hierarchically within the cgroup
tree. This capability supports multi-tenant server environments and other
scenarios where systems must be partitioned to serve distinct workloads,
each requiring specialized scheduling policies.

Traditional approaches rely on hard partitioning via cpuset, but this
approach lacks the dynamism required by modern workloads. Users typically
care less about specific CPU assignments and more about optimizations
available on larger machines: opportunistic over-commit, improved latency
for critical workloads while preserving bandwidth fairness, control
mechanisms beyond simple CPU time (such as memory bandwidth isolation),
and intelligent placement to optimize cache locality.

The cgroup sub-scheduler approach enables schedulers to attach anywhere
in the cgroup hierarchy, with parent schedulers dynamically controlling
CPU allocation to their children. This design provides BPF-driven
flexibility while eliminating the constraints of hard partitioning.

This early-stage implementation demonstrates the fundamental building
blocks for hierarchical scheduler operation. While the enqueue path and
other components require further development, this patchset establishes
the core mechanisms for nested scheduler operation and is developed
enough to showcase all essential components.

The framework supports scheduling hierarchies up to SCX_SUB_MAX_DEPTH
levels (currently set to 4). Enable and disable operations selectively
bypass only tasks within the affected subtree, minimizing system-wide
disruptions while providing reasonable isolation for child scheduler
failures.

To see how this looks from the BPF scheduler perspective, examine the
scx_qmap.bpf.c changes in the final patch, which demonstrate simple
nested dispatch implementation.

Patch Organization:

Standalone fixes (01-07):
 01 sched_ext: Use rhashtable_lookup() instead of rhashtable_lookup_fast()
 02 sched_ext: Improve SCX_KF_DISPATCH comment
 03 sched_ext: Fix stray scx_root usage in task_can_run_on()
 04 sched_ext: Use bitfields for boolean warning flags
 05 sched_ext: Add SCX_EFLAG_INITIALIZED to indicate successful initialization
 06 sched_ext: Make qmap dump operation non-destructive
 07 tools/sched_ext: scx_qmap: Make debug output quieter by default

Preparation patches (08-22):
 08 sched_ext: Separate out scx_kick_cpu() and add sch to its name
 09 sched_ext: Add the sch parameter to __bstr_format()
 10 sched_ext: Add the sch parameter to ext_idle helpers
 11 sched_ext: Drop kf_cpu_valid
 12 sched_ext: Add the sch parameter to scx_dsq_insert_preamble()
 13 sched_ext: Drop scx_kf_exit() and scx_kf_error()
 14 sched_ext: Misc updates around scx_sched instance pointer handling
 15 sched_ext: Keep dying tasks on a separate list
 16 sched_ext: Implement cgroup subtree iteration for scx_task_iter
 17 sched_ext: Add kargs to scx_fork()
 18 sched/core: Swap the order between sched_post_fork() and wake_up_new_task()
 19 cgroup: Expose some cgroup helpers
 20 sched_ext: Update p->scx.disallow warning in scx_init_task()
 21 sched_ext: Minor reorganization of enable/disable paths
 22 sched_ext: Factor out scx_claim_exit() from scx_disable()

Core sub-scheduler implementation (23-40):
 23 sched_ext: Introduce cgroup sub-sched support
 24 HACK_NOT_FOR_UPSTREAM: BPF: Implement prog grouping hack
 25 sched_ext: Introduce scx_task_sched()/_rcu()
 26 sched_ext: Introduce scx_prog_sched()
 27 sched_ext: Ignore insertions of not owned tasks into sub-sched DSQs
 28 sched_ext: scx_dsq_move() should validate the task belongs to the dsq
 29 sched_ext: Refactor task init/exit helpers
 30 sched_ext: Make scx_prio_less() handle multiple schedulers
 31 sched_ext: Move bypass_depth into scx_sched
 32 sched_ext: Make bypass mode sub-sched aware
 33 sched_ext: Factor out scx_dispatch_sched()
 34 sched_ext: When calling ops.dispatch(), prev must be on the correct sched
 35 sched_ext: Dispatch from all scx_sched instances
 36 sched_ext: Move scx_dsp_ctx and scx_dsp_max_batch into scx_sched
 37 sched_ext: Make watchdog sub-sched aware
 38 sched_ext: Convert scx_dump_state() spinlock to raw spinlock
 39 sched_ext: Support dumping multiple schedulers and add scheduler identification
 40 sched_ext: Implement cgroup sub-sched enabling and disabling

Nested dispatch implementation (41-46):
 41 HACK_NOT_FOR_UPSTREAM: sched_ext: Work around @aux__prog prototype mismatch
 42 sched_ext: Wrap global DSQs in per-node structure
 43 sched_ext: Add bypass DSQ for sub-schedulers
 44 sched_ext: Factor out scx_link_sched() and scx_unlink_sched()
 45 sched_ext: Add rhashtable lookup for sub-schedulers
 46 sched_ext: Add basic building blocks for nested sub-scheduler dispatching

Implementation Notes:
- Patches 01-07: Independent fixes to be separated after merge window
- Patches 08-22: Infrastructure preparation (mostly sched_ext, one cgroup change)
- Patch 23: Skeletal sub-scheduler support (create/destroy only)
- Patches 24,41: Temporary BPF hacks requiring proper upstream solution
- Patches 25-39: Task migration and multi-scheduler operation mechanisms
- Patch 40: Full sub-scheduler enable/disable with ops.dispatch() support
  (enqueue path not yet implemented)
- Patches 42-46: Nested dispatch infrastructure and scx_bpf_dispatch_sched()

The patches are available in the git repository:
git://git.kernel.org/pub/scm/linux/kernel/git/tj/sched_ext.git scx-sub-sched

 include/linux/bpf.h                      |    5
 include/linux/cgroup-defs.h              |    4
 include/linux/cgroup.h                   |   65
 include/linux/sched.h                    |    2
 include/linux/sched/ext.h                |   21
 init/Kconfig                             |    4
 kernel/bpf/syscall.c                     |   23
 kernel/cgroup/cgroup-internal.h          |    6
 kernel/cgroup/cgroup.c                   |   55
 kernel/exit.c                            |    1
 kernel/fork.c                            |    6
 kernel/sched/core.c                      |    2
 kernel/sched/ext.c                       | 2362 ++++++++++++++++++++++++-------
 kernel/sched/ext.h                       |    4
 kernel/sched/ext_idle.c                  |  197 ++
 kernel/sched/ext_internal.h              |  223 ++
 kernel/sched/sched.h                     |    7
 tools/sched_ext/include/scx/common.bpf.h |   90 -
 tools/sched_ext/include/scx/compat.bpf.h |    7
 tools/sched_ext/scx_qmap.bpf.c           |  146 +
 tools/sched_ext/scx_qmap.c               |   36
 21 files changed, 2556 insertions(+), 710 deletions(-)

^ permalink raw reply	[flat|nested] 47+ messages in thread

end of thread, other threads:[~2025-09-20  1:00 UTC | newest]

Thread overview: 47+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-09-20  0:58 [PATCHSET RFC] sched_ext: Implement cgroup sub-scheduler support Tejun Heo
2025-09-20  0:58 ` [PATCH 01/46] sched_ext: Use rhashtable_lookup() instead of rhashtable_lookup_fast() Tejun Heo
2025-09-20  0:58 ` [PATCH 02/46] sched_ext: Improve SCX_KF_DISPATCH comment Tejun Heo
2025-09-20  0:58 ` [PATCH 03/46] sched_ext: Fix stray scx_root usage in task_can_run_on_remote_rq() Tejun Heo
2025-09-20  0:58 ` [PATCH 04/46] sched_ext: Use bitfields for boolean warning flags Tejun Heo
2025-09-20  0:58 ` [PATCH 05/46] sched_ext: Add SCX_EFLAG_INITIALIZED to indicate successful ops.init() Tejun Heo
2025-09-20  0:58 ` [PATCH 06/46] sched_ext: Make qmap dump operation non-destructive Tejun Heo
2025-09-20  0:58 ` [PATCH 07/46] tools/sched_ext: scx_qmap: Make debug output quieter by default Tejun Heo
2025-09-20  0:58 ` [PATCH 08/46] sched_ext: Separate out scx_kick_cpu() and add @sch to it Tejun Heo
2025-09-20  0:58 ` [PATCH 09/46] sched_ext: Add the @sch parameter to __bstr_format() Tejun Heo
2025-09-20  0:58 ` [PATCH 10/46] sched_ext: Add the @sch parameter to ext_idle helpers Tejun Heo
2025-09-20  0:58 ` [PATCH 11/46] sched_ext: Drop kf_cpu_valid() Tejun Heo
2025-09-20  0:58 ` [PATCH 12/46] sched_ext: Add the @sch parameter to scx_dsq_insert_preamble/commit() Tejun Heo
2025-09-20  0:58 ` [PATCH 13/46] sched_ext: Drop scx_kf_exit() and scx_kf_error() Tejun Heo
2025-09-20  0:58 ` [PATCH 14/46] sched_ext: Misc updates around scx_sched instance pointer Tejun Heo
2025-09-20  0:58 ` [PATCH 15/46] sched_ext: Keep dying tasks on a separate list Tejun Heo
2025-09-20  0:58 ` [PATCH 16/46] sched_ext: Implement cgroup subtree iteration for scx_task_iter Tejun Heo
2025-09-20  0:58 ` [PATCH 17/46] sched_ext: Add @kargs to scx_fork() Tejun Heo
2025-09-20  0:58 ` [PATCH 18/46] sched/core: Swap the order between sched_post_fork() and cgroup_post_fork() Tejun Heo
2025-09-20  0:58 ` [PATCH 19/46] cgroup: Expose some cgroup helpers Tejun Heo
2025-09-20  0:58 ` [PATCH 20/46] sched_ext: Update p->scx.disallow warning in scx_init_task() Tejun Heo
2025-09-20  0:58 ` [PATCH 21/46] sched_ext: Minor reorganization of enable/disable path Tejun Heo
2025-09-20  0:58 ` [PATCH 22/46] sched_ext: Factor out scx_claim_exit() from scx_disable() Tejun Heo
2025-09-20  0:58 ` [PATCH 23/46] sched_ext: Introduce cgroup sub-sched support Tejun Heo
2025-09-20  0:58 ` [PATCH 24/46] HACK_NOT_FOR_UPSTREAM: BPF: Implement prog grouping hack Tejun Heo
2025-09-20  0:58 ` [PATCH 25/46] sched_ext: Introduce scx_task_sched[_rcu]() Tejun Heo
2025-09-20  0:58 ` [PATCH 26/46] sched_ext: Introduce scx_prog_sched() Tejun Heo
2025-09-20  0:58 ` [PATCH 27/46] sched_ext: Ignore insertions of not-owned tasks into DSQs Tejun Heo
2025-09-20  0:58 ` [PATCH 28/46] sched_ext: scx_dsq_move() should validate the task belongs to the right scheduler Tejun Heo
2025-09-20  0:58 ` [PATCH 29/46] sched_ext: Refactor task init/exit helpers Tejun Heo
2025-09-20  0:58 ` [PATCH 30/46] sched_ext: Make scx_prio_less() handle multiple schedulers Tejun Heo
2025-09-20  0:58 ` [PATCH 31/46] sched_ext: Move bypass_depth into scx_sched Tejun Heo
2025-09-20  0:58 ` [PATCH 32/46] sched_ext: Make bypass mode sub-sched aware Tejun Heo
2025-09-20  0:58 ` [PATCH 33/46] sched_ext: Factor out scx_dispatch_sched() Tejun Heo
2025-09-20  0:58 ` [PATCH 34/46] sched_ext: When calling ops.dispatch() @prev must be on the same scx_sched Tejun Heo
2025-09-20  0:58 ` [PATCH 35/46] sched_ext: Dispatch from all scx_sched instances Tejun Heo
2025-09-20  0:58 ` [PATCH 36/46] sched_ext: Move scx_dsp_ctx and scx_dsp_max_batch into scx_sched Tejun Heo
2025-09-20  0:59 ` [PATCH 37/46] sched_ext: Make watchdog sub-sched aware Tejun Heo
2025-09-20  0:59 ` [PATCH 38/46] sched_ext: Convert scx_dump_state() spinlock to raw spinlock Tejun Heo
2025-09-20  0:59 ` [PATCH 39/46] sched_ext: Support dumping multiple schedulers and add scheduler identification Tejun Heo
2025-09-20  0:59 ` [PATCH 40/46] sched_ext: Implement cgroup sub-sched enabling and disabling Tejun Heo
2025-09-20  0:59 ` [PATCH 41/46] HACK_NOT_FOR_UPSTREAM: sched_ext: Work around @aux__prog prototype mismatch Tejun Heo
2025-09-20  0:59 ` [PATCH 42/46] sched_ext: Wrap global DSQs in per-node structure Tejun Heo
2025-09-20  0:59 ` [PATCH 43/46] sched_ext: Add bypass DSQ for sub-schedulers Tejun Heo
2025-09-20  0:59 ` [PATCH 44/46] sched_ext: Factor out scx_link_sched() and scx_unlink_sched() Tejun Heo
2025-09-20  0:59 ` [PATCH 45/46] sched_ext: Add rhashtable lookup for sub-schedulers Tejun Heo
2025-09-20  0:59 ` [PATCH 46/46] sched_ext: Add basic building blocks for nested sub-scheduler dispatching Tejun Heo

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox