Received: by 2002:a05:6a10:16a7:0:0:0:0 with SMTP id gp39csp4238325pxb; Tue, 17 Nov 2020 15:27:18 -0800 (PST) X-Google-Smtp-Source: ABdhPJxfTmTlmeAA/FV/LyaAfAImzc7tZ5Khq+JDylH9hvihTFX5SxUrCbUkmQyb+vacr4820q9U X-Received: by 2002:a17:906:af47:: with SMTP id ly7mr22682571ejb.532.1605655638562; Tue, 17 Nov 2020 15:27:18 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1605655638; cv=none; d=google.com; s=arc-20160816; b=q0XXOBfRuUIab8Nk4A/YMdkc879u6pbzEhwnjtmUtLmpaum2+nRY0h9zPwwbKayVDU qgCDYAZMe6qoWxy8sHBU0ddiPADNejgaOcyHaq4VXpRMQDbHZXYDKyCLoulhKw6SMWCY 8KxTd5b1ZxFAjE8awzjR/wngt/uEGsf8SoCen7kG+YY2Ufm9v6gYlTu6I2TCZgUDz1WJ DEaFoIw3V+EHOMjWkjKGhj+jKqfbp9qgekA/qD4T8t3EIvzyXAhmzni1oOB41GXqLnKD X9rtHbHKgDpItzDN3iUQWnGoHMTP6AgsOnyL9zJAXr2XU3pNsop2ZKTNhCXt6US/Z+Ud cOyA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=uwgACvUC+jgEBROgGyLWrwdXgyZr1axLbHJ4ZXmNfrc=; b=UMW8r5GCRSkZjAo8Cphk6HfFsy6xN9sm0j9klecjYHLc/13UIz6FhUvreTAtNLS3mn KPsyCyBmtsx5rQtvzu/VrEzisAQp5HbYLpjDK0b5PXxt3XArO6A10qkSmMJ8oi081cvm tdC2CR31RNyzI8G/TM0b1DMvVm8OuHx3ERB+q70J2HxFtKJuQqxW6KYwRxHJ8JqWZ5DZ ymLfR+nKkwULmXUoYIepMH8p3ZoC/QTONlHZbFXBhghHyRB6N4VgxV7PXNRyFbZ91CZF 4YM33bEnI229MAl7l6kreD4Por2mv+1KkY6vwsXq8nMDwG7Mi5WB6xiw4bj0q2sBBo0a 6ySQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@joelfernandes.org header.s=google header.b=LFUA6H8Q; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id v11si1667790edl.602.2020.11.17.15.26.56; Tue, 17 Nov 2020 15:27:18 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@joelfernandes.org header.s=google header.b=LFUA6H8Q; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729064AbgKQXUq (ORCPT + 99 others); Tue, 17 Nov 2020 18:20:46 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:39928 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728857AbgKQXUi (ORCPT ); Tue, 17 Nov 2020 18:20:38 -0500 Received: from mail-qk1-x734.google.com (mail-qk1-x734.google.com [IPv6:2607:f8b0:4864:20::734]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D49C1C0613CF for ; Tue, 17 Nov 2020 15:20:37 -0800 (PST) Received: by mail-qk1-x734.google.com with SMTP id a13so28677qkl.4 for ; Tue, 17 Nov 2020 15:20:37 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=joelfernandes.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=uwgACvUC+jgEBROgGyLWrwdXgyZr1axLbHJ4ZXmNfrc=; b=LFUA6H8QqFGJvQcrbbvdVbwaQHXcRg7kWFYgU1iTJzjtLg0L48Hf0Ddh40olAaoaMq 7QzzB/zvWBKjBcy4wEobySGjaXTlDsIeJOJzSjgVyUujiGNHVbCW7+1P5krm3I/1c6ST rfBJ+1HDLaVLyflPYRosDFaDqz6QE1sC1gnhw= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=uwgACvUC+jgEBROgGyLWrwdXgyZr1axLbHJ4ZXmNfrc=; b=pN/J7OvnvTiMzl64Arj/k1FD0GpqCLMSafRo4lzMQ/c0Dm8tA+/EJg+9z9xJYuRf+O 09ajlHWo8kUD4qoROu7nPc0A5T4eVgG5CjNqIDqq04twXyE3UABfp7GRCNJ3ZJXbyhZd que4pMP3AgToIuQWG7r8nh5hhV6RSzZAkwJd8hA0MAwDTHk9uVD5Z9wIttJH0trV27A+ XPOWCR489cTd0gduqQNdh9zW3lOO06zQfLqP4Cr2NlrzyytBoQ+CpGA7BP708Rj3J9Kj rFlvfAEpXJSZjsfgsh68alpURvzj3vsjEqH+SkjD/SL4xlIqtxFER4XDDPDLVrSTNBQJ 6xqA== X-Gm-Message-State: AOAM531c2Sv1nvn47A9vAsccy3cP+GgtdLCn52HeJrxIIIvfz/m7vGq1 cOyrISj34azY5CiTD4xiG5lIVw== X-Received: by 2002:a37:9ed3:: with SMTP id h202mr2140866qke.126.1605655237107; Tue, 17 Nov 2020 15:20:37 -0800 (PST) Received: from joelaf.cam.corp.google.com ([2620:15c:6:411:cad3:ffff:feb3:bd59]) by smtp.gmail.com with ESMTPSA id d12sm14555544qtp.77.2020.11.17.15.20.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 17 Nov 2020 15:20:36 -0800 (PST) From: "Joel Fernandes (Google)" To: Nishanth Aravamudan , Julien Desfossez , Peter Zijlstra , Tim Chen , Vineeth Pillai , Aaron Lu , Aubrey Li , tglx@linutronix.de, linux-kernel@vger.kernel.org Cc: mingo@kernel.org, torvalds@linux-foundation.org, fweisbec@gmail.com, keescook@chromium.org, kerrnel@google.com, Phil Auld , Valentin Schneider , Mel Gorman , Pawan Gupta , Paolo Bonzini , joel@joelfernandes.org, vineeth@bitbyteword.org, Chen Yu , Christian Brauner , Agata Gruza , Antonio Gomez Iglesias , graf@amazon.com, konrad.wilk@oracle.com, dfaggioli@suse.com, pjt@google.com, rostedt@goodmis.org, derkling@google.com, benbjiang@tencent.com, Alexandre Chartre , James.Bottomley@hansenpartnership.com, OWeisse@umich.edu, Dhaval Giani , Junaid Shahid , jsbarnes@google.com, chris.hyser@oracle.com, Ben Segall , Josh Don , Hao Luo , Tom Lendacky , Aubrey Li , "Paul E. McKenney" , Tim Chen Subject: [PATCH -tip 12/32] sched: Simplify the core pick loop for optimized case Date: Tue, 17 Nov 2020 18:19:42 -0500 Message-Id: <20201117232003.3580179-13-joel@joelfernandes.org> X-Mailer: git-send-email 2.29.2.299.gdc1121823c-goog In-Reply-To: <20201117232003.3580179-1-joel@joelfernandes.org> References: <20201117232003.3580179-1-joel@joelfernandes.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The core pick loop grew a lot of warts over time to support optimizations. Turns out that that directly doing a class pick before entering the core-wide pick is better for readability. Make the changes. Since this is a relatively new patch, make it a separate patch so that it is easier to revert in case anyone reports an issue with it. Testing shows it to be working for me. Reviewed-by: Vineeth Pillai Suggested-by: Peter Zijlstra (Intel) Signed-off-by: Joel Fernandes (Google) --- kernel/sched/core.c | 73 ++++++++++++++++----------------------------- 1 file changed, 26 insertions(+), 47 deletions(-) diff --git a/kernel/sched/core.c b/kernel/sched/core.c index 6aa76de55ef2..12e8e6627ab3 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -5180,6 +5180,15 @@ pick_next_task(struct rq *rq, struct task_struct *prev, struct rq_flags *rf) put_prev_task_balance(rq, prev, rf); smt_mask = cpu_smt_mask(cpu); + need_sync = !!rq->core->core_cookie; + + /* reset state */ + rq->core->core_cookie = 0UL; + if (rq->core->core_forceidle) { + need_sync = true; + fi_before = true; + rq->core->core_forceidle = false; + } /* * core->core_task_seq, core->core_pick_seq, rq->core_sched_seq @@ -5192,16 +5201,25 @@ pick_next_task(struct rq *rq, struct task_struct *prev, struct rq_flags *rf) * 'Fix' this by also increasing @task_seq for every pick. */ rq->core->core_task_seq++; - need_sync = !!rq->core->core_cookie; - /* reset state */ -reset: - rq->core->core_cookie = 0UL; - if (rq->core->core_forceidle) { + /* + * Optimize for common case where this CPU has no cookies + * and there are no cookied tasks running on siblings. + */ + if (!need_sync) { + for_each_class(class) { + next = class->pick_task(rq); + if (next) + break; + } + + if (!next->core_cookie) { + rq->core_pick = NULL; + goto done; + } need_sync = true; - fi_before = true; - rq->core->core_forceidle = false; } + for_each_cpu(i, smt_mask) { struct rq *rq_i = cpu_rq(i); @@ -5239,38 +5257,8 @@ pick_next_task(struct rq *rq, struct task_struct *prev, struct rq_flags *rf) * core. */ p = pick_task(rq_i, class, max); - if (!p) { - /* - * If there weren't no cookies; we don't need to - * bother with the other siblings. - */ - if (i == cpu && !need_sync) - goto next_class; - + if (!p) continue; - } - - /* - * Optimize the 'normal' case where there aren't any - * cookies and we don't need to sync up. - */ - if (i == cpu && !need_sync) { - if (p->core_cookie) { - /* - * This optimization is only valid as - * long as there are no cookies - * involved. We may have skipped - * non-empty higher priority classes on - * siblings, which are empty on this - * CPU, so start over. - */ - need_sync = true; - goto reset; - } - - next = p; - goto done; - } rq_i->core_pick = p; @@ -5298,18 +5286,9 @@ pick_next_task(struct rq *rq, struct task_struct *prev, struct rq_flags *rf) cpu_rq(j)->core_pick = NULL; } goto again; - } else { - /* - * Once we select a task for a cpu, we - * should not be doing an unconstrained - * pick because it might starve a task - * on a forced idle cpu. - */ - need_sync = true; } } } -next_class:; } rq->core->core_pick_seq = rq->core->core_task_seq; -- 2.29.2.299.gdc1121823c-goog