From: kernel test robot <lkp@intel.com>
To: Tejun Heo <tj@kernel.org>
Cc: oe-kbuild-all@lists.linux.dev, linux-kernel@vger.kernel.org,
Andrea Righi <arighi@nvidia.com>
Subject: kernel/sched/ext.c:5678:40: sparse: sparse: incorrect type in initializer (different address spaces)
Date: Mon, 04 May 2026 09:13:21 +0800 [thread overview]
Message-ID: <202605040957.sLEMfNb6-lkp@intel.com> (raw)
tree: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master
head: 6d35786de28116ecf78797a62b84e6bf3c45aa5a
commit: ebeca1f930eac8f11f815d58eb38fa5d07e7c16e sched_ext: Introduce cgroup sub-sched support
date: 8 weeks ago
config: arm64-randconfig-r113-20260503 (https://download.01.org/0day-ci/archive/20260504/202605040957.sLEMfNb6-lkp@intel.com/config)
compiler: aarch64-linux-gcc (GCC) 8.5.0
sparse: v0.6.5-rc1
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260504/202605040957.sLEMfNb6-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Fixes: ebeca1f930ea ("sched_ext: Introduce cgroup sub-sched support")
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202605040957.sLEMfNb6-lkp@intel.com/
sparse warnings: (new ones prefixed by >>)
kernel/sched/ext.c:1853:38: sparse: got struct task_struct [noderef] __rcu *donor
kernel/sched/ext.c:2385:33: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected struct scx_sched *sch @@ got struct scx_sched [noderef] __rcu *static [toplevel] scx_root @@
kernel/sched/ext.c:2385:33: sparse: expected struct scx_sched *sch
kernel/sched/ext.c:2385:33: sparse: got struct scx_sched [noderef] __rcu *static [toplevel] scx_root
kernel/sched/ext.c:2534:33: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected struct scx_sched *sch @@ got struct scx_sched [noderef] __rcu *static [toplevel] scx_root @@
kernel/sched/ext.c:2534:33: sparse: expected struct scx_sched *sch
kernel/sched/ext.c:2534:33: sparse: got struct scx_sched [noderef] __rcu *static [toplevel] scx_root
kernel/sched/ext.c:2590:33: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected struct scx_sched *sch @@ got struct scx_sched [noderef] __rcu *static [toplevel] scx_root @@
kernel/sched/ext.c:2590:33: sparse: expected struct scx_sched *sch
kernel/sched/ext.c:2590:33: sparse: got struct scx_sched [noderef] __rcu *static [toplevel] scx_root
kernel/sched/ext.c:2631:33: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected struct scx_sched *sch @@ got struct scx_sched [noderef] __rcu *static [toplevel] scx_root @@
kernel/sched/ext.c:2631:33: sparse: expected struct scx_sched *sch
kernel/sched/ext.c:2631:33: sparse: got struct scx_sched [noderef] __rcu *static [toplevel] scx_root
kernel/sched/ext.c:2685:38: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected struct task_struct *prev @@ got struct task_struct [noderef] __rcu *curr @@
kernel/sched/ext.c:2685:38: sparse: expected struct task_struct *prev
kernel/sched/ext.c:2685:38: sparse: got struct task_struct [noderef] __rcu *curr
kernel/sched/ext.c:2820:33: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected struct scx_sched *sch @@ got struct scx_sched [noderef] __rcu *static [addressable] [toplevel] scx_root @@
kernel/sched/ext.c:2820:33: sparse: expected struct scx_sched *sch
kernel/sched/ext.c:2820:33: sparse: got struct scx_sched [noderef] __rcu *static [addressable] [toplevel] scx_root
kernel/sched/ext.c:2881:33: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected struct scx_sched *sch @@ got struct scx_sched [noderef] __rcu *static [addressable] [toplevel] scx_root @@
kernel/sched/ext.c:2881:33: sparse: expected struct scx_sched *sch
kernel/sched/ext.c:2881:33: sparse: got struct scx_sched [noderef] __rcu *static [addressable] [toplevel] scx_root
kernel/sched/ext.c:2903:33: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected struct scx_sched *sch @@ got struct scx_sched [noderef] __rcu *static [addressable] [toplevel] scx_root @@
kernel/sched/ext.c:2903:33: sparse: expected struct scx_sched *sch
kernel/sched/ext.c:2903:33: sparse: got struct scx_sched [noderef] __rcu *static [addressable] [toplevel] scx_root
kernel/sched/ext.c:3025:33: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected struct scx_sched *sch @@ got struct scx_sched [noderef] __rcu *static [addressable] [toplevel] scx_root @@
kernel/sched/ext.c:3025:33: sparse: expected struct scx_sched *sch
kernel/sched/ext.c:3025:33: sparse: got struct scx_sched [noderef] __rcu *static [addressable] [toplevel] scx_root
kernel/sched/ext.c:3104:33: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected struct scx_sched *sch @@ got struct scx_sched [noderef] __rcu *static [addressable] [toplevel] scx_root @@
kernel/sched/ext.c:3104:33: sparse: expected struct scx_sched *sch
kernel/sched/ext.c:3104:33: sparse: got struct scx_sched [noderef] __rcu *static [addressable] [toplevel] scx_root
kernel/sched/ext.c:3160:33: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected struct scx_sched *sch @@ got struct scx_sched [noderef] __rcu *static [addressable] [toplevel] scx_root @@
kernel/sched/ext.c:3160:33: sparse: expected struct scx_sched *sch
kernel/sched/ext.c:3160:33: sparse: got struct scx_sched [noderef] __rcu *static [addressable] [toplevel] scx_root
kernel/sched/ext.c:3195:33: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected struct scx_sched *sch @@ got struct scx_sched [noderef] __rcu *static [addressable] [toplevel] scx_root @@
kernel/sched/ext.c:3195:33: sparse: expected struct scx_sched *sch
kernel/sched/ext.c:3195:33: sparse: got struct scx_sched [noderef] __rcu *static [addressable] [toplevel] scx_root
kernel/sched/ext.c:3215:33: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected struct scx_sched *sch @@ got struct scx_sched [noderef] __rcu *static [addressable] [toplevel] scx_root @@
kernel/sched/ext.c:3215:33: sparse: expected struct scx_sched *sch
kernel/sched/ext.c:3215:33: sparse: got struct scx_sched [noderef] __rcu *static [addressable] [toplevel] scx_root
kernel/sched/ext.c:3380:33: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected struct scx_sched *sch @@ got struct scx_sched [noderef] __rcu *static [addressable] [toplevel] scx_root @@
kernel/sched/ext.c:3380:33: sparse: expected struct scx_sched *sch
kernel/sched/ext.c:3380:33: sparse: got struct scx_sched [noderef] __rcu *static [addressable] [toplevel] scx_root
kernel/sched/ext.c:3399:33: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected struct scx_sched *sch @@ got struct scx_sched [noderef] __rcu *static [addressable] [toplevel] scx_root @@
kernel/sched/ext.c:3399:33: sparse: expected struct scx_sched *sch
kernel/sched/ext.c:3399:33: sparse: got struct scx_sched [noderef] __rcu *static [addressable] [toplevel] scx_root
kernel/sched/ext.c:3442:35: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected struct task_struct *p @@ got struct task_struct [noderef] __rcu *curr @@
kernel/sched/ext.c:3442:35: sparse: expected struct task_struct *p
kernel/sched/ext.c:3442:35: sparse: got struct task_struct [noderef] __rcu *curr
kernel/sched/ext.c:3474:33: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected struct scx_sched *sch @@ got struct scx_sched [noderef] __rcu *static [addressable] [toplevel] scx_root @@
kernel/sched/ext.c:3474:33: sparse: expected struct scx_sched *sch
kernel/sched/ext.c:3474:33: sparse: got struct scx_sched [noderef] __rcu *static [addressable] [toplevel] scx_root
kernel/sched/ext.c:3503:33: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected struct scx_sched *sch @@ got struct scx_sched [noderef] __rcu *static [addressable] [toplevel] scx_root @@
kernel/sched/ext.c:3503:33: sparse: expected struct scx_sched *sch
kernel/sched/ext.c:3503:33: sparse: got struct scx_sched [noderef] __rcu *static [addressable] [toplevel] scx_root
kernel/sched/ext.c:3516:33: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected struct scx_sched *sch @@ got struct scx_sched [noderef] __rcu *static [addressable] [toplevel] scx_root @@
kernel/sched/ext.c:3516:33: sparse: expected struct scx_sched *sch
kernel/sched/ext.c:3516:33: sparse: got struct scx_sched [noderef] __rcu *static [addressable] [toplevel] scx_root
kernel/sched/ext.c:3565:33: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected struct scx_sched *sch @@ got struct scx_sched [noderef] __rcu *static [addressable] [toplevel] scx_root @@
kernel/sched/ext.c:3565:33: sparse: expected struct scx_sched *sch
kernel/sched/ext.c:3565:33: sparse: got struct scx_sched [noderef] __rcu *static [addressable] [toplevel] scx_root
kernel/sched/ext.c:3584:33: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected struct scx_sched *sch @@ got struct scx_sched [noderef] __rcu *static [addressable] [toplevel] scx_root @@
kernel/sched/ext.c:3584:33: sparse: expected struct scx_sched *sch
kernel/sched/ext.c:3584:33: sparse: got struct scx_sched [noderef] __rcu *static [addressable] [toplevel] scx_root
kernel/sched/ext.c:3602:33: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected struct scx_sched *sch @@ got struct scx_sched [noderef] __rcu *static [addressable] [toplevel] scx_root @@
kernel/sched/ext.c:3602:33: sparse: expected struct scx_sched *sch
kernel/sched/ext.c:3602:33: sparse: got struct scx_sched [noderef] __rcu *static [addressable] [toplevel] scx_root
kernel/sched/ext.c:3618:33: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected struct scx_sched *sch @@ got struct scx_sched [noderef] __rcu *static [addressable] [toplevel] scx_root @@
kernel/sched/ext.c:3618:33: sparse: expected struct scx_sched *sch
kernel/sched/ext.c:3618:33: sparse: got struct scx_sched [noderef] __rcu *static [addressable] [toplevel] scx_root
kernel/sched/ext.c:3635:33: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected struct scx_sched *sch @@ got struct scx_sched [noderef] __rcu *static [addressable] [toplevel] scx_root @@
kernel/sched/ext.c:3635:33: sparse: expected struct scx_sched *sch
kernel/sched/ext.c:3635:33: sparse: got struct scx_sched [noderef] __rcu *static [addressable] [toplevel] scx_root
kernel/sched/ext.c:4554:50: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected struct scx_kick_syncs **ksyncs @@ got struct scx_kick_syncs [noderef] __rcu ** @@
kernel/sched/ext.c:4554:50: sparse: expected struct scx_kick_syncs **ksyncs
kernel/sched/ext.c:4554:50: sparse: got struct scx_kick_syncs [noderef] __rcu **
kernel/sched/ext.c:4557:27: sparse: sparse: incompatible types in comparison expression (different address spaces):
kernel/sched/ext.c:4557:27: sparse: struct scx_kick_syncs [noderef] __rcu *
kernel/sched/ext.c:4557:27: sparse: struct scx_kick_syncs *
kernel/sched/ext.c:4557:27: sparse: sparse: incompatible types in comparison expression (different address spaces):
kernel/sched/ext.c:4557:27: sparse: struct scx_kick_syncs [noderef] __rcu *
kernel/sched/ext.c:4557:27: sparse: struct scx_kick_syncs *
kernel/sched/ext.c:4963:33: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected struct scx_sched *sch @@ got struct scx_sched [noderef] __rcu *static [addressable] [assigned] [toplevel] scx_root @@
kernel/sched/ext.c:4963:33: sparse: expected struct scx_sched *sch
kernel/sched/ext.c:4963:33: sparse: got struct scx_sched [noderef] __rcu *static [addressable] [assigned] [toplevel] scx_root
kernel/sched/ext.c:5006:33: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected struct scx_sched *sch @@ got struct scx_sched [noderef] __rcu *static [addressable] [assigned] [toplevel] scx_root @@
kernel/sched/ext.c:5006:33: sparse: expected struct scx_sched *sch
kernel/sched/ext.c:5006:33: sparse: got struct scx_sched [noderef] __rcu *static [addressable] [assigned] [toplevel] scx_root
kernel/sched/ext.c:5117:52: sparse: sparse: incorrect type in argument 3 (different address spaces) @@ expected struct task_struct *p @@ got struct task_struct [noderef] __rcu *curr @@
kernel/sched/ext.c:5117:52: sparse: expected struct task_struct *p
kernel/sched/ext.c:5117:52: sparse: got struct task_struct [noderef] __rcu *curr
kernel/sched/ext.c:5196:50: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected struct scx_kick_syncs **ksyncs @@ got struct scx_kick_syncs [noderef] __rcu ** @@
kernel/sched/ext.c:5196:50: sparse: expected struct scx_kick_syncs **ksyncs
kernel/sched/ext.c:5196:50: sparse: got struct scx_kick_syncs [noderef] __rcu **
kernel/sched/ext.c:5199:17: sparse: sparse: incompatible types in comparison expression (different address spaces):
kernel/sched/ext.c:5199:17: sparse: struct scx_kick_syncs [noderef] __rcu *
kernel/sched/ext.c:5199:17: sparse: struct scx_kick_syncs *
kernel/sched/ext.c:5208:17: sparse: sparse: incompatible types in comparison expression (different address spaces):
kernel/sched/ext.c:5208:17: sparse: struct scx_kick_syncs [noderef] __rcu *
kernel/sched/ext.c:5208:17: sparse: struct scx_kick_syncs *
>> kernel/sched/ext.c:5678:40: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected struct scx_sched *parent @@ got struct scx_sched [noderef] __rcu *scx_sched @@
kernel/sched/ext.c:5678:40: sparse: expected struct scx_sched *parent
kernel/sched/ext.c:5678:40: sparse: got struct scx_sched [noderef] __rcu *scx_sched
>> kernel/sched/ext.c:5832:38: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected struct scx_sched *sch @@ got struct scx_sched [noderef] __rcu *scx_sched @@
kernel/sched/ext.c:5832:38: sparse: expected struct scx_sched *sch
kernel/sched/ext.c:5832:38: sparse: got struct scx_sched [noderef] __rcu *scx_sched
kernel/sched/ext.c:6213:32: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected struct task_struct const *p @@ got struct task_struct [noderef] __rcu *curr @@
kernel/sched/ext.c:6213:32: sparse: expected struct task_struct const *p
kernel/sched/ext.c:6213:32: sparse: got struct task_struct [noderef] __rcu *curr
kernel/sched/ext.c:6340:33: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected struct scx_sched *sch @@ got struct scx_sched [noderef] __rcu *static [addressable] [assigned] [toplevel] scx_root @@
kernel/sched/ext.c:6340:33: sparse: expected struct scx_sched *sch
kernel/sched/ext.c:6340:33: sparse: got struct scx_sched [noderef] __rcu *static [addressable] [assigned] [toplevel] scx_root
kernel/sched/ext.c:6670:33: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected struct scx_sched *sch @@ got struct scx_sched [noderef] __rcu *static [addressable] [assigned] [toplevel] scx_root @@
kernel/sched/ext.c:6670:33: sparse: expected struct scx_sched *sch
kernel/sched/ext.c:6670:33: sparse: got struct scx_sched [noderef] __rcu *static [addressable] [assigned] [toplevel] scx_root
kernel/sched/ext.c:7585:18: sparse: sparse: symbol 'scx_bpf_reenqueue_local___v2' was not declared. Should it be static?
kernel/sched/ext.c:7759:33: sparse: sparse: incompatible types in comparison expression (different address spaces):
kernel/sched/ext.c:7759:33: sparse: struct task_struct [noderef] __rcu *
kernel/sched/ext.c:7759:33: sparse: struct task_struct const *
kernel/sched/build_policy.c: note: in included file:
kernel/sched/ext_idle.c:735:33: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected struct scx_sched *sch @@ got struct scx_sched [noderef] __rcu *static [addressable] [assigned] [toplevel] scx_root @@
kernel/sched/ext_idle.c:755:49: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected struct task_struct const *p @@ got struct task_struct [noderef] __rcu *curr @@
kernel/sched/build_policy.c: note: in included file:
kernel/sched/syscalls.c:1382:22: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct task_struct *curr @@ got struct task_struct [noderef] __rcu *donor @@
kernel/sched/build_policy.c: note: in included file:
kernel/sched/sched.h:2363:25: sparse: sparse: incompatible types in comparison expression (different address spaces):
kernel/sched/sched.h:2363:25: sparse: struct task_struct [noderef] __rcu *
kernel/sched/sched.h:2363:25: sparse: struct task_struct *
kernel/sched/sched.h:2363:25: sparse: sparse: incompatible types in comparison expression (different address spaces):
kernel/sched/sched.h:2363:25: sparse: struct task_struct [noderef] __rcu *
kernel/sched/sched.h:2363:25: sparse: struct task_struct *
kernel/sched/sched.h:2374:26: sparse: sparse: incompatible types in comparison expression (different address spaces):
kernel/sched/sched.h:2374:26: sparse: struct task_struct [noderef] __rcu *
kernel/sched/sched.h:2374:26: sparse: struct task_struct *
kernel/sched/sched.h:2363:25: sparse: sparse: incompatible types in comparison expression (different address spaces):
kernel/sched/sched.h:2363:25: sparse: struct task_struct [noderef] __rcu *
kernel/sched/sched.h:2363:25: sparse: struct task_struct *
kernel/sched/sched.h:2374:26: sparse: sparse: incompatible types in comparison expression (different address spaces):
kernel/sched/sched.h:2374:26: sparse: struct task_struct [noderef] __rcu *
kernel/sched/sched.h:2374:26: sparse: struct task_struct *
kernel/sched/sched.h:1395:25: sparse: sparse: incompatible types in comparison expression (different address spaces):
kernel/sched/sched.h:1395:25: sparse: struct task_struct [noderef] __rcu *
kernel/sched/sched.h:1395:25: sparse: struct task_struct *
kernel/sched/sched.h:2363:25: sparse: sparse: incompatible types in comparison expression (different address spaces):
kernel/sched/sched.h:2363:25: sparse: struct task_struct [noderef] __rcu *
kernel/sched/sched.h:2363:25: sparse: struct task_struct *
kernel/sched/sched.h:2363:25: sparse: sparse: incompatible types in comparison expression (different address spaces):
kernel/sched/sched.h:2363:25: sparse: struct task_struct [noderef] __rcu *
kernel/sched/sched.h:2363:25: sparse: struct task_struct *
kernel/sched/sched.h:2374:26: sparse: sparse: incompatible types in comparison expression (different address spaces):
vim +5678 kernel/sched/ext.c
5673
5674 #ifdef CONFIG_EXT_SUB_SCHED
5675 /* verify that a scheduler can be attached to @cgrp and return the parent */
5676 static struct scx_sched *find_parent_sched(struct cgroup *cgrp)
5677 {
> 5678 struct scx_sched *parent = cgrp->scx_sched;
5679 struct scx_sched *pos;
5680
5681 lockdep_assert_held(&scx_sched_lock);
5682
5683 /* can't attach twice to the same cgroup */
5684 if (parent->cgrp == cgrp)
5685 return ERR_PTR(-EBUSY);
5686
5687 /* does $parent allow sub-scheds? */
5688 if (!parent->ops.sub_attach)
5689 return ERR_PTR(-EOPNOTSUPP);
5690
5691 /* can't insert between $parent and its exiting children */
5692 list_for_each_entry(pos, &parent->children, sibling)
5693 if (cgroup_is_descendant(pos->cgrp, cgrp))
5694 return ERR_PTR(-EBUSY);
5695
5696 return parent;
5697 }
5698
5699 static void scx_sub_enable_workfn(struct kthread_work *work)
5700 {
5701 struct scx_enable_cmd *cmd = container_of(work, struct scx_enable_cmd, work);
5702 struct sched_ext_ops *ops = cmd->ops;
5703 struct cgroup *cgrp;
5704 struct scx_sched *parent, *sch;
5705 s32 ret;
5706
5707 mutex_lock(&scx_enable_mutex);
5708
5709 if (!scx_enabled()) {
5710 ret = -ENODEV;
5711 goto out_unlock;
5712 }
5713
5714 cgrp = cgroup_get_from_id(ops->sub_cgroup_id);
5715 if (IS_ERR(cgrp)) {
5716 ret = PTR_ERR(cgrp);
5717 goto out_unlock;
5718 }
5719
5720 raw_spin_lock_irq(&scx_sched_lock);
5721 parent = find_parent_sched(cgrp);
5722 if (IS_ERR(parent)) {
5723 raw_spin_unlock_irq(&scx_sched_lock);
5724 ret = PTR_ERR(parent);
5725 goto out_put_cgrp;
5726 }
5727 kobject_get(&parent->kobj);
5728 raw_spin_unlock_irq(&scx_sched_lock);
5729
5730 sch = scx_alloc_and_add_sched(ops, cgrp, parent);
5731 kobject_put(&parent->kobj);
5732 if (IS_ERR(sch)) {
5733 ret = PTR_ERR(sch);
5734 goto out_put_cgrp;
5735 }
5736
5737 raw_spin_lock_irq(&scx_sched_lock);
5738 list_add_tail(&sch->sibling, &parent->children);
5739 list_add_tail_rcu(&sch->all, &scx_sched_all);
5740 raw_spin_unlock_irq(&scx_sched_lock);
5741
5742 if (sch->level >= SCX_SUB_MAX_DEPTH) {
5743 scx_error(sch, "max nesting depth %d violated",
5744 SCX_SUB_MAX_DEPTH);
5745 goto err_disable;
5746 }
5747
5748 if (sch->ops.init) {
5749 ret = SCX_CALL_OP_RET(sch, SCX_KF_UNLOCKED, init, NULL);
5750 if (ret) {
5751 ret = ops_sanitize_err(sch, "init", ret);
5752 scx_error(sch, "ops.init() failed (%d)", ret);
5753 goto err_disable;
5754 }
5755 sch->exit_info->flags |= SCX_EFLAG_INITIALIZED;
5756 }
5757
5758 if (validate_ops(sch, ops))
5759 goto err_disable;
5760
5761 struct scx_sub_attach_args sub_attach_args = {
5762 .ops = &sch->ops,
5763 .cgroup_path = sch->cgrp_path,
5764 };
5765
5766 ret = SCX_CALL_OP_RET(parent, SCX_KF_UNLOCKED, sub_attach, NULL,
5767 &sub_attach_args);
5768 if (ret) {
5769 ret = ops_sanitize_err(sch, "sub_attach", ret);
5770 scx_error(sch, "parent rejected (%d)", ret);
5771 goto err_disable;
5772 }
5773 sch->sub_attached = true;
5774
5775 percpu_down_write(&scx_fork_rwsem);
5776 scx_cgroup_lock();
5777
5778 /*
5779 * Set cgroup->scx_sched's and check CSS_ONLINE. Either we see
5780 * !CSS_ONLINE or scx_cgroup_lifetime_notify() sees and shoots us down.
5781 */
5782 set_cgroup_sched(sch_cgroup(sch), sch);
5783 if (!(cgrp->self.flags & CSS_ONLINE)) {
5784 scx_error(sch, "cgroup is not online");
5785 goto err_unlock_and_disable;
5786 }
5787
5788 /* TODO - perform actual enabling here */
5789
5790 scx_cgroup_unlock();
5791 percpu_up_write(&scx_fork_rwsem);
5792
5793 pr_info("sched_ext: BPF sub-scheduler \"%s\" enabled\n", sch->ops.name);
5794 kobject_uevent(&sch->kobj, KOBJ_ADD);
5795 ret = 0;
5796 goto out_unlock;
5797
5798 out_put_cgrp:
5799 cgroup_put(cgrp);
5800 out_unlock:
5801 mutex_unlock(&scx_enable_mutex);
5802 cmd->ret = ret;
5803 return;
5804
5805 err_unlock_and_disable:
5806 scx_cgroup_unlock();
5807 percpu_up_write(&scx_fork_rwsem);
5808 err_disable:
5809 mutex_unlock(&scx_enable_mutex);
5810 kthread_flush_work(&sch->disable_work);
5811 cmd->ret = 0;
5812 }
5813
5814 static s32 scx_cgroup_lifetime_notify(struct notifier_block *nb,
5815 unsigned long action, void *data)
5816 {
5817 struct cgroup *cgrp = data;
5818 struct cgroup *parent = cgroup_parent(cgrp);
5819
5820 if (!cgroup_on_dfl(cgrp))
5821 return NOTIFY_OK;
5822
5823 switch (action) {
5824 case CGROUP_LIFETIME_ONLINE:
5825 /* inherit ->scx_sched from $parent */
5826 if (parent)
5827 rcu_assign_pointer(cgrp->scx_sched, parent->scx_sched);
5828 break;
5829 case CGROUP_LIFETIME_OFFLINE:
5830 /* if there is a sched attached, shoot it down */
5831 if (cgrp->scx_sched && cgrp->scx_sched->cgrp == cgrp)
> 5832 scx_exit(cgrp->scx_sched, SCX_EXIT_UNREG_KERN,
5833 SCX_ECODE_RSN_CGROUP_OFFLINE,
5834 "cgroup %llu going offline", cgroup_id(cgrp));
5835 break;
5836 }
5837
5838 return NOTIFY_OK;
5839 }
5840
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
reply other threads:[~2026-05-04 1:14 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=202605040957.sLEMfNb6-lkp@intel.com \
--to=lkp@intel.com \
--cc=arighi@nvidia.com \
--cc=linux-kernel@vger.kernel.org \
--cc=oe-kbuild-all@lists.linux.dev \
--cc=tj@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox