From: kernel test robot <lkp@intel.com>
To: cros-kernel-buildreports@googlegroups.com
Cc: oe-kbuild-all@lists.linux.dev
Subject: [android-common:android16-6.12 12/12] kernel/sched/core.c:7745:20: sparse: sparse: incorrect type in assignment (different address spaces)
Date: Sun, 19 Jul 2026 01:39:43 +0800 [thread overview]
Message-ID: <202607190108.x6It4FEc-lkp@intel.com> (raw)
tree: https://android.googlesource.com/kernel/common android16-6.12
head: 0fd55a309793adc6b8cddb5c29e80caa545ba4bb
commit: 998de772b46b660a07d46c79ccd2e290a2948357 [12/12] ANDROID: sched: Fix potentially missing balancing with Proxy Exec
config: arm-randconfig-r112-20260716 (https://download.01.org/0day-ci/archive/20260719/202607190108.x6It4FEc-lkp@intel.com/config)
compiler: arm-linux-gnueabi-gcc (GCC) 15.2.0
sparse: v0.6.5-rc1
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260719/202607190108.x6It4FEc-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/202607190108.x6It4FEc-lkp@intel.com/
sparse warnings: (new ones prefixed by >>)
kernel/sched/core.c:1502:47: sparse: got struct rq *
kernel/sched/core.c:2339: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:2339:39: sparse: expected struct task_struct *donor
kernel/sched/core.c:2339:39: sparse: got struct task_struct [noderef] __rcu *donor
kernel/sched/core.c:2350: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:2350:65: sparse: expected struct task_struct *tsk
kernel/sched/core.c:2350:65: sparse: got struct task_struct [noderef] __rcu *curr
kernel/sched/core.c:2408:22: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected void const [noderef] __percpu *__vpp_verify @@ got struct rq * @@
kernel/sched/core.c:2408:22: sparse: expected void const [noderef] __percpu *__vpp_verify
kernel/sched/core.c:2408:22: sparse: got struct rq *
kernel/sched/core.c:3863:14: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected void const [noderef] __percpu *__vpp_verify @@ got struct rq * @@
kernel/sched/core.c:3863:14: sparse: expected void const [noderef] __percpu *__vpp_verify
kernel/sched/core.c:3863:14: sparse: got struct rq *
kernel/sched/core.c:4279:29: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected void const [noderef] __percpu *__vpp_verify @@ got struct rq * @@
kernel/sched/core.c:4279:29: sparse: expected void const [noderef] __percpu *__vpp_verify
kernel/sched/core.c:4279:29: sparse: got struct rq *
kernel/sched/core.c:4571:25: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected void const [noderef] __percpu *__vpp_verify @@ got struct rq * @@
kernel/sched/core.c:4571:25: sparse: expected void const [noderef] __percpu *__vpp_verify
kernel/sched/core.c:4571:25: sparse: got struct rq *
kernel/sched/core.c:4931:34: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected void const [noderef] __percpu *__vpp_verify @@ got struct rq * @@
kernel/sched/core.c:4931:34: sparse: expected void const [noderef] __percpu *__vpp_verify
kernel/sched/core.c:4931:34: sparse: got struct rq *
kernel/sched/core.c:5037:25: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected void const [noderef] __percpu *__vpp_verify @@ got struct rq * @@
kernel/sched/core.c:5037:25: sparse: expected void const [noderef] __percpu *__vpp_verify
kernel/sched/core.c:5037:25: sparse: got struct rq *
kernel/sched/core.c:5043:13: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected void const [noderef] __percpu *__vpp_verify @@ got struct rq * @@
kernel/sched/core.c:5043:13: sparse: expected void const [noderef] __percpu *__vpp_verify
kernel/sched/core.c:5043:13: sparse: got struct rq *
kernel/sched/core.c:5043:13: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected void const [noderef] __percpu *__vpp_verify @@ got struct rq * @@
kernel/sched/core.c:5043:13: sparse: expected void const [noderef] __percpu *__vpp_verify
kernel/sched/core.c:5043:13: sparse: got struct rq *
kernel/sched/core.c:5043:13: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected void const [noderef] __percpu *__vpp_verify @@ got struct rq * @@
kernel/sched/core.c:5043:13: sparse: expected void const [noderef] __percpu *__vpp_verify
kernel/sched/core.c:5043:13: sparse: got struct rq *
kernel/sched/core.c:5043:13: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected void const [noderef] __percpu *__vpp_verify @@ got struct rq * @@
kernel/sched/core.c:5043:13: sparse: expected void const [noderef] __percpu *__vpp_verify
kernel/sched/core.c:5043:13: sparse: got struct rq *
kernel/sched/core.c:5043:13: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected void const [noderef] __percpu *__vpp_verify @@ got struct rq * @@
kernel/sched/core.c:5043:13: sparse: expected void const [noderef] __percpu *__vpp_verify
kernel/sched/core.c:5043:13: sparse: got struct rq *
kernel/sched/core.c:5043:13: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected void const [noderef] __percpu *__vpp_verify @@ got struct rq * @@
kernel/sched/core.c:5043:13: sparse: expected void const [noderef] __percpu *__vpp_verify
kernel/sched/core.c:5043:13: sparse: got struct rq *
kernel/sched/core.c:5043:13: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected void const [noderef] __percpu *__vpp_verify @@ got struct rq * @@
kernel/sched/core.c:5043:13: sparse: expected void const [noderef] __percpu *__vpp_verify
kernel/sched/core.c:5043:13: sparse: got struct rq *
kernel/sched/core.c:5043:13: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected void const [noderef] __percpu *__vpp_verify @@ got struct rq * @@
kernel/sched/core.c:5043:13: sparse: expected void const [noderef] __percpu *__vpp_verify
kernel/sched/core.c:5043:13: sparse: got struct rq *
kernel/sched/core.c:5043:13: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected void const [noderef] __percpu *__vpp_verify @@ got struct rq * @@
kernel/sched/core.c:5043:13: sparse: expected void const [noderef] __percpu *__vpp_verify
kernel/sched/core.c:5043:13: sparse: got struct rq *
kernel/sched/core.c:5043:13: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected void const [noderef] __percpu *__vpp_verify @@ got struct rq * @@
kernel/sched/core.c:5043:13: sparse: expected void const [noderef] __percpu *__vpp_verify
kernel/sched/core.c:5043:13: sparse: got struct rq *
kernel/sched/core.c:5043:13: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected void const [noderef] __percpu *__vpp_verify @@ got struct rq * @@
kernel/sched/core.c:5043:13: sparse: expected void const [noderef] __percpu *__vpp_verify
kernel/sched/core.c:5043:13: sparse: got struct rq *
kernel/sched/core.c:5043:13: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected void const [noderef] __percpu *__vpp_verify @@ got struct rq * @@
kernel/sched/core.c:5043:13: sparse: expected void const [noderef] __percpu *__vpp_verify
kernel/sched/core.c:5043:13: sparse: got struct rq *
kernel/sched/core.c:5043:13: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected void const [noderef] __percpu *__vpp_verify @@ got struct rq * @@
kernel/sched/core.c:5043:13: sparse: expected void const [noderef] __percpu *__vpp_verify
kernel/sched/core.c:5043:13: sparse: got struct rq *
kernel/sched/core.c:5043:13: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected void const [noderef] __percpu *__vpp_verify @@ got struct rq * @@
kernel/sched/core.c:5043:13: sparse: expected void const [noderef] __percpu *__vpp_verify
kernel/sched/core.c:5043:13: sparse: got struct rq *
kernel/sched/core.c:5865:25: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected void const [noderef] __percpu *__vpp_verify @@ got struct rq * @@
kernel/sched/core.c:5865:25: sparse: expected void const [noderef] __percpu *__vpp_verify
kernel/sched/core.c:5865:25: sparse: got struct rq *
kernel/sched/core.c:6050:24: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected void const [noderef] __percpu *__vpp_verify @@ got struct rq * @@
kernel/sched/core.c:6050:24: sparse: expected void const [noderef] __percpu *__vpp_verify
kernel/sched/core.c:6050:24: sparse: got struct rq *
kernel/sched/core.c:6070:16: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected void const [noderef] __percpu *__vpp_verify @@ got struct rq * @@
kernel/sched/core.c:6070:16: sparse: expected void const [noderef] __percpu *__vpp_verify
kernel/sched/core.c:6070:16: sparse: got struct rq *
kernel/sched/core.c:6076:16: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected void const [noderef] __percpu *__vpp_verify @@ got struct rq * @@
kernel/sched/core.c:6076:16: sparse: expected void const [noderef] __percpu *__vpp_verify
kernel/sched/core.c:6076:16: sparse: got struct rq *
kernel/sched/core.c:6085:24: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected void const [noderef] __percpu *__vpp_verify @@ got struct rq * @@
kernel/sched/core.c:6085:24: sparse: expected void const [noderef] __percpu *__vpp_verify
kernel/sched/core.c:6085:24: sparse: got struct rq *
kernel/sched/core.c:6099:29: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected void const [noderef] __percpu *__vpp_verify @@ got struct rq * @@
kernel/sched/core.c:6099:29: sparse: expected void const [noderef] __percpu *__vpp_verify
kernel/sched/core.c:6099:29: sparse: got struct rq *
kernel/sched/core.c:6297:25: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected void const [noderef] __percpu *__vpp_verify @@ got struct rq * @@
kernel/sched/core.c:6297:25: sparse: expected void const [noderef] __percpu *__vpp_verify
kernel/sched/core.c:6297:25: sparse: got struct rq *
kernel/sched/core.c:6310: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:6310:15: sparse: expected struct task_struct *donor
kernel/sched/core.c:6310:15: sparse: got struct task_struct [noderef] __rcu *donor
kernel/sched/core.c:6665:60: 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:6665:60: sparse: expected struct task_struct *prev
kernel/sched/core.c:6665:60: sparse: got struct task_struct [noderef] __rcu *donor
kernel/sched/core.c:7743:14: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected void const [noderef] __percpu *__vpp_verify @@ got struct rq * @@
kernel/sched/core.c:7743:14: sparse: expected void const [noderef] __percpu *__vpp_verify
kernel/sched/core.c:7743:14: sparse: got struct rq *
kernel/sched/core.c:7744: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:7744:14: sparse: expected struct task_struct *prev
kernel/sched/core.c:7744:14: sparse: got struct task_struct [noderef] __rcu *curr
>> kernel/sched/core.c:7745:20: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct task_struct *prev_donor @@ got struct task_struct [noderef] __rcu *donor @@
kernel/sched/core.c:7745:20: sparse: expected struct task_struct *prev_donor
kernel/sched/core.c:7745:20: sparse: got struct task_struct [noderef] __rcu *donor
kernel/sched/core.c:7830: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:7830:37: sparse: expected struct task_struct *prev
kernel/sched/core.c:7830:37: sparse: got struct task_struct [noderef] __rcu *donor
kernel/sched/core.c:7844:31: sparse: sparse: incompatible types in comparison expression (different address spaces):
kernel/sched/core.c:7844:31: sparse: struct task_struct [noderef] __rcu *
kernel/sched/core.c:7844:31: sparse: struct task_struct *
kernel/sched/core.c:8378:17: sparse: sparse: incompatible types in comparison expression (different address spaces):
kernel/sched/core.c:8378:17: sparse: struct task_struct *
kernel/sched/core.c:8378:17: sparse: struct task_struct [noderef] __rcu *
kernel/sched/core.c:8936:25: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected void const [noderef] __percpu *__vpp_verify @@ got struct rq * @@
kernel/sched/core.c:8936:25: sparse: expected void const [noderef] __percpu *__vpp_verify
kernel/sched/core.c:8936:25: sparse: got struct rq *
kernel/sched/core.c:9695:22: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected void const [noderef] __percpu *__vpp_verify @@ got struct rq * @@
kernel/sched/core.c:9695:22: sparse: expected void const [noderef] __percpu *__vpp_verify
kernel/sched/core.c:9695:22: sparse: got struct rq *
kernel/sched/core.c:11285:25: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected void const [noderef] __percpu *__vpp_verify @@ got struct rq * @@
kernel/sched/core.c:11285:25: sparse: expected void const [noderef] __percpu *__vpp_verify
kernel/sched/core.c:11285:25: sparse: got struct rq *
kernel/sched/core.c:11285: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:11285:25: sparse: expected struct task_struct *p
kernel/sched/core.c:11285:25: sparse: got struct task_struct [noderef] __rcu *curr
kernel/sched/core.c:685:6: sparse: sparse: context imbalance in 'raw_spin_rq_lock_nested' - wrong count at exit
kernel/sched/core.c:711:6: sparse: sparse: context imbalance in 'raw_spin_rq_trylock' - wrong count at exit
kernel/sched/core.c:735:6: sparse: sparse: context imbalance in 'raw_spin_rq_unlock' - unexpected unlock
kernel/sched/core.c:775:36: sparse: sparse: context imbalance in '__task_rq_lock' - wrong count at exit
kernel/sched/core.c:817:36: sparse: sparse: context imbalance in 'task_rq_lock' - wrong count at exit
kernel/sched/core.c:937:11: sparse: sparse: dereference of noderef expression
kernel/sched/core.c: note: in included file:
kernel/sched/sched.h:2369:25: sparse: sparse: incompatible types in comparison expression (different address spaces):
kernel/sched/sched.h:2369:25: sparse: struct task_struct [noderef] __rcu *
kernel/sched/sched.h:2369:25: sparse: struct task_struct *
kernel/sched/sched.h:2369:25: sparse: sparse: incompatible types in comparison expression (different address spaces):
kernel/sched/sched.h:2369:25: sparse: struct task_struct [noderef] __rcu *
kernel/sched/sched.h:2369:25: sparse: struct task_struct *
kernel/sched/sched.h:2369:25: sparse: sparse: incompatible types in comparison expression (different address spaces):
kernel/sched/sched.h:2369:25: sparse: struct task_struct [noderef] __rcu *
kernel/sched/sched.h:2369:25: sparse: struct task_struct *
kernel/sched/sched.h:2380:26: sparse: sparse: incompatible types in comparison expression (different address spaces):
kernel/sched/sched.h:2380:26: sparse: struct task_struct [noderef] __rcu *
kernel/sched/sched.h:2380:26: sparse: struct task_struct *
kernel/sched/sched.h:2604:9: sparse: sparse: incompatible types in comparison expression (different address spaces):
kernel/sched/sched.h:2604:9: sparse: struct task_struct [noderef] __rcu *
kernel/sched/sched.h:2604:9: sparse: struct task_struct *
kernel/sched/sched.h:2604:9: sparse: sparse: incompatible types in comparison expression (different address spaces):
kernel/sched/sched.h:2604:9: sparse: struct task_struct [noderef] __rcu *
kernel/sched/sched.h:2604:9: sparse: struct task_struct *
kernel/sched/sched.h:2380:26: sparse: sparse: incompatible types in comparison expression (different address spaces):
kernel/sched/sched.h:2380:26: sparse: struct task_struct [noderef] __rcu *
kernel/sched/sched.h:2380:26: sparse: struct task_struct *
kernel/sched/sched.h:2581:9: sparse: sparse: incompatible types in comparison expression (different address spaces):
kernel/sched/sched.h:2581:9: sparse: struct task_struct [noderef] __rcu *
kernel/sched/sched.h:2581:9: sparse: struct task_struct *
vim +7745 kernel/sched/core.c
7684
7685 /*
7686 * __schedule() is the main scheduler function.
7687 *
7688 * The main means of driving the scheduler and thus entering this function are:
7689 *
7690 * 1. Explicit blocking: mutex, semaphore, waitqueue, etc.
7691 *
7692 * 2. TIF_NEED_RESCHED flag is checked on interrupt and userspace return
7693 * paths. For example, see arch/x86/entry_64.S.
7694 *
7695 * To drive preemption between tasks, the scheduler sets the flag in timer
7696 * interrupt handler sched_tick().
7697 *
7698 * 3. Wakeups don't really cause entry into schedule(). They add a
7699 * task to the run-queue and that's it.
7700 *
7701 * Now, if the new task added to the run-queue preempts the current
7702 * task, then the wakeup sets TIF_NEED_RESCHED and schedule() gets
7703 * called on the nearest possible occasion:
7704 *
7705 * - If the kernel is preemptible (CONFIG_PREEMPTION=y):
7706 *
7707 * - in syscall or exception context, at the next outmost
7708 * preempt_enable(). (this might be as soon as the wake_up()'s
7709 * spin_unlock()!)
7710 *
7711 * - in IRQ context, return from interrupt-handler to
7712 * preemptible context
7713 *
7714 * - If the kernel is not preemptible (CONFIG_PREEMPTION is not set)
7715 * then at the next:
7716 *
7717 * - cond_resched() call
7718 * - explicit schedule() call
7719 * - return from syscall or exception to user-space
7720 * - return from interrupt-handler to user-space
7721 *
7722 * WARNING: must be called with preemption disabled!
7723 */
7724 static void __sched notrace __schedule(int sched_mode)
7725 {
7726 struct task_struct *prev, *next;
7727 struct task_struct *prev_donor;
7728 /*
7729 * On PREEMPT_RT kernel, SM_RTLOCK_WAIT is noted
7730 * as a preemption by schedule_debug() and RCU.
7731 */
7732 bool preempt = sched_mode > SM_NONE;
7733 bool block = false;
7734 unsigned long *switch_count;
7735 unsigned long prev_state;
7736 struct rq_flags rf;
7737 struct rq *rq;
7738 bool prev_not_proxied;
7739 int cpu;
7740 bool skip_schedule = false;
7741
7742 cpu = smp_processor_id();
7743 rq = cpu_rq(cpu);
7744 prev = rq->curr;
> 7745 prev_donor = rq->donor;
7746
7747 schedule_debug(prev, preempt);
7748
7749 trace_android_vh_lock_delay_schedule(prev, sched_mode, &skip_schedule);
7750
7751 if (skip_schedule)
7752 return;
7753
7754 if (sched_feat(HRTICK) || sched_feat(HRTICK_DL))
7755 hrtick_clear(rq);
7756
7757 local_irq_disable();
7758 rcu_note_context_switch(preempt);
7759
7760 /*
7761 * Make sure that signal_pending_state()->signal_pending() below
7762 * can't be reordered with __set_current_state(TASK_INTERRUPTIBLE)
7763 * done by the caller to avoid the race with signal_wake_up():
7764 *
7765 * __set_current_state(@state) signal_wake_up()
7766 * schedule() set_tsk_thread_flag(p, TIF_SIGPENDING)
7767 * wake_up_state(p, state)
7768 * LOCK rq->lock LOCK p->pi_state
7769 * smp_mb__after_spinlock() smp_mb__after_spinlock()
7770 * if (signal_pending_state()) if (p->state & @state)
7771 *
7772 * Also, the membarrier system call requires a full memory barrier
7773 * after coming from user-space, before storing to rq->curr; this
7774 * barrier matches a full barrier in the proximity of the membarrier
7775 * system call exit.
7776 */
7777 rq_lock(rq, &rf);
7778 smp_mb__after_spinlock();
7779
7780 /* Promote REQ to ACT */
7781 rq->clock_update_flags <<= 1;
7782 update_rq_clock(rq);
7783 rq->clock_update_flags = RQCF_UPDATED;
7784
7785 switch_count = &prev->nivcsw;
7786
7787 /* Task state changes only considers SM_PREEMPT as preemption */
7788 preempt = sched_mode == SM_PREEMPT;
7789
7790 /*
7791 * We must load prev->state once (task_struct::state is volatile), such
7792 * that we form a control dependency vs deactivate_task() below.
7793 */
7794 prev_state = READ_ONCE(prev->__state);
7795 if (sched_mode == SM_IDLE) {
7796 /* SCX must consult the BPF scheduler to tell if rq is empty */
7797 if (!rq->nr_running && !scx_enabled()) {
7798 next = prev;
7799 goto picked;
7800 }
7801 } else if (!preempt && prev_state) {
7802 /*
7803 * We pass task_is_blocked() as the should_block arg
7804 * in order to keep mutex-blocked tasks on the runqueue
7805 * for slection with proxy-exec (without proxy-exec
7806 * task_is_blocked() will always be false).
7807 */
7808 block = try_to_block_task(rq, prev, &prev_state,
7809 !task_is_blocked(prev));
7810 switch_count = &prev->nvcsw;
7811 } else if (preempt && prev->blocked_on) {
7812 /*
7813 * If we are SM_PREEMPT, we may have interrupted
7814 * after blocked_on was set, before schedule()
7815 * was run, preventing workques from running. So
7816 * clear blocked_on and mark task RUNNING so it
7817 * can be reselected to run and complete its
7818 * logic
7819 */
7820 if (prev_state & TASK_NORMAL) {
7821 WRITE_ONCE(prev->__state, TASK_RUNNING);
7822 clear_task_blocked_on(prev, NULL);
7823 }
7824 }
7825
7826 prev_not_proxied = !prev->blocked_donor;
7827
7828 trace_sched_start_task_selection(prev, cpu, task_is_blocked(prev));
7829 pick_again:
7830 next = pick_next_task(rq, rq->donor, &rf);
7831 rq_set_donor(rq, next);
7832 next->blocked_donor = NULL;
7833 if (unlikely(task_is_blocked(next))) {
7834 next = find_proxy_task(rq, next, &rf);
7835 if (!next) {
7836 /* zap the balance_callbacks before picking again */
7837 zap_balance_callbacks(rq);
7838 goto pick_again;
7839 }
7840 if (next == rq->idle) {
7841 zap_balance_callbacks(rq);
7842 goto keep_resched;
7843 }
7844 if (rq->donor == prev_donor && prev != next) {
7845 struct task_struct *donor = rq->donor;
7846 /*
7847 * When transitioning like:
7848 *
7849 * prev next
7850 * donor: B B
7851 * curr: A B or C
7852 *
7853 * then put_prev_set_next_task() will not have done
7854 * anything, since B == B. However, A might have
7855 * missed a RT/DL balance opportunity due to being
7856 * on_cpu.
7857 */
7858 donor->sched_class->put_prev_task(rq, donor, donor);
7859 donor->sched_class->set_next_task(rq, donor, true);
7860 }
7861 }
7862 trace_sched_finish_task_selection(rq->donor, next, cpu);
7863 picked:
7864 clear_tsk_need_resched(prev);
7865 clear_preempt_need_resched();
7866 trace_android_vh_clear_curr_lazy(prev);
7867 keep_resched:
7868 #ifdef CONFIG_SCHED_DEBUG
7869 rq->last_seen_need_resched_ns = 0;
7870 #endif
7871
7872 trace_android_rvh_schedule(prev, next, rq);
7873 if (likely(prev != next)) {
7874 rq->nr_switches++;
7875 /*
7876 * RCU users of rcu_dereference(rq->curr) may not see
7877 * changes to task_struct made by pick_next_task().
7878 */
7879 RCU_INIT_POINTER(rq->curr, next);
7880
7881 /*
7882 * The membarrier system call requires each architecture
7883 * to have a full memory barrier after updating
7884 * rq->curr, before returning to user-space.
7885 *
7886 * Here are the schemes providing that barrier on the
7887 * various architectures:
7888 * - mm ? switch_mm() : mmdrop() for x86, s390, sparc, PowerPC,
7889 * RISC-V. switch_mm() relies on membarrier_arch_switch_mm()
7890 * on PowerPC and on RISC-V.
7891 * - finish_lock_switch() for weakly-ordered
7892 * architectures where spin_unlock is a full barrier,
7893 * - switch_to() for arm64 (weakly-ordered, spin_unlock
7894 * is a RELEASE barrier),
7895 *
7896 * The barrier matches a full barrier in the proximity of
7897 * the membarrier system call entry.
7898 *
7899 * On RISC-V, this barrier pairing is also needed for the
7900 * SYNC_CORE command when switching between processes, cf.
7901 * the inline comments in membarrier_arch_switch_mm().
7902 */
7903 ++*switch_count;
7904
7905 migrate_disable_switch(rq, prev);
7906 psi_account_irqtime(rq, prev, next);
7907 psi_sched_switch(prev, next, !task_on_rq_queued(prev) ||
7908 prev->se.sched_delayed);
7909
7910 trace_sched_switch(preempt, prev, next, prev_state);
7911
7912 if (block && (prev_state & TASK_UNINTERRUPTIBLE)
7913 && trace_sched_blocked_reason_enabled()) {
7914 unsigned long blocked_func = 0;
7915
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
reply other threads:[~2026-07-18 17:40 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=202607190108.x6It4FEc-lkp@intel.com \
--to=lkp@intel.com \
--cc=cros-kernel-buildreports@googlegroups.com \
--cc=oe-kbuild-all@lists.linux.dev \
/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;
as well as URLs for NNTP newsgroup(s).