Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753234AbbBRRG6 (ORCPT ); Wed, 18 Feb 2015 12:06:58 -0500 Received: from terminus.zytor.com ([198.137.202.10]:38940 "EHLO terminus.zytor.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751734AbbBRRG4 (ORCPT ); Wed, 18 Feb 2015 12:06:56 -0500 Date: Wed, 18 Feb 2015 09:06:22 -0800 From: tip-bot for Kirill Tkhai Message-ID: Cc: hpa@zytor.com, tglx@linutronix.de, fengguang.wu@intel.com, peterz@infradead.org, tkhai@yandex.ru, ktkhai@parallels.com, mingo@kernel.org, linux-kernel@vger.kernel.org, juri.lelli@arm.com Reply-To: fengguang.wu@intel.com, tglx@linutronix.de, hpa@zytor.com, juri.lelli@arm.com, peterz@infradead.org, mingo@kernel.org, linux-kernel@vger.kernel.org, tkhai@yandex.ru, ktkhai@parallels.com In-Reply-To: <1374601424090314@web4j.yandex.ru> References: <1374601424090314@web4j.yandex.ru> To: linux-tip-commits@vger.kernel.org Subject: [tip:sched/core] sched/dl: Prevent enqueue of a sleeping task in dl_task_timer() Git-Commit-ID: a79ec89fd8459f0de850898f432a2a57d60e64de X-Mailer: tip-git-log-daemon Robot-ID: Robot-Unsubscribe: Contact to get blacklisted from these emails MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=UTF-8 Content-Disposition: inline Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2637 Lines: 85 Commit-ID: a79ec89fd8459f0de850898f432a2a57d60e64de Gitweb: http://git.kernel.org/tip/a79ec89fd8459f0de850898f432a2a57d60e64de Author: Kirill Tkhai AuthorDate: Mon, 16 Feb 2015 15:38:34 +0300 Committer: Ingo Molnar CommitDate: Wed, 18 Feb 2015 14:27:31 +0100 sched/dl: Prevent enqueue of a sleeping task in dl_task_timer() A deadline task may be throttled and dequeued at the same time. This happens, when it becomes throttled in schedule(), which is called to go to sleep: current->state = TASK_INTERRUPTIBLE; schedule() deactivate_task() dequeue_task_dl() update_curr_dl() start_dl_timer() __dequeue_task_dl() prev->on_rq = 0; Later the timer fires, but the task is still dequeued: dl_task_timer() enqueue_task_dl() /* queues on dl_rq; on_rq remains 0 */ Someone wakes it up: try_to_wake_up() enqueue_dl_entity() BUG_ON(on_dl_rq()) Patch fixes this problem, it prevents queueing !on_rq tasks on dl_rq. Reported-by: Fengguang Wu Signed-off-by: Kirill Tkhai Signed-off-by: Peter Zijlstra (Intel) [ Wrote comment. ] Cc: Juri Lelli Fixes: 1019a359d3dc ("sched/deadline: Fix stale yield state") Link: http://lkml.kernel.org/r/1374601424090314@web4j.yandex.ru Signed-off-by: Ingo Molnar --- kernel/sched/deadline.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/kernel/sched/deadline.c b/kernel/sched/deadline.c index e88847d..9908c95 100644 --- a/kernel/sched/deadline.c +++ b/kernel/sched/deadline.c @@ -535,6 +535,26 @@ static enum hrtimer_restart dl_task_timer(struct hrtimer *timer) sched_clock_tick(); update_rq_clock(rq); + + /* + * If the throttle happened during sched-out; like: + * + * schedule() + * deactivate_task() + * dequeue_task_dl() + * update_curr_dl() + * start_dl_timer() + * __dequeue_task_dl() + * prev->on_rq = 0; + * + * We can be both throttled and !queued. Replenish the counter + * but do not enqueue -- wait for our wakeup to do that. + */ + if (!task_on_rq_queued(p)) { + replenish_dl_entity(dl_se, dl_se); + goto unlock; + } + enqueue_task_dl(rq, p, ENQUEUE_REPLENISH); if (dl_task(rq->curr)) check_preempt_curr_dl(rq, p, 0); -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/