oe-kbuild-all.lists.linux.dev archive mirror
 help / color / mirror / Atom feed
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).