* [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.