All of lore.kernel.org
 help / color / mirror / Atom feed
* [peterz-queue:sched/core-sched 10/11] kernel/sched/core.c:5262 pick_next_task() error: we previously assumed 'next' could be null (see line 5258)
@ 2021-01-08 14:32 kernel test robot
  0 siblings, 0 replies; 3+ messages in thread
From: kernel test robot @ 2021-01-08 14:32 UTC (permalink / raw)
  To: kbuild

[-- Attachment #1: Type: text/plain, Size: 20383 bytes --]

CC: kbuild-all(a)lists.01.org
TO: "Joel Fernandes (Google)" <joel@joelfernandes.org>
CC: Peter Zijlstra <peterz@infradead.org>

tree:   https://git.kernel.org/pub/scm/linux/kernel/git/peterz/queue.git sched/core-sched
head:   ead81f232b5b31ab6240a719ff3bad564c3f0e4c
commit: 6f7eefbb382e8c5fa56180f8cd5becb5f882a3d6 [10/11] sched/fair: Snapshot the min_vruntime of CPUs on force idle
:::::: branch date: 24 hours ago
:::::: commit date: 24 hours ago
config: x86_64-randconfig-m001-20210108 (attached as .config)
compiler: gcc-9 (Debian 9.3.0-15) 9.3.0

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
Reported-by: Dan Carpenter <dan.carpenter@oracle.com>

smatch warnings:
kernel/sched/core.c:5262 pick_next_task() error: we previously assumed 'next' could be null (see line 5258)

vim +/next +5262 kernel/sched/core.c

6f7eefbb382e8c5 Joel Fernandes (Google  2020-11-17  5175) 
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5176  static struct task_struct *
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5177  pick_next_task(struct rq *rq, struct task_struct *prev, struct rq_flags *rf)
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5178  {
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5179  	struct task_struct *next, *max = NULL;
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5180  	const struct sched_class *class;
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5181  	const struct cpumask *smt_mask;
6f7eefbb382e8c5 Joel Fernandes (Google  2020-11-17  5182) 	bool fi_before = false;
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5183  	bool need_sync;
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5184  	int i, j, cpu;
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5185  
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5186  	if (!sched_core_enabled(rq))
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5187  		return __pick_next_task(rq, prev, rf);
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5188  
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5189  	cpu = cpu_of(rq);
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5190  
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5191  	/* Stopper task is switching into idle, no need core-wide selection. */
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5192  	if (cpu_is_offline(cpu)) {
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5193  		/*
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5194  		 * Reset core_pick so that we don't enter the fastpath when
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5195  		 * coming online. core_pick would already be migrated to
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5196  		 * another cpu during offline.
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5197  		 */
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5198  		rq->core_pick = NULL;
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5199  		return __pick_next_task(rq, prev, rf);
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5200  	}
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5201  
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5202  	/*
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5203  	 * If there were no {en,de}queues since we picked (IOW, the task
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5204  	 * pointers are all still valid), and we haven't scheduled the last
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5205  	 * pick yet, do so now.
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5206  	 *
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5207  	 * rq->core_pick can be NULL if no selection was made for a CPU because
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5208  	 * it was either offline or went offline during a sibling's core-wide
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5209  	 * selection. In this case, do a core-wide selection.
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5210  	 */
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5211  	if (rq->core->core_pick_seq == rq->core->core_task_seq &&
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5212  	    rq->core->core_pick_seq != rq->core_sched_seq &&
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5213  	    rq->core_pick) {
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5214  		WRITE_ONCE(rq->core_sched_seq, rq->core->core_pick_seq);
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5215  
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5216  		next = rq->core_pick;
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5217  		if (next != prev) {
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5218  			put_prev_task(rq, prev);
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5219  			set_next_task(rq, next);
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5220  		}
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5221  
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5222  		rq->core_pick = NULL;
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5223  		return next;
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5224  	}
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5225  
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5226  	put_prev_task_balance(rq, prev, rf);
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5227  
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5228  	smt_mask = cpu_smt_mask(cpu);
d7bbf5f9ab91135 Joel Fernandes (Google  2020-11-17  5229) 	need_sync = !!rq->core->core_cookie;
d7bbf5f9ab91135 Joel Fernandes (Google  2020-11-17  5230) 
d7bbf5f9ab91135 Joel Fernandes (Google  2020-11-17  5231) 	/* reset state */
d7bbf5f9ab91135 Joel Fernandes (Google  2020-11-17  5232) 	rq->core->core_cookie = 0UL;
d7bbf5f9ab91135 Joel Fernandes (Google  2020-11-17  5233) 	if (rq->core->core_forceidle) {
d7bbf5f9ab91135 Joel Fernandes (Google  2020-11-17  5234) 		need_sync = true;
d7bbf5f9ab91135 Joel Fernandes (Google  2020-11-17  5235) 		fi_before = true;
d7bbf5f9ab91135 Joel Fernandes (Google  2020-11-17  5236) 		rq->core->core_forceidle = false;
d7bbf5f9ab91135 Joel Fernandes (Google  2020-11-17  5237) 	}
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5238  
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5239  	/*
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5240  	 * core->core_task_seq, core->core_pick_seq, rq->core_sched_seq
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5241  	 *
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5242  	 * @task_seq guards the task state ({en,de}queues)
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5243  	 * @pick_seq is the @task_seq we did a selection on
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5244  	 * @sched_seq is the @pick_seq we scheduled
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5245  	 *
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5246  	 * However, preemptions can cause multiple picks on the same task set.
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5247  	 * 'Fix' this by also increasing @task_seq for every pick.
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5248  	 */
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5249  	rq->core->core_task_seq++;
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5250  
d7bbf5f9ab91135 Joel Fernandes (Google  2020-11-17  5251) 	/*
d7bbf5f9ab91135 Joel Fernandes (Google  2020-11-17  5252) 	 * Optimize for common case where this CPU has no cookies
d7bbf5f9ab91135 Joel Fernandes (Google  2020-11-17  5253) 	 * and there are no cookied tasks running on siblings.
d7bbf5f9ab91135 Joel Fernandes (Google  2020-11-17  5254) 	 */
d7bbf5f9ab91135 Joel Fernandes (Google  2020-11-17  5255) 	if (!need_sync) {
d7bbf5f9ab91135 Joel Fernandes (Google  2020-11-17  5256) 		for_each_class(class) {
d7bbf5f9ab91135 Joel Fernandes (Google  2020-11-17  5257) 			next = class->pick_task(rq);
d7bbf5f9ab91135 Joel Fernandes (Google  2020-11-17 @5258) 			if (next)
d7bbf5f9ab91135 Joel Fernandes (Google  2020-11-17  5259) 				break;
d7bbf5f9ab91135 Joel Fernandes (Google  2020-11-17  5260) 		}
d7bbf5f9ab91135 Joel Fernandes (Google  2020-11-17  5261) 
d7bbf5f9ab91135 Joel Fernandes (Google  2020-11-17 @5262) 		if (!next->core_cookie) {
d7bbf5f9ab91135 Joel Fernandes (Google  2020-11-17  5263) 			rq->core_pick = NULL;
6f7eefbb382e8c5 Joel Fernandes (Google  2020-11-17  5264) 			/*
6f7eefbb382e8c5 Joel Fernandes (Google  2020-11-17  5265) 			 * For robustness, update the min_vruntime_fi for
6f7eefbb382e8c5 Joel Fernandes (Google  2020-11-17  5266) 			 * unconstrained picks as well.
6f7eefbb382e8c5 Joel Fernandes (Google  2020-11-17  5267) 			 */
6f7eefbb382e8c5 Joel Fernandes (Google  2020-11-17  5268) 			WARN_ON_ONCE(fi_before);
6f7eefbb382e8c5 Joel Fernandes (Google  2020-11-17  5269) 			task_vruntime_update(rq, next, false);
d7bbf5f9ab91135 Joel Fernandes (Google  2020-11-17  5270) 			goto done;
d7bbf5f9ab91135 Joel Fernandes (Google  2020-11-17  5271) 		}
651b592b4b80bae Vineeth Pillai          2020-11-17  5272  	}
d7bbf5f9ab91135 Joel Fernandes (Google  2020-11-17  5273) 
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5274  	for_each_cpu(i, smt_mask) {
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5275  		struct rq *rq_i = cpu_rq(i);
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5276  
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5277  		rq_i->core_pick = NULL;
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5278  
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5279  		if (i != cpu)
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5280  			update_rq_clock(rq_i);
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5281  	}
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5282  
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5283  	/*
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5284  	 * Try and select tasks for each sibling in decending sched_class
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5285  	 * order.
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5286  	 */
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5287  	for_each_class(class) {
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5288  again:
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5289  		for_each_cpu_wrap(i, smt_mask, cpu) {
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5290  			struct rq *rq_i = cpu_rq(i);
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5291  			struct task_struct *p;
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5292  
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5293  			if (rq_i->core_pick)
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5294  				continue;
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5295  
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5296  			/*
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5297  			 * If this sibling doesn't yet have a suitable task to
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5298  			 * run; ask for the most elegible task, given the
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5299  			 * highest priority task already selected for this
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5300  			 * core.
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5301  			 */
6f7eefbb382e8c5 Joel Fernandes (Google  2020-11-17  5302) 			p = pick_task(rq_i, class, max, fi_before);
d7bbf5f9ab91135 Joel Fernandes (Google  2020-11-17  5303) 			if (!p)
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5304  				continue;
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5305  
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5306  			rq_i->core_pick = p;
6f7eefbb382e8c5 Joel Fernandes (Google  2020-11-17  5307) 			if (rq_i->idle == p && rq_i->nr_running) {
6f7eefbb382e8c5 Joel Fernandes (Google  2020-11-17  5308) 				rq->core->core_forceidle = true;
6f7eefbb382e8c5 Joel Fernandes (Google  2020-11-17  5309) 				if (!fi_before)
6f7eefbb382e8c5 Joel Fernandes (Google  2020-11-17  5310) 					rq->core->core_forceidle_seq++;
6f7eefbb382e8c5 Joel Fernandes (Google  2020-11-17  5311) 			}
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5312  
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5313  			/*
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5314  			 * If this new candidate is of higher priority than the
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5315  			 * previous; and they're incompatible; we need to wipe
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5316  			 * the slate and start over. pick_task makes sure that
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5317  			 * p's priority is more than max if it doesn't match
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5318  			 * max's cookie.
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5319  			 *
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5320  			 * NOTE: this is a linear max-filter and is thus bounded
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5321  			 * in execution time.
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5322  			 */
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5323  			if (!max || !cookie_match(max, p)) {
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5324  				struct task_struct *old_max = max;
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5325  
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5326  				rq->core->core_cookie = p->core_cookie;
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5327  				max = p;
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5328  
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5329  				if (old_max) {
6f7eefbb382e8c5 Joel Fernandes (Google  2020-11-17  5330) 					rq->core->core_forceidle = false;
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5331  					for_each_cpu(j, smt_mask) {
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5332  						if (j == i)
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5333  							continue;
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5334  
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5335  						cpu_rq(j)->core_pick = NULL;
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5336  					}
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5337  					goto again;
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5338  				}
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5339  			}
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5340  		}
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5341  	}
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5342  
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5343  	rq->core->core_pick_seq = rq->core->core_task_seq;
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5344  	next = rq->core_pick;
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5345  	rq->core_sched_seq = rq->core->core_pick_seq;
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5346  
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5347  	/* Something should have been selected for current CPU */
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5348  	WARN_ON_ONCE(!next);
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5349  
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5350  	/*
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5351  	 * Reschedule siblings
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5352  	 *
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5353  	 * NOTE: L1TF -- at this point we're no longer running the old task and
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5354  	 * sending an IPI (below) ensures the sibling will no longer be running
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5355  	 * their task. This ensures there is no inter-sibling overlap between
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5356  	 * non-matching user state.
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5357  	 */
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5358  	for_each_cpu(i, smt_mask) {
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5359  		struct rq *rq_i = cpu_rq(i);
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5360  
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5361  		/*
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5362  		 * An online sibling might have gone offline before a task
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5363  		 * could be picked for it, or it might be offline but later
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5364  		 * happen to come online, but its too late and nothing was
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5365  		 * picked for it.  That's Ok - it will pick tasks for itself,
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5366  		 * so ignore it.
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5367  		 */
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5368  		if (!rq_i->core_pick)
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5369  			continue;
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5370  
6f7eefbb382e8c5 Joel Fernandes (Google  2020-11-17  5371) 		/*
6f7eefbb382e8c5 Joel Fernandes (Google  2020-11-17  5372) 		 * Update for new !FI->FI transitions, or if continuing to be in !FI:
6f7eefbb382e8c5 Joel Fernandes (Google  2020-11-17  5373) 		 * fi_before     fi      update?
6f7eefbb382e8c5 Joel Fernandes (Google  2020-11-17  5374) 		 *  0            0       1
6f7eefbb382e8c5 Joel Fernandes (Google  2020-11-17  5375) 		 *  0            1       1
6f7eefbb382e8c5 Joel Fernandes (Google  2020-11-17  5376) 		 *  1            0       1
6f7eefbb382e8c5 Joel Fernandes (Google  2020-11-17  5377) 		 *  1            1       0
6f7eefbb382e8c5 Joel Fernandes (Google  2020-11-17  5378) 		 */
6f7eefbb382e8c5 Joel Fernandes (Google  2020-11-17  5379) 		if (!(fi_before && rq->core->core_forceidle))
6f7eefbb382e8c5 Joel Fernandes (Google  2020-11-17  5380) 			task_vruntime_update(rq_i, rq_i->core_pick, rq->core->core_forceidle);
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5381  
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5382  		if (i == cpu) {
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5383  			rq_i->core_pick = NULL;
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5384  			continue;
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5385  		}
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5386  
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5387  		/* Did we break L1TF mitigation requirements? */
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5388  		WARN_ON_ONCE(!cookie_match(next, rq_i->core_pick));
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5389  
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5390  		if (rq_i->curr == rq_i->core_pick) {
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5391  			rq_i->core_pick = NULL;
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5392  			continue;
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5393  		}
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5394  
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5395  		resched_curr(rq_i);
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5396  	}
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5397  
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5398  done:
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5399  	set_next_task(rq, next);
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5400  	return next;
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5401  }
2230396a2aab443 Peter Zijlstra          2020-11-17  5402  

:::::: The code at line 5262 was first introduced by commit
:::::: d7bbf5f9ab91135f8e39144df4189ae963e63cf8 sched: Simplify the core pick loop for optimized case

:::::: TO: Joel Fernandes (Google) <joel@joelfernandes.org>
:::::: CC: Peter Zijlstra <peterz@infradead.org>

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org

[-- Attachment #2: config.gz --]
[-- Type: application/gzip, Size: 30068 bytes --]

^ permalink raw reply	[flat|nested] 3+ messages in thread

* [peterz-queue:sched/core-sched 10/11] kernel/sched/core.c:5262 pick_next_task() error: we previously assumed 'next' could be null (see line 5258)
@ 2021-01-11 10:41 ` Dan Carpenter
  0 siblings, 0 replies; 3+ messages in thread
From: Dan Carpenter @ 2021-01-11 10:41 UTC (permalink / raw)
  To: kbuild

[-- Attachment #1: Type: text/plain, Size: 5105 bytes --]

tree:   https://git.kernel.org/pub/scm/linux/kernel/git/peterz/queue.git sched/core-sched
head:   ead81f232b5b31ab6240a719ff3bad564c3f0e4c
commit: 6f7eefbb382e8c5fa56180f8cd5becb5f882a3d6 [10/11] sched/fair: Snapshot the min_vruntime of CPUs on force idle
config: x86_64-randconfig-m001-20210108 (attached as .config)
compiler: gcc-9 (Debian 9.3.0-15) 9.3.0

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
Reported-by: Dan Carpenter <dan.carpenter@oracle.com>

smatch warnings:
kernel/sched/core.c:5262 pick_next_task() error: we previously assumed 'next' could be null (see line 5258)

vim +/next +5262 kernel/sched/core.c

2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5225  
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5226  	put_prev_task_balance(rq, prev, rf);
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5227  
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5228  	smt_mask = cpu_smt_mask(cpu);
d7bbf5f9ab91135 Joel Fernandes (Google  2020-11-17  5229) 	need_sync = !!rq->core->core_cookie;
d7bbf5f9ab91135 Joel Fernandes (Google  2020-11-17  5230) 
d7bbf5f9ab91135 Joel Fernandes (Google  2020-11-17  5231) 	/* reset state */
d7bbf5f9ab91135 Joel Fernandes (Google  2020-11-17  5232) 	rq->core->core_cookie = 0UL;
d7bbf5f9ab91135 Joel Fernandes (Google  2020-11-17  5233) 	if (rq->core->core_forceidle) {
d7bbf5f9ab91135 Joel Fernandes (Google  2020-11-17  5234) 		need_sync = true;
d7bbf5f9ab91135 Joel Fernandes (Google  2020-11-17  5235) 		fi_before = true;
d7bbf5f9ab91135 Joel Fernandes (Google  2020-11-17  5236) 		rq->core->core_forceidle = false;
d7bbf5f9ab91135 Joel Fernandes (Google  2020-11-17  5237) 	}
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5238  
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5239  	/*
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5240  	 * core->core_task_seq, core->core_pick_seq, rq->core_sched_seq
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5241  	 *
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5242  	 * @task_seq guards the task state ({en,de}queues)
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5243  	 * @pick_seq is the @task_seq we did a selection on
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5244  	 * @sched_seq is the @pick_seq we scheduled
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5245  	 *
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5246  	 * However, preemptions can cause multiple picks on the same task set.
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5247  	 * 'Fix' this by also increasing @task_seq for every pick.
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5248  	 */
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5249  	rq->core->core_task_seq++;
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5250  
d7bbf5f9ab91135 Joel Fernandes (Google  2020-11-17  5251) 	/*
d7bbf5f9ab91135 Joel Fernandes (Google  2020-11-17  5252) 	 * Optimize for common case where this CPU has no cookies
d7bbf5f9ab91135 Joel Fernandes (Google  2020-11-17  5253) 	 * and there are no cookied tasks running on siblings.
d7bbf5f9ab91135 Joel Fernandes (Google  2020-11-17  5254) 	 */
d7bbf5f9ab91135 Joel Fernandes (Google  2020-11-17  5255) 	if (!need_sync) {
d7bbf5f9ab91135 Joel Fernandes (Google  2020-11-17  5256) 		for_each_class(class) {
d7bbf5f9ab91135 Joel Fernandes (Google  2020-11-17  5257) 			next = class->pick_task(rq);
d7bbf5f9ab91135 Joel Fernandes (Google  2020-11-17 @5258) 			if (next)
                                                                                    ^^^^
Will we always find a valid "next"?

d7bbf5f9ab91135 Joel Fernandes (Google  2020-11-17  5259) 				break;
d7bbf5f9ab91135 Joel Fernandes (Google  2020-11-17  5260) 		}
d7bbf5f9ab91135 Joel Fernandes (Google  2020-11-17  5261) 
d7bbf5f9ab91135 Joel Fernandes (Google  2020-11-17 @5262) 		if (!next->core_cookie) {
                                                                             ^^^^^^^^^^^^^^^^^
Unchecked dereference.

d7bbf5f9ab91135 Joel Fernandes (Google  2020-11-17  5263) 			rq->core_pick = NULL;
6f7eefbb382e8c5 Joel Fernandes (Google  2020-11-17  5264) 			/*
6f7eefbb382e8c5 Joel Fernandes (Google  2020-11-17  5265) 			 * For robustness, update the min_vruntime_fi for
6f7eefbb382e8c5 Joel Fernandes (Google  2020-11-17  5266) 			 * unconstrained picks as well.
6f7eefbb382e8c5 Joel Fernandes (Google  2020-11-17  5267) 			 */
6f7eefbb382e8c5 Joel Fernandes (Google  2020-11-17  5268) 			WARN_ON_ONCE(fi_before);
6f7eefbb382e8c5 Joel Fernandes (Google  2020-11-17  5269) 			task_vruntime_update(rq, next, false);
d7bbf5f9ab91135 Joel Fernandes (Google  2020-11-17  5270) 			goto done;
d7bbf5f9ab91135 Joel Fernandes (Google  2020-11-17  5271) 		}
651b592b4b80bae Vineeth Pillai          2020-11-17  5272  	}
d7bbf5f9ab91135 Joel Fernandes (Google  2020-11-17  5273) 

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org

[-- Attachment #2: config.gz --]
[-- Type: application/gzip, Size: 30068 bytes --]

^ permalink raw reply	[flat|nested] 3+ messages in thread

* [peterz-queue:sched/core-sched 10/11] kernel/sched/core.c:5262 pick_next_task() error: we previously assumed 'next' could be null (see line 5258)
@ 2021-01-11 10:41 ` Dan Carpenter
  0 siblings, 0 replies; 3+ messages in thread
From: Dan Carpenter @ 2021-01-11 10:41 UTC (permalink / raw)
  To: kbuild-all

[-- Attachment #1: Type: text/plain, Size: 5105 bytes --]

tree:   https://git.kernel.org/pub/scm/linux/kernel/git/peterz/queue.git sched/core-sched
head:   ead81f232b5b31ab6240a719ff3bad564c3f0e4c
commit: 6f7eefbb382e8c5fa56180f8cd5becb5f882a3d6 [10/11] sched/fair: Snapshot the min_vruntime of CPUs on force idle
config: x86_64-randconfig-m001-20210108 (attached as .config)
compiler: gcc-9 (Debian 9.3.0-15) 9.3.0

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
Reported-by: Dan Carpenter <dan.carpenter@oracle.com>

smatch warnings:
kernel/sched/core.c:5262 pick_next_task() error: we previously assumed 'next' could be null (see line 5258)

vim +/next +5262 kernel/sched/core.c

2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5225  
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5226  	put_prev_task_balance(rq, prev, rf);
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5227  
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5228  	smt_mask = cpu_smt_mask(cpu);
d7bbf5f9ab91135 Joel Fernandes (Google  2020-11-17  5229) 	need_sync = !!rq->core->core_cookie;
d7bbf5f9ab91135 Joel Fernandes (Google  2020-11-17  5230) 
d7bbf5f9ab91135 Joel Fernandes (Google  2020-11-17  5231) 	/* reset state */
d7bbf5f9ab91135 Joel Fernandes (Google  2020-11-17  5232) 	rq->core->core_cookie = 0UL;
d7bbf5f9ab91135 Joel Fernandes (Google  2020-11-17  5233) 	if (rq->core->core_forceidle) {
d7bbf5f9ab91135 Joel Fernandes (Google  2020-11-17  5234) 		need_sync = true;
d7bbf5f9ab91135 Joel Fernandes (Google  2020-11-17  5235) 		fi_before = true;
d7bbf5f9ab91135 Joel Fernandes (Google  2020-11-17  5236) 		rq->core->core_forceidle = false;
d7bbf5f9ab91135 Joel Fernandes (Google  2020-11-17  5237) 	}
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5238  
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5239  	/*
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5240  	 * core->core_task_seq, core->core_pick_seq, rq->core_sched_seq
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5241  	 *
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5242  	 * @task_seq guards the task state ({en,de}queues)
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5243  	 * @pick_seq is the @task_seq we did a selection on
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5244  	 * @sched_seq is the @pick_seq we scheduled
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5245  	 *
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5246  	 * However, preemptions can cause multiple picks on the same task set.
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5247  	 * 'Fix' this by also increasing @task_seq for every pick.
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5248  	 */
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5249  	rq->core->core_task_seq++;
2d8ac06b6ca3a0f Peter Zijlstra          2020-11-17  5250  
d7bbf5f9ab91135 Joel Fernandes (Google  2020-11-17  5251) 	/*
d7bbf5f9ab91135 Joel Fernandes (Google  2020-11-17  5252) 	 * Optimize for common case where this CPU has no cookies
d7bbf5f9ab91135 Joel Fernandes (Google  2020-11-17  5253) 	 * and there are no cookied tasks running on siblings.
d7bbf5f9ab91135 Joel Fernandes (Google  2020-11-17  5254) 	 */
d7bbf5f9ab91135 Joel Fernandes (Google  2020-11-17  5255) 	if (!need_sync) {
d7bbf5f9ab91135 Joel Fernandes (Google  2020-11-17  5256) 		for_each_class(class) {
d7bbf5f9ab91135 Joel Fernandes (Google  2020-11-17  5257) 			next = class->pick_task(rq);
d7bbf5f9ab91135 Joel Fernandes (Google  2020-11-17 @5258) 			if (next)
                                                                                    ^^^^
Will we always find a valid "next"?

d7bbf5f9ab91135 Joel Fernandes (Google  2020-11-17  5259) 				break;
d7bbf5f9ab91135 Joel Fernandes (Google  2020-11-17  5260) 		}
d7bbf5f9ab91135 Joel Fernandes (Google  2020-11-17  5261) 
d7bbf5f9ab91135 Joel Fernandes (Google  2020-11-17 @5262) 		if (!next->core_cookie) {
                                                                             ^^^^^^^^^^^^^^^^^
Unchecked dereference.

d7bbf5f9ab91135 Joel Fernandes (Google  2020-11-17  5263) 			rq->core_pick = NULL;
6f7eefbb382e8c5 Joel Fernandes (Google  2020-11-17  5264) 			/*
6f7eefbb382e8c5 Joel Fernandes (Google  2020-11-17  5265) 			 * For robustness, update the min_vruntime_fi for
6f7eefbb382e8c5 Joel Fernandes (Google  2020-11-17  5266) 			 * unconstrained picks as well.
6f7eefbb382e8c5 Joel Fernandes (Google  2020-11-17  5267) 			 */
6f7eefbb382e8c5 Joel Fernandes (Google  2020-11-17  5268) 			WARN_ON_ONCE(fi_before);
6f7eefbb382e8c5 Joel Fernandes (Google  2020-11-17  5269) 			task_vruntime_update(rq, next, false);
d7bbf5f9ab91135 Joel Fernandes (Google  2020-11-17  5270) 			goto done;
d7bbf5f9ab91135 Joel Fernandes (Google  2020-11-17  5271) 		}
651b592b4b80bae Vineeth Pillai          2020-11-17  5272  	}
d7bbf5f9ab91135 Joel Fernandes (Google  2020-11-17  5273) 

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org

[-- Attachment #2: config.gz --]
[-- Type: application/gzip, Size: 30068 bytes --]

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2021-01-11 10:41 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-01-08 14:32 [peterz-queue:sched/core-sched 10/11] kernel/sched/core.c:5262 pick_next_task() error: we previously assumed 'next' could be null (see line 5258) kernel test robot
2021-01-11 10:41 Dan Carpenter
2021-01-11 10:41 ` Dan Carpenter

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.