From 9aa987e46128bc063765af2a720561256cd69e32 Mon Sep 17 00:00:00 2001 From: Chen Liang Date: Fri, 8 Jul 2016 10:37:53 +0800 Subject: [PATCH] ARM64: sched: fix bug: 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. Change-Id: I60d02d8c957273872f97939632bdd235accdad4e Signed-off-by: Chen Liang --- kernel/sched/fair.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index 13fe9d8fac61..6d84df9366ed 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c @@ -6808,7 +6808,7 @@ 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); + //pr_info("CPU%d: update max cpu_capacity %lu\n", cpu, capacity); goto skip_unlock; #endif } -- 2.34.1