From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751889AbcEIPYz (ORCPT ); Mon, 9 May 2016 11:24:55 -0400 Received: from smtprelay0124.hostedemail.com ([216.40.44.124]:46597 "EHLO smtprelay.hostedemail.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751616AbcEIPYx (ORCPT ); Mon, 9 May 2016 11:24:53 -0400 X-Session-Marker: 726F737465647440676F6F646D69732E6F7267 X-Spam-Summary: 2,0,0,,d41d8cd98f00b204,rostedt@goodmis.org,:::::::::,RULES_HIT:41:355:379:541:599:800:960:973:988:989:1260:1277:1311:1313:1314:1345:1359:1437:1515:1516:1518:1534:1542:1593:1594:1711:1730:1747:1777:1792:1801:2393:2553:2559:2562:3138:3139:3140:3141:3142:3165:3353:3622:3865:3866:3867:3868:3870:3871:4321:4605:5007:6261:7875:7903:8660:9163:10004:10400:10848:10967:11026:11232:11473:11658:11914:12043:12295:12296:12438:12517:12519:12555:12740:13148:13230:13255:13439:14096:14097:14181:14659:14721:21080:21324:30012:30029:30045:30054:30055:30056:30070:30090:30091,0,RBL:none,CacheIP:none,Bayesian:0.5,0.5,0.5,Netcheck:none,DomainCache:0,MSF:not bulk,SPF:fn,MSBL:0,DNSBL:none,Custom_rules:0:0:0,LFtime:2,LUA_SUMMARY:none X-HE-Tag: side14_46a4b0e415c22 X-Filterd-Recvd-Size: 3915 Date: Mon, 9 May 2016 11:24:43 -0400 From: Steven Rostedt To: Xunlei Pang Cc: linux-kernel@vger.kernel.org, Peter Zijlstra , Juri Lelli , Ingo Molnar Subject: Re: [PATCH] sched/rt/deadline: Don't push if task's scheduling class was changed Message-ID: <20160509112443.259e4d9c@gandalf.local.home> In-Reply-To: <1462767091-1215-1-git-send-email-xlpang@redhat.com> References: <1462767091-1215-1-git-send-email-xlpang@redhat.com> X-Mailer: Claws Mail 3.13.2 (GTK+ 2.24.30; x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Mon, 9 May 2016 12:11:31 +0800 Xunlei Pang wrote: > We got a warning below: > WARNING: CPU: 1 PID: 2468 at kernel/sched/core.c:1161 set_task_cpu+0x1af/0x1c0 > CPU: 1 PID: 2468 Comm: bugon Not tainted 4.6.0-rc3+ #16 > Hardware name: Intel Corporation Broadwell Client > 0000000000000086 0000000089618374 ffff8800897a7d50 ffffffff8133dc8c > 0000000000000000 0000000000000000 ffff8800897a7d90 ffffffff81089921 > 0000048981037f39 ffff88016c4315c0 ffff88016ecd6e40 0000000000000000 > Call Trace: > [] dump_stack+0x63/0x87 > [] __warn+0xd1/0xf0 > [] warn_slowpath_null+0x1d/0x20 > [] set_task_cpu+0x1af/0x1c0 > [] push_dl_task.part.34+0xea/0x180 > [] push_dl_tasks+0x17/0x30 > [] __balance_callback+0x45/0x5c > [] __sched_setscheduler+0x906/0xb90 > [] SyS_sched_setattr+0x150/0x190 > [] do_syscall_64+0x62/0x110 > [] entry_SYSCALL64_slow_path+0x25/0x25 > > The corresponding warning triggering code: > WARN_ON_ONCE(p->state == TASK_RUNNING && > p->sched_class == &fair_sched_class && > (p->on_rq && !task_on_rq_migrating(p))) > > This is because in find_lock_later_rq(), the task whose scheduling > class was changed to fair class is still pushed away as deadline. > > So, check in find_lock_later_rq() after double_lock_balance(), if the > scheduling class of the deadline task was changed, break and retry. > Apply the same logic to RT. > > Signed-off-by: Xunlei Pang Reviewed-by: Steven Rostedt -- Steve > --- > kernel/sched/deadline.c | 1 + > kernel/sched/rt.c | 1 + > 2 files changed, 2 insertions(+) > > diff --git a/kernel/sched/deadline.c b/kernel/sched/deadline.c > index 169d40d..57eb3e4 100644 > --- a/kernel/sched/deadline.c > +++ b/kernel/sched/deadline.c > @@ -1385,6 +1385,7 @@ static struct rq *find_lock_later_rq(struct task_struct *task, struct rq *rq) > !cpumask_test_cpu(later_rq->cpu, > &task->cpus_allowed) || > task_running(rq, task) || > + !dl_task(task) || > !task_on_rq_queued(task))) { > double_unlock_balance(rq, later_rq); > later_rq = NULL; > diff --git a/kernel/sched/rt.c b/kernel/sched/rt.c > index ecfc83d..c10a6f5 100644 > --- a/kernel/sched/rt.c > +++ b/kernel/sched/rt.c > @@ -1720,6 +1720,7 @@ static struct rq *find_lock_lowest_rq(struct task_struct *task, struct rq *rq) > !cpumask_test_cpu(lowest_rq->cpu, > tsk_cpus_allowed(task)) || > task_running(rq, task) || > + !rt_task(task) || > !task_on_rq_queued(task))) { > > double_unlock_balance(rq, lowest_rq);