From patchwork Mon Feb 16 09:32:23 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Xunlei Pang X-Patchwork-Id: 44693 Return-Path: X-Original-To: linaro@patches.linaro.org Delivered-To: linaro@patches.linaro.org Received: from mail-lb0-f200.google.com (mail-lb0-f200.google.com [209.85.217.200]) by ip-10-151-82-157.ec2.internal (Postfix) with ESMTPS id E2AA721544 for ; Mon, 16 Feb 2015 09:35:45 +0000 (UTC) Received: by mail-lb0-f200.google.com with SMTP id u10sf18910423lbd.3 for ; Mon, 16 Feb 2015 01:35:44 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:delivered-to:from:to:cc:subject :date:message-id:in-reply-to:references:sender:precedence:list-id :x-original-sender:x-original-authentication-results:mailing-list :list-post:list-help:list-archive:list-unsubscribe; bh=TngUKMcMK+9MVi69Q/pxckcvVA63xGsYjXf6gjKBq80=; b=HEozVR/mzwWGB1UL86kUfDnVglWAW1O4Xixj8x+WxUU2TJAvnPWOW4wZjXaKkCFaNm Y+8UN00aIUn+4Au2jIsnrmoIgT7VscXBfwqF5g3JqRSIieiEY+oQEj4YpvcHtJmCDA55 08GF2S4KCtlI/CybmO0Yb6pjDw/cR5ILs7rr5ETwFnXXyZCj4VGczZ34BL7eRdun2A1U hR0TgML9WB/G3D8o9byTmEUadwaig3+CRfizc4VXMjIJI55siV+Mj2IhAYCbfsBltoLO BoOxkVpcifu4TX+HigCPxPpixjE3ww41pEYlW4+2tMQ6vQUFPTcZ3k3ykN2nONkbW6ot 01Wg== X-Gm-Message-State: ALoCoQlxPnQZVVX4oQFu7VEE9pJ0mPPR09JDMVSYldFTFnfuOOrN6BGC7ouhEtvmRdGcqdkjz12E X-Received: by 10.112.199.69 with SMTP id ji5mr1377892lbc.0.1424079344735; Mon, 16 Feb 2015 01:35:44 -0800 (PST) MIME-Version: 1.0 X-BeenThere: patchwork-forward@linaro.org Received: by 10.152.30.38 with SMTP id p6ls537548lah.52.gmail; Mon, 16 Feb 2015 01:35:44 -0800 (PST) X-Received: by 10.152.115.206 with SMTP id jq14mr20720682lab.69.1424079344538; Mon, 16 Feb 2015 01:35:44 -0800 (PST) Received: from mail-lb0-x22d.google.com (mail-lb0-x22d.google.com. [2a00:1450:4010:c04::22d]) by mx.google.com with ESMTPS id yl7si7447166lab.116.2015.02.16.01.35.44 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 16 Feb 2015 01:35:44 -0800 (PST) Received-SPF: pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 2a00:1450:4010:c04::22d as permitted sender) client-ip=2a00:1450:4010:c04::22d; Received: by mail-lb0-f173.google.com with SMTP id n10so26069414lbv.4 for ; Mon, 16 Feb 2015 01:35:44 -0800 (PST) X-Received: by 10.112.85.68 with SMTP id f4mr21075296lbz.106.1424079344451; Mon, 16 Feb 2015 01:35:44 -0800 (PST) X-Forwarded-To: patchwork-forward@linaro.org X-Forwarded-For: patch@linaro.org patchwork-forward@linaro.org Delivered-To: patch@linaro.org Received: by 10.112.35.133 with SMTP id h5csp1472235lbj; Mon, 16 Feb 2015 01:35:43 -0800 (PST) X-Received: by 10.68.136.201 with SMTP id qc9mr32048874pbb.144.1424079342505; Mon, 16 Feb 2015 01:35:42 -0800 (PST) Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id de9si3691640pdb.145.2015.02.16.01.35.41; Mon, 16 Feb 2015 01:35:42 -0800 (PST) Received-SPF: none (google.com: linux-kernel-owner@vger.kernel.org does not designate permitted sender hosts) client-ip=209.132.180.67; Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755431AbbBPJff (ORCPT + 28 others); Mon, 16 Feb 2015 04:35:35 -0500 Received: from m15-113.126.com ([220.181.15.113]:36979 "EHLO m15-113.126.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755166AbbBPJfd (ORCPT ); Mon, 16 Feb 2015 04:35:33 -0500 Received: from localhost.localdomain (unknown [210.21.223.3]) by smtp3 (Coremail) with SMTP id DcmowAA3sXVVueFU6xL6AQ--.1340S3; Mon, 16 Feb 2015 17:33:22 +0800 (CST) From: Xunlei Pang To: linux-kernel@vger.kernel.org Cc: Peter Zijlstra , Steven Rostedt , Juri Lelli , Andrew Morton , Dan Streetman , Xunlei Pang Subject: [PATCH v4 2/3] sched/rt: Fix wrong SMP scheduler behavior for equal prio cases Date: Mon, 16 Feb 2015 17:32:23 +0800 Message-Id: <1424079144-5194-2-git-send-email-xlpang@126.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1424079144-5194-1-git-send-email-xlpang@126.com> References: <1424079144-5194-1-git-send-email-xlpang@126.com> X-CM-TRANSID: DcmowAA3sXVVueFU6xL6AQ--.1340S3 X-Coremail-Antispam: 1Uf129KBjvJXoWxGFWrZr4kur48Gw4xXF13Jwb_yoW5uF1Upa ykJw4Uta1kJayqgrn7Xr4kZr43G34vq3y7Jrn5t3yrKanYqFy8ZFn5Zry3tFW3Kr1vqF43 KF4DtrsxGr1UZFUanT9S1TB71UUUUUUqnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDUYxBIdaVFxhVjvjDU0xZFpf9x07jlc_3UUUUU= X-Originating-IP: [210.21.223.3] X-CM-SenderInfo: p0ost0bj6rjloofrz/1tbimgKiv1GfVJ167QAAsV Sender: linux-kernel-owner@vger.kernel.org Precedence: list List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Original-Sender: xlpang@126.com X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 2a00:1450:4010:c04::22d as permitted sender) smtp.mail=patch+caf_=patchwork-forward=linaro.org@linaro.org; dkim=neutral (body hash did not verify) header.i=@; dmarc=fail (p=NONE dis=NONE) header.from=126.com Mailing-list: list patchwork-forward@linaro.org; contact patchwork-forward+owners@linaro.org X-Google-Group-Id: 836684582541 List-Post: , List-Help: , List-Archive: List-Unsubscribe: , From: Xunlei Pang Currently, SMP RT scheduler has some trouble in dealing with equal prio cases. For example, in check_preempt_equal_prio(): When RT1(current task) gets preempted by RT2, if there is a migratable RT3 with same prio, RT3 will be pushed away instead of RT1 afterwards, because RT1 will be enqueued to the tail of the pushable list when going through succeeding put_prev_task_rt() triggered by resched. This broke FIFO. Furthermore, this is also problematic for normal preempted cases if there're some rt tasks queued with the same prio as current, because current will be put behind these tasks in the pushable queue. So, if a task is running and gets preempted by a higher priority task (or even with same priority for migrating), this patch ensures that it is put before any existing task with the same priority in the pushable queue. Signed-off-by: Xunlei Pang --- kernel/sched/rt.c | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/kernel/sched/rt.c b/kernel/sched/rt.c index f4d4b07..65de40e 100644 --- a/kernel/sched/rt.c +++ b/kernel/sched/rt.c @@ -347,11 +347,15 @@ static inline void set_post_schedule(struct rq *rq) rq->post_schedule = has_pushable_tasks(rq); } -static void enqueue_pushable_task(struct rq *rq, struct task_struct *p) +static void enqueue_pushable_task(struct rq *rq, + struct task_struct *p, bool head) { plist_del(&p->pushable_tasks, &rq->rt.pushable_tasks); plist_node_init(&p->pushable_tasks, p->prio); - plist_add(&p->pushable_tasks, &rq->rt.pushable_tasks); + if (head) + plist_add_head(&p->pushable_tasks, &rq->rt.pushable_tasks); + else + plist_add_tail(&p->pushable_tasks, &rq->rt.pushable_tasks); /* Update the highest prio pushable task */ if (p->prio < rq->rt.highest_prio.next) @@ -373,7 +377,8 @@ static void dequeue_pushable_task(struct rq *rq, struct task_struct *p) #else -static inline void enqueue_pushable_task(struct rq *rq, struct task_struct *p) +static inline void enqueue_pushable_task(struct rq *rq, + struct task_struct *p, bool head) { } @@ -1248,7 +1253,7 @@ enqueue_task_rt(struct rq *rq, struct task_struct *p, int flags) enqueue_rt_entity(rt_se, flags & ENQUEUE_HEAD); if (!task_current(rq, p) && p->nr_cpus_allowed > 1) - enqueue_pushable_task(rq, p); + enqueue_pushable_task(rq, p, 0); } static void dequeue_task_rt(struct rq *rq, struct task_struct *p, int flags) @@ -1494,8 +1499,12 @@ static void put_prev_task_rt(struct rq *rq, struct task_struct *p) * The previous task needs to be made eligible for pushing * if it is still active */ - if (on_rt_rq(&p->rt) && p->nr_cpus_allowed > 1) - enqueue_pushable_task(rq, p); + if (on_rt_rq(&p->rt) && p->nr_cpus_allowed > 1) { + if (task_running(rq, p) && (preempt_count() & PREEMPT_ACTIVE)) + enqueue_pushable_task(rq, p, 1); + else + enqueue_pushable_task(rq, p, 0); + } } #ifdef CONFIG_SMP @@ -1914,7 +1923,7 @@ static void set_cpus_allowed_rt(struct task_struct *p, rq->rt.rt_nr_migratory--; } else { if (!task_current(rq, p)) - enqueue_pushable_task(rq, p); + enqueue_pushable_task(rq, p, 0); rq->rt.rt_nr_migratory++; }