From: kernel test robot <lkp@intel.com>
To: Tejun Heo <tj@kernel.org>
Cc: oe-kbuild-all@lists.linux.dev
Subject: [tj-sched-ext:scx-sub-sched-v2 13/40] kernel/sched/ext.c:4617:9: error: implicit declaration of function 'drain_descendants'
Date: Wed, 25 Feb 2026 17:12:03 +0800 [thread overview]
Message-ID: <202602251757.KJSZVYcW-lkp@intel.com> (raw)
tree: https://git.kernel.org/pub/scm/linux/kernel/git/tj/sched_ext.git scx-sub-sched-v2
head: f2122e67cf5ccb9d8844e72cd437a6fd56f0ad80
commit: 7138f0c420368c1b234c9d9b2264e4f84cf8a80b [13/40] sched_ext: Introduce cgroup sub-sched support
config: powerpc-randconfig-001-20260225 (https://download.01.org/0day-ci/archive/20260225/202602251757.KJSZVYcW-lkp@intel.com/config)
compiler: powerpc-linux-gcc (GCC) 12.5.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260225/202602251757.KJSZVYcW-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
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202602251757.KJSZVYcW-lkp@intel.com/
All error/warnings (new ones prefixed by >>):
In file included from kernel/sched/build_policy.c:62:
kernel/sched/ext.c: In function 'scx_root_disable':
>> kernel/sched/ext.c:4617:9: error: implicit declaration of function 'drain_descendants' [-Werror=implicit-function-declaration]
4617 | drain_descendants(sch);
| ^~~~~~~~~~~~~~~~~
>> kernel/sched/ext.c:4678:29: error: 'struct scx_sched' has no member named 'cgrp'
4678 | set_cgroup_sched(sch->cgrp, NULL);
| ^~
kernel/sched/ext.c: In function 'scx_vexit':
kernel/sched/ext.c:5155:9: warning: function 'scx_vexit' might be a candidate for 'gnu_printf' format attribute [-Wsuggest-attribute=format]
5155 | vscnprintf(ei->msg, SCX_EXIT_MSG_LEN, fmt, args);
| ^~~~~~~~~~
kernel/sched/ext.c: In function 'scx_root_enable':
>> kernel/sched/ext.c:5401:45: error: 'cgrp_dfl_root' undeclared (first use in this function)
5401 | sch = scx_alloc_and_add_sched(ops, &cgrp_dfl_root.cgrp, NULL);
| ^~~~~~~~~~~~~
kernel/sched/ext.c:5401:45: note: each undeclared identifier is reported only once for each function it appears in
kernel/sched/ext.c:5531:29: error: 'struct scx_sched' has no member named 'cgrp'
5531 | set_cgroup_sched(sch->cgrp, sch);
| ^~
kernel/sched/ext.c: At top level:
>> kernel/sched/ext.c:4603:13: warning: 'scx_propgate_disable' defined but not used [-Wunused-function]
4603 | static void scx_propgate_disable(struct scx_sched *sch) { }
| ^~~~~~~~~~~~~~~~~~~~
kernel/sched/ext.c:319:13: warning: 'scx_is_descendant' defined but not used [-Wunused-function]
319 | static bool scx_is_descendant(struct scx_sched *sch, struct scx_sched *ancestor)
| ^~~~~~~~~~~~~~~~~
cc1: some warnings being treated as errors
vim +/drain_descendants +4617 kernel/sched/ext.c
4557
4558 static void scx_sub_disable(struct scx_sched *sch)
4559 {
4560 struct scx_sched *parent = scx_parent(sch);
4561
4562 drain_descendants(sch);
4563
4564 mutex_lock(&scx_enable_mutex);
4565 percpu_down_write(&scx_fork_rwsem);
4566 scx_cgroup_lock();
4567
4568 set_cgroup_sched(sch->cgrp, parent);
4569
4570 /* TODO - perform actual disabling here */
4571
4572 scx_cgroup_unlock();
4573 percpu_up_write(&scx_fork_rwsem);
4574
4575 raw_spin_lock_irq(&scx_sched_lock);
4576 list_del_init(&sch->sibling);
4577 list_del_rcu(&sch->all);
4578 raw_spin_unlock_irq(&scx_sched_lock);
4579
4580 mutex_unlock(&scx_enable_mutex);
4581
4582 /*
4583 * @sch is now unlinked from the parent's children list. Notify and call
4584 * ops.sub_detach/exit(). Note that ops.sub_detach/exit() must be called
4585 * after unlinking and releasing all locks. See scx_claim_exit().
4586 */
4587 wake_up_all(&scx_unlink_waitq);
4588
4589 if (sch->ops.sub_detach && sch->sub_attached) {
4590 struct scx_sub_detach_args sub_detach_args = {
4591 .ops = &sch->ops,
4592 .cgroup_path = sch->cgrp_path,
4593 };
4594 SCX_CALL_OP(parent, SCX_KF_UNLOCKED, sub_detach, NULL,
4595 &sub_detach_args);
4596 }
4597
4598 if (sch->ops.exit)
4599 SCX_CALL_OP(sch, SCX_KF_UNLOCKED, exit, NULL, sch->exit_info);
4600 kobject_del(&sch->kobj);
4601 }
4602 #else /* CONFIG_EXT_SUB_SCHED */
> 4603 static void scx_propgate_disable(struct scx_sched *sch) { }
4604 static void scx_sub_disable(struct scx_sched *sch) { }
4605 #endif /* CONFIG_EXT_SUB_SCHED */
4606
4607 static void scx_root_disable(struct scx_sched *sch)
4608 {
4609 struct scx_exit_info *ei = sch->exit_info;
4610 struct scx_task_iter sti;
4611 struct task_struct *p;
4612 int cpu;
4613
4614 /* guarantee forward progress and wait for descendants to be disabled */
4615 scx_bypass(true);
4616 WRITE_ONCE(scx_aborting, false);
> 4617 drain_descendants(sch);
4618
4619 switch (scx_set_enable_state(SCX_DISABLING)) {
4620 case SCX_DISABLING:
4621 WARN_ONCE(true, "sched_ext: duplicate disabling instance?");
4622 break;
4623 case SCX_DISABLED:
4624 pr_warn("sched_ext: ops error detected without ops (%s)\n",
4625 sch->exit_info->msg);
4626 WARN_ON_ONCE(scx_set_enable_state(SCX_DISABLED) != SCX_DISABLING);
4627 goto done;
4628 default:
4629 break;
4630 }
4631
4632 /*
4633 * Here, every runnable task is guaranteed to make forward progress and
4634 * we can safely use blocking synchronization constructs. Actually
4635 * disable ops.
4636 */
4637 mutex_lock(&scx_enable_mutex);
4638
4639 static_branch_disable(&__scx_switched_all);
4640 WRITE_ONCE(scx_switching_all, false);
4641
4642 /*
4643 * Shut down cgroup support before tasks so that the cgroup attach path
4644 * doesn't race against scx_exit_task().
4645 */
4646 scx_cgroup_lock();
4647 scx_cgroup_exit(sch);
4648 scx_cgroup_unlock();
4649
4650 /*
4651 * The BPF scheduler is going away. All tasks including %TASK_DEAD ones
4652 * must be switched out and exited synchronously.
4653 */
4654 percpu_down_write(&scx_fork_rwsem);
4655
4656 scx_init_task_enabled = false;
4657
4658 scx_task_iter_start(&sti, NULL);
4659 while ((p = scx_task_iter_next_locked(&sti))) {
4660 unsigned int queue_flags = DEQUEUE_SAVE | DEQUEUE_MOVE | DEQUEUE_NOCLOCK;
4661 const struct sched_class *old_class = p->sched_class;
4662 const struct sched_class *new_class = scx_setscheduler_class(p);
4663
4664 update_rq_clock(task_rq(p));
4665
4666 if (old_class != new_class)
4667 queue_flags |= DEQUEUE_CLASS;
4668
4669 scoped_guard (sched_change, p, queue_flags) {
4670 p->sched_class = new_class;
4671 }
4672
4673 scx_exit_task(p);
4674 }
4675 scx_task_iter_stop(&sti);
4676
4677 scx_cgroup_lock();
> 4678 set_cgroup_sched(sch->cgrp, NULL);
4679 scx_cgroup_unlock();
4680
4681 percpu_up_write(&scx_fork_rwsem);
4682
4683 /*
4684 * Invalidate all the rq clocks to prevent getting outdated
4685 * rq clocks from a previous scx scheduler.
4686 */
4687 for_each_possible_cpu(cpu) {
4688 struct rq *rq = cpu_rq(cpu);
4689 scx_rq_clock_invalidate(rq);
4690 }
4691
4692 /* no task is on scx, turn off all the switches and flush in-progress calls */
4693 static_branch_disable(&__scx_enabled);
4694 bitmap_zero(sch->has_op, SCX_OPI_END);
4695 scx_idle_disable();
4696 synchronize_rcu();
4697
4698 if (ei->kind >= SCX_EXIT_ERROR) {
4699 pr_err("sched_ext: BPF scheduler \"%s\" disabled (%s)\n",
4700 sch->ops.name, ei->reason);
4701
4702 if (ei->msg[0] != '\0')
4703 pr_err("sched_ext: %s: %s\n", sch->ops.name, ei->msg);
4704 #ifdef CONFIG_STACKTRACE
4705 stack_trace_print(ei->bt, ei->bt_len, 2);
4706 #endif
4707 } else {
4708 pr_info("sched_ext: BPF scheduler \"%s\" disabled (%s)\n",
4709 sch->ops.name, ei->reason);
4710 }
4711
4712 if (sch->ops.exit)
4713 SCX_CALL_OP(sch, SCX_KF_UNLOCKED, exit, NULL, ei);
4714
4715 cancel_delayed_work_sync(&scx_watchdog_work);
4716
4717 raw_spin_lock_irq(&scx_sched_lock);
4718 list_del_rcu(&sch->all);
4719 raw_spin_unlock_irq(&scx_sched_lock);
4720
4721 /*
4722 * scx_root clearing must be inside cpus_read_lock(). See
4723 * handle_hotplug().
4724 */
4725 cpus_read_lock();
4726 RCU_INIT_POINTER(scx_root, NULL);
4727 cpus_read_unlock();
4728
4729 /*
4730 * Delete the kobject from the hierarchy synchronously. Otherwise, sysfs
4731 * could observe an object of the same name still in the hierarchy when
4732 * the next scheduler is loaded.
4733 */
4734 kobject_del(&sch->kobj);
4735
4736 free_percpu(scx_dsp_ctx);
4737 scx_dsp_ctx = NULL;
4738 scx_dsp_max_batch = 0;
4739 free_kick_syncs();
4740
4741 if (scx_bypassed_for_enable) {
4742 scx_bypassed_for_enable = false;
4743 scx_bypass(false);
4744 }
4745
4746 mutex_unlock(&scx_enable_mutex);
4747
4748 WARN_ON_ONCE(scx_set_enable_state(SCX_DISABLED) != SCX_DISABLING);
4749 done:
4750 scx_bypass(false);
4751 }
4752
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
reply other threads:[~2026-02-25 9:12 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=202602251757.KJSZVYcW-lkp@intel.com \
--to=lkp@intel.com \
--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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.