Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit df232437 authored by Caesar Wang's avatar Caesar Wang Committed by Todd Kjos
Browse files

sched/fair: remove printk while schedule is in progress



It will cause deadlock and while(1) if call printk while schedule is in
progress. The block state like as below:

cpu0(hold the console sem):
printk->console_unlock->up_sem->spin_lock(&sem->lock)->wake_up_process(cpu1)
->try_to_wake_up(cpu1)->while(p->on_cpu).

cpu1(request console sem):
console_lock->down_sem->schedule->idle_banlance->update_cpu_capacity->
printk->console_trylock->spin_lock(&sem->lock).

p->on_cpu will be 1 forever, because the task is still running on cpu1,
so cpu0 is blocked in while(p->on_cpu), but cpu1 could not get
spin_lock(&sem->lock), it is blocked too, it means the task will running
on cpu1 forever.

Signed-off-by: default avatarCaesar Wang <wxt@rock-chips.com>
parent 32cbbe59
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -7089,7 +7089,8 @@ static void update_cpu_capacity(struct sched_domain *sd, int cpu)
		mcc->cpu = cpu;
#ifdef CONFIG_SCHED_DEBUG
		raw_spin_unlock_irqrestore(&mcc->lock, flags);
		pr_info("CPU%d: update max cpu_capacity %lu\n", cpu, capacity);
		printk_deferred(KERN_INFO "CPU%d: update max cpu_capacity %lu\n",
				cpu, capacity);
		goto skip_unlock;
#endif
	}