From: kernel test robot <lkp@intel.com>
To: John Stultz <jstultz@google.com>
Cc: oe-kbuild-all@lists.linux.dev, linux-kernel@vger.kernel.org,
Peter Zijlstra <peterz@infradead.org>
Subject: kernel/sched/core.c:6831:52: sparse: sparse: incorrect type in initializer (different address spaces)
Date: Mon, 04 May 2026 00:08:11 +0800 [thread overview]
Message-ID: <202605032331.oo2ir1T1-lkp@intel.com> (raw)
tree: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master
head: 66edb901bf874d9e0787326ba12d3548b2da8700
commit: f4fe6be82e6d27349de66a42d6d1b2b11dc97a14 sched: Fix potentially missing balancing with Proxy Exec
date: 4 weeks ago
config: x86_64-randconfig-123-20260503 (https://download.01.org/0day-ci/archive/20260503/202605032331.oo2ir1T1-lkp@intel.com/config)
compiler: clang version 20.1.8 (https://github.com/llvm/llvm-project 87f0227cb60147a26a1eeb4fb06e3b505e9c7261)
sparse: v0.6.5-rc1
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260503/202605032331.oo2ir1T1-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: f4fe6be82e6d ("sched: Fix potentially missing balancing with Proxy Exec")
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202605032331.oo2ir1T1-lkp@intel.com/
sparse warnings: (new ones prefixed by >>)
kernel/sched/core.c:813:33: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected struct task_struct *task @@ got struct task_struct [noderef] __rcu *curr @@
kernel/sched/core.c:813:33: sparse: expected struct task_struct *task
kernel/sched/core.c:813:33: sparse: got struct task_struct [noderef] __rcu *curr
kernel/sched/core.c:889:49: sparse: sparse: incorrect type in argument 2 (different address spaces) @@ expected struct task_struct *p @@ got struct task_struct [noderef] __rcu *donor @@
kernel/sched/core.c:889:49: sparse: expected struct task_struct *p
kernel/sched/core.c:889:49: sparse: got struct task_struct [noderef] __rcu *donor
kernel/sched/core.c:1109:38: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected struct task_struct *curr @@ got struct task_struct [noderef] __rcu *curr @@
kernel/sched/core.c:1109:38: sparse: expected struct task_struct *curr
kernel/sched/core.c:1109:38: sparse: got struct task_struct [noderef] __rcu *curr
kernel/sched/core.c:2182:39: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected struct task_struct *donor @@ got struct task_struct [noderef] __rcu *donor @@
kernel/sched/core.c:2182:39: sparse: expected struct task_struct *donor
kernel/sched/core.c:2182:39: sparse: got struct task_struct [noderef] __rcu *donor
kernel/sched/core.c:2197:65: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected struct task_struct *tsk @@ got struct task_struct [noderef] __rcu *curr @@
kernel/sched/core.c:2197:65: sparse: expected struct task_struct *tsk
kernel/sched/core.c:2197:65: sparse: got struct task_struct [noderef] __rcu *curr
kernel/sched/core.c:3602:17: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct sched_domain *[assigned] sd @@ got struct sched_domain [noderef] __rcu *parent @@
kernel/sched/core.c:3602:17: sparse: expected struct sched_domain *[assigned] sd
kernel/sched/core.c:3602:17: sparse: got struct sched_domain [noderef] __rcu *parent
kernel/sched/core.c:3807:36: 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/core.c:3807:36: sparse: expected struct task_struct const *p
kernel/sched/core.c:3807:36: sparse: got struct task_struct [noderef] __rcu *curr
kernel/sched/core.c:8116:43: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected struct task_struct *push_task @@ got struct task_struct [noderef] __rcu *curr @@
kernel/sched/core.c:8116:43: sparse: expected struct task_struct *push_task
kernel/sched/core.c:8116:43: sparse: got struct task_struct [noderef] __rcu *curr
kernel/sched/core.c:5559:15: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct task_struct *donor @@ got struct task_struct [noderef] __rcu *donor @@
kernel/sched/core.c:5559:15: sparse: expected struct task_struct *donor
kernel/sched/core.c:5559:15: sparse: got struct task_struct [noderef] __rcu *donor
kernel/sched/core.c:6760:14: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct task_struct *prev @@ got struct task_struct [noderef] __rcu *curr @@
kernel/sched/core.c:6760:14: sparse: expected struct task_struct *prev
kernel/sched/core.c:6760:14: sparse: got struct task_struct [noderef] __rcu *curr
kernel/sched/core.c:6828:37: sparse: sparse: incorrect type in argument 2 (different address spaces) @@ expected struct task_struct *prev @@ got struct task_struct [noderef] __rcu *donor @@
kernel/sched/core.c:6828:37: sparse: expected struct task_struct *prev
kernel/sched/core.c:6828:37: sparse: got struct task_struct [noderef] __rcu *donor
>> kernel/sched/core.c:6831:52: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected struct task_struct *prev_donor @@ got struct task_struct [noderef] __rcu *donor @@
kernel/sched/core.c:6831:52: sparse: expected struct task_struct *prev_donor
kernel/sched/core.c:6831:52: sparse: got struct task_struct [noderef] __rcu *donor
kernel/sched/core.c:6841:31: sparse: sparse: incompatible types in comparison expression (different address spaces):
kernel/sched/core.c:6841:31: sparse: struct task_struct [noderef] __rcu *
kernel/sched/core.c:6841:31: sparse: struct task_struct *
kernel/sched/core.c:7352:17: sparse: sparse: incompatible types in comparison expression (different address spaces):
kernel/sched/core.c:7352:17: sparse: struct task_struct *
kernel/sched/core.c:7352:17: sparse: struct task_struct [noderef] __rcu *
kernel/sched/core.c:10272:25: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected struct task_struct *p @@ got struct task_struct [noderef] __rcu *curr @@
kernel/sched/core.c:10272:25: sparse: expected struct task_struct *p
kernel/sched/core.c:10272:25: sparse: got struct task_struct [noderef] __rcu *curr
kernel/sched/core.c:10590:58: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected struct task_struct *t @@ got struct task_struct [noderef] __rcu *curr @@
kernel/sched/core.c:10590:58: sparse: expected struct task_struct *t
kernel/sched/core.c:10590:58: sparse: got struct task_struct [noderef] __rcu *curr
kernel/sched/core.c:10622:38: sparse: sparse: incompatible types in comparison expression (different address spaces):
kernel/sched/core.c:10622:38: sparse: struct task_struct [noderef] __rcu *
kernel/sched/core.c:10622:38: sparse: struct task_struct *
kernel/sched/core.c: note: in included file:
kernel/sched/pelt.h:102:13: 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/pelt.h:102:13: sparse: expected struct task_struct const *p
kernel/sched/pelt.h:102:13: sparse: got struct task_struct [noderef] __rcu *curr
kernel/sched/core.c:889:11: sparse: sparse: dereference of noderef expression
kernel/sched/core.c: note: in included file:
kernel/sched/sched.h:2378:26: sparse: sparse: incompatible types in comparison expression (different address spaces):
kernel/sched/sched.h:2378:26: sparse: struct task_struct [noderef] __rcu *
kernel/sched/sched.h:2378:26: sparse: struct task_struct *
kernel/sched/sched.h:2367:25: sparse: sparse: incompatible types in comparison expression (different address spaces):
kernel/sched/sched.h:2367:25: sparse: struct task_struct [noderef] __rcu *
kernel/sched/sched.h:2367:25: sparse: struct task_struct *
kernel/sched/core.c:2177:38: sparse: sparse: incompatible types in comparison expression (different address spaces):
kernel/sched/core.c:2177:38: sparse: struct task_struct [noderef] __rcu *
kernel/sched/core.c:2177:38: sparse: struct task_struct const *
kernel/sched/sched.h:2378:26: sparse: sparse: incompatible types in comparison expression (different address spaces):
kernel/sched/sched.h:2378:26: sparse: struct task_struct [noderef] __rcu *
kernel/sched/sched.h:2378:26: sparse: struct task_struct *
kernel/sched/sched.h:2689:9: sparse: sparse: incompatible types in comparison expression (different address spaces):
kernel/sched/sched.h:2689:9: sparse: struct task_struct [noderef] __rcu *
kernel/sched/sched.h:2689:9: sparse: struct task_struct *
kernel/sched/sched.h:2689:9: sparse: sparse: incompatible types in comparison expression (different address spaces):
kernel/sched/sched.h:2689:9: sparse: struct task_struct [noderef] __rcu *
kernel/sched/sched.h:2689:9: sparse: struct task_struct *
kernel/sched/sched.h:2378:26: sparse: sparse: incompatible types in comparison expression (different address spaces):
kernel/sched/sched.h:2378:26: sparse: struct task_struct [noderef] __rcu *
kernel/sched/sched.h:2378:26: sparse: struct task_struct *
kernel/sched/sched.h:2666:9: sparse: sparse: incompatible types in comparison expression (different address spaces):
kernel/sched/sched.h:2666:9: sparse: struct task_struct [noderef] __rcu *
kernel/sched/sched.h:2666:9: sparse: struct task_struct *
vim +6831 kernel/sched/core.c
6700
6701 /*
6702 * __schedule() is the main scheduler function.
6703 *
6704 * The main means of driving the scheduler and thus entering this function are:
6705 *
6706 * 1. Explicit blocking: mutex, semaphore, waitqueue, etc.
6707 *
6708 * 2. TIF_NEED_RESCHED flag is checked on interrupt and userspace return
6709 * paths. For example, see arch/x86/entry_64.S.
6710 *
6711 * To drive preemption between tasks, the scheduler sets the flag in timer
6712 * interrupt handler sched_tick().
6713 *
6714 * 3. Wakeups don't really cause entry into schedule(). They add a
6715 * task to the run-queue and that's it.
6716 *
6717 * Now, if the new task added to the run-queue preempts the current
6718 * task, then the wakeup sets TIF_NEED_RESCHED and schedule() gets
6719 * called on the nearest possible occasion:
6720 *
6721 * - If the kernel is preemptible (CONFIG_PREEMPTION=y):
6722 *
6723 * - in syscall or exception context, at the next outmost
6724 * preempt_enable(). (this might be as soon as the wake_up()'s
6725 * spin_unlock()!)
6726 *
6727 * - in IRQ context, return from interrupt-handler to
6728 * preemptible context
6729 *
6730 * - If the kernel is not preemptible (CONFIG_PREEMPTION is not set)
6731 * then at the next:
6732 *
6733 * - cond_resched() call
6734 * - explicit schedule() call
6735 * - return from syscall or exception to user-space
6736 * - return from interrupt-handler to user-space
6737 *
6738 * WARNING: must be called with preemption disabled!
6739 */
6740 static void __sched notrace __schedule(int sched_mode)
6741 {
6742 struct task_struct *prev, *next;
6743 /*
6744 * On PREEMPT_RT kernel, SM_RTLOCK_WAIT is noted
6745 * as a preemption by schedule_debug() and RCU.
6746 */
6747 bool preempt = sched_mode > SM_NONE;
6748 bool is_switch = false;
6749 unsigned long *switch_count;
6750 unsigned long prev_state;
6751 struct rq_flags rf;
6752 struct rq *rq;
6753 int cpu;
6754
6755 /* Trace preemptions consistently with task switches */
6756 trace_sched_entry_tp(sched_mode == SM_PREEMPT);
6757
6758 cpu = smp_processor_id();
6759 rq = cpu_rq(cpu);
6760 prev = rq->curr;
6761
6762 schedule_debug(prev, preempt);
6763
6764 if (sched_feat(HRTICK) || sched_feat(HRTICK_DL))
6765 hrtick_clear(rq);
6766
6767 klp_sched_try_switch(prev);
6768
6769 local_irq_disable();
6770 rcu_note_context_switch(preempt);
6771 migrate_disable_switch(rq, prev);
6772
6773 /*
6774 * Make sure that signal_pending_state()->signal_pending() below
6775 * can't be reordered with __set_current_state(TASK_INTERRUPTIBLE)
6776 * done by the caller to avoid the race with signal_wake_up():
6777 *
6778 * __set_current_state(@state) signal_wake_up()
6779 * schedule() set_tsk_thread_flag(p, TIF_SIGPENDING)
6780 * wake_up_state(p, state)
6781 * LOCK rq->lock LOCK p->pi_state
6782 * smp_mb__after_spinlock() smp_mb__after_spinlock()
6783 * if (signal_pending_state()) if (p->state & @state)
6784 *
6785 * Also, the membarrier system call requires a full memory barrier
6786 * after coming from user-space, before storing to rq->curr; this
6787 * barrier matches a full barrier in the proximity of the membarrier
6788 * system call exit.
6789 */
6790 rq_lock(rq, &rf);
6791 smp_mb__after_spinlock();
6792
6793 /* Promote REQ to ACT */
6794 rq->clock_update_flags <<= 1;
6795 update_rq_clock(rq);
6796 rq->clock_update_flags = RQCF_UPDATED;
6797
6798 switch_count = &prev->nivcsw;
6799
6800 /* Task state changes only considers SM_PREEMPT as preemption */
6801 preempt = sched_mode == SM_PREEMPT;
6802
6803 /*
6804 * We must load prev->state once (task_struct::state is volatile), such
6805 * that we form a control dependency vs deactivate_task() below.
6806 */
6807 prev_state = READ_ONCE(prev->__state);
6808 if (sched_mode == SM_IDLE) {
6809 /* SCX must consult the BPF scheduler to tell if rq is empty */
6810 if (!rq->nr_running && !scx_enabled()) {
6811 next = prev;
6812 rq->next_class = &idle_sched_class;
6813 goto picked;
6814 }
6815 } else if (!preempt && prev_state) {
6816 /*
6817 * We pass task_is_blocked() as the should_block arg
6818 * in order to keep mutex-blocked tasks on the runqueue
6819 * for slection with proxy-exec (without proxy-exec
6820 * task_is_blocked() will always be false).
6821 */
6822 try_to_block_task(rq, prev, &prev_state,
6823 !task_is_blocked(prev));
6824 switch_count = &prev->nvcsw;
6825 }
6826
6827 pick_again:
6828 next = pick_next_task(rq, rq->donor, &rf);
6829 rq->next_class = next->sched_class;
6830 if (sched_proxy_exec()) {
> 6831 struct task_struct *prev_donor = rq->donor;
6832
6833 rq_set_donor(rq, next);
6834 if (unlikely(next->blocked_on)) {
6835 next = find_proxy_task(rq, next, &rf);
6836 if (!next)
6837 goto pick_again;
6838 if (next == rq->idle)
6839 goto keep_resched;
6840 }
6841 if (rq->donor == prev_donor && prev != next) {
6842 struct task_struct *donor = rq->donor;
6843 /*
6844 * When transitioning like:
6845 *
6846 * prev next
6847 * donor: B B
6848 * curr: A B or C
6849 *
6850 * then put_prev_set_next_task() will not have done
6851 * anything, since B == B. However, A might have
6852 * missed a RT/DL balance opportunity due to being
6853 * on_cpu.
6854 */
6855 donor->sched_class->put_prev_task(rq, donor, donor);
6856 donor->sched_class->set_next_task(rq, donor, true);
6857 }
6858 } else {
6859 rq_set_donor(rq, next);
6860 }
6861
6862 picked:
6863 clear_tsk_need_resched(prev);
6864 clear_preempt_need_resched();
6865 keep_resched:
6866 rq->last_seen_need_resched_ns = 0;
6867
6868 is_switch = prev != next;
6869 if (likely(is_switch)) {
6870 rq->nr_switches++;
6871 /*
6872 * RCU users of rcu_dereference(rq->curr) may not see
6873 * changes to task_struct made by pick_next_task().
6874 */
6875 RCU_INIT_POINTER(rq->curr, next);
6876
6877 /*
6878 * The membarrier system call requires each architecture
6879 * to have a full memory barrier after updating
6880 * rq->curr, before returning to user-space.
6881 *
6882 * Here are the schemes providing that barrier on the
6883 * various architectures:
6884 * - mm ? switch_mm() : mmdrop() for x86, s390, sparc, PowerPC,
6885 * RISC-V. switch_mm() relies on membarrier_arch_switch_mm()
6886 * on PowerPC and on RISC-V.
6887 * - finish_lock_switch() for weakly-ordered
6888 * architectures where spin_unlock is a full barrier,
6889 * - switch_to() for arm64 (weakly-ordered, spin_unlock
6890 * is a RELEASE barrier),
6891 *
6892 * The barrier matches a full barrier in the proximity of
6893 * the membarrier system call entry.
6894 *
6895 * On RISC-V, this barrier pairing is also needed for the
6896 * SYNC_CORE command when switching between processes, cf.
6897 * the inline comments in membarrier_arch_switch_mm().
6898 */
6899 ++*switch_count;
6900
6901 psi_account_irqtime(rq, prev, next);
6902 psi_sched_switch(prev, next, !task_on_rq_queued(prev) ||
6903 prev->se.sched_delayed);
6904
6905 trace_sched_switch(preempt, prev, next, prev_state);
6906
6907 /* Also unlocks the rq: */
6908 rq = context_switch(rq, prev, next, &rf);
6909 } else {
6910 rq_unpin_lock(rq, &rf);
6911 __balance_callbacks(rq, NULL);
6912 raw_spin_rq_unlock_irq(rq);
6913 }
6914 trace_sched_exit_tp(is_switch);
6915 }
6916
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
reply other threads:[~2026-05-03 16:08 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=202605032331.oo2ir1T1-lkp@intel.com \
--to=lkp@intel.com \
--cc=jstultz@google.com \
--cc=linux-kernel@vger.kernel.org \
--cc=oe-kbuild-all@lists.linux.dev \
--cc=peterz@infradead.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