Received: by 2002:a05:6a10:1287:0:0:0:0 with SMTP id d7csp3899184pxv; Mon, 19 Jul 2021 11:27:47 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyanZNHf4KaM0T1lbvRzTyccW5+RKJnO/g16/caBaxhJQLanR0qygavC2E4dxWZ3R4oDkT9 X-Received: by 2002:a92:d10:: with SMTP id 16mr17812735iln.189.1626719267448; Mon, 19 Jul 2021 11:27:47 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1626719267; cv=none; d=google.com; s=arc-20160816; b=QTeke+gU4mfD/8qzczzFtlyMZSaXE5hiEjvf3WKozvCsPla6wLYjPPBkH+7x/ClAc/ q2ragvTFhagvMB/TC9aDJ7S69K4xtSZzJCq3bimQP1+3gYeSgxxHcxJj32IfGTxZ+vsV FuulVk3Wji1JtfKxHJ/GzmpPPW3DRwwwy5J/LEEg1CPLGXsyQF6OetmNsbptyW/L82jG IuFkbWx9ZL0wkDa9BfpORzsdajTSotZ/jnz4178W8be7sRe0gsnEfTQOZgpAf5p8gdfR mDkbjJs4k6x8ZLNYoPsaOvyv9DrcquPQ22U/gWuux4MJCslvZ89QnNM/AAmbEe3MnREK G/EA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:from:subject:references:mime-version :message-id:in-reply-to:date:dkim-signature; bh=feVKBadnlv5HmZyKh3LYcmKfEyHeKjcrialc9HWN4XY=; b=Qg6u8PJFS3STEpXeRhXqPCdovGqXuZsTDNt6ZvbFnLCxJe5QDSOtzeG68tPqgVS/mF Lc3uHOqHrwASyad3EfFJ98syIhLfj2wKy+kLnuBUmFRlZ67rwzvG7hilsrru1WTaDcJS 7FSy6VsXo+XUy3c+vwt3/wt/aANI99N3t9yfFriDZ1cBpUEMrDP1/ne0sNpGl86+afeQ k3+B02eRPGIOukMBzRoNJE7/tmu8AoL2jc7nO4rmQ2QbE6DZcqOvi0he4InRTnfQQfpB cwWbq9oqgRKimeHBTl/Xos/1NY+3HiNhoVLFy6L9ce6V7Uh98+1c8t1dg1ZMAdJuS4XS IVTA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b=IKjUVCJ2; 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; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id n1si22486463ilt.39.2021.07.19.11.27.36; Mon, 19 Jul 2021 11:27:47 -0700 (PDT) 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=@google.com header.s=20161025 header.b=IKjUVCJ2; 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; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1381319AbhGSRiA (ORCPT + 99 others); Mon, 19 Jul 2021 13:38:00 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:55694 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1352237AbhGSQB1 (ORCPT ); Mon, 19 Jul 2021 12:01:27 -0400 Received: from mail-wr1-x44a.google.com (mail-wr1-x44a.google.com [IPv6:2a00:1450:4864:20::44a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 11CEDC076741 for ; Mon, 19 Jul 2021 08:52:23 -0700 (PDT) Received: by mail-wr1-x44a.google.com with SMTP id r18-20020adfce920000b029013bbfb19640so8932573wrn.17 for ; Mon, 19 Jul 2021 09:17:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=feVKBadnlv5HmZyKh3LYcmKfEyHeKjcrialc9HWN4XY=; b=IKjUVCJ2VPBwD5hRxxGra1Tpa9UOCcXRHB34fy/06eNrYIRZDjL5DqXnYwhC3UB8LH s+4aLRjWlqNXgZ94qMZljQIrMCuUi1fKaahaTrBNRw99j9RzHOT9tlr5MMGr/bFX48im hoW7+uLcVzMq7QKjQTi7SSdLd6/+JENULRDmxnK7Flz1KELDk6YxZ72lUCBbY07fS5NP co1vL9spgsVObEli7xXbUYOoQBu7SpkEUDYz2lSwlL6OdHShDF6cL9iTNkDjsOZpl6R3 G7GcThq/Sbrh0JrwmBsMNE0nTBjUkQeNZl2zQNpJvqyGQW6yFZEKSko/0X/GQW2TxfsB Epig== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=feVKBadnlv5HmZyKh3LYcmKfEyHeKjcrialc9HWN4XY=; b=AP/5CG1BNrC41tOxRdm3hDpJfqirCMd2dOJJpml629M9QddvT+FdlDZtgWOI8muhPr RKcSBBOy5pbZ2earMndtQHNmyrntkLnor2u8j80iFRc56q/4LPnW7NZioQn/UmsitmaI ZXpsL8kK9us6DvLuzM97ECRG7wAT0gG24QenqIBC7FwEbPUvt46RHWHEo3h5706HxrHW cY/bC2JlopAPOnFacU1rEkKAaFXWwS8xePv83oUYNZeQlBWI9odaItup06zc2RsbmvB2 MRI+osiUYeL+vfCH02JSSEGBxoWBgBwfW938ciNFRPBiNv2CLx7oO2e58FN7usBMh43q HcOg== X-Gm-Message-State: AOAM5339Ufc4D/gEuddWVrib+/4y63n7rYZIWZEh4JZ4fyUikkR/YSDF 3Nehzg/zxKf9CRDdXXWm8vaYXsod9b/M X-Received: from luke.lon.corp.google.com ([2a00:79e0:d:210:83e0:11ac:c870:2b97]) (user=qperret job=sendgmr) by 2002:a05:600c:4285:: with SMTP id v5mr13491671wmc.189.1626711420668; Mon, 19 Jul 2021 09:17:00 -0700 (PDT) Date: Mon, 19 Jul 2021 17:16:55 +0100 In-Reply-To: <20210719161656.3833943-1-qperret@google.com> Message-Id: <20210719161656.3833943-2-qperret@google.com> Mime-Version: 1.0 References: <20210719161656.3833943-1-qperret@google.com> X-Mailer: git-send-email 2.32.0.402.g57bb445576-goog Subject: [PATCH v4 1/2] sched: Fix UCLAMP_FLAG_IDLE setting From: Quentin Perret To: mingo@redhat.com, peterz@infradead.org, vincent.guittot@linaro.org, dietmar.eggemann@arm.com, qais.yousef@arm.com, rickyiu@google.com, wvw@google.com, patrick.bellasi@matbug.net, xuewen.yan94@gmail.com Cc: linux-kernel@vger.kernel.org, kernel-team@android.com Content-Type: text/plain; charset="UTF-8" Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The UCLAMP_FLAG_IDLE flag is set on a runqueue when dequeueing the last active task to maintain the last uclamp.max and prevent blocked util from suddenly becoming visible. However, there is an asymmetry in how the flag is set and cleared which can lead to having the flag set whilst there are active tasks on the rq. Specifically, the flag is cleared in the uclamp_rq_inc() path, which is called at enqueue time, but set in uclamp_rq_dec_id() which is called both when dequeueing a task _and_ in the update_uclamp_active() path. As a result, when both uclamp_rq_{dec,ind}_id() are called from update_uclamp_active(), the flag ends up being set but not cleared, hence leaving the runqueue in a broken state. Fix this by clearing the flag in update_uclamp_active() as well. Fixes: e496187da710 ("sched/uclamp: Enforce last task's UCLAMP_MAX") Reported-by: Rick Yiu Signed-off-by: Quentin Perret --- kernel/sched/core.c | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/kernel/sched/core.c b/kernel/sched/core.c index cf16f8fda9a6..e801d2c3077b 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -1619,6 +1619,23 @@ static inline void uclamp_rq_dec(struct rq *rq, struct task_struct *p) uclamp_rq_dec_id(rq, p, clamp_id); } +static inline void uclamp_rq_reinc_id(struct rq *rq, struct task_struct *p, + enum uclamp_id clamp_id) +{ + if (!p->uclamp[clamp_id].active) + return; + + uclamp_rq_dec_id(rq, p, clamp_id); + uclamp_rq_inc_id(rq, p, clamp_id); + + /* + * Make sure to clear the idle flag if we've transiently reached 0 + * active tasks on rq. + */ + if (clamp_id == UCLAMP_MAX && (rq->uclamp_flags & UCLAMP_FLAG_IDLE)) + rq->uclamp_flags &= ~UCLAMP_FLAG_IDLE; +} + static inline void uclamp_update_active(struct task_struct *p) { @@ -1642,12 +1659,8 @@ uclamp_update_active(struct task_struct *p) * affecting a valid clamp bucket, the next time it's enqueued, * it will already see the updated clamp bucket value. */ - for_each_clamp_id(clamp_id) { - if (p->uclamp[clamp_id].active) { - uclamp_rq_dec_id(rq, p, clamp_id); - uclamp_rq_inc_id(rq, p, clamp_id); - } - } + for_each_clamp_id(clamp_id) + uclamp_rq_reinc_id(rq, p, clamp_id); task_rq_unlock(rq, p, &rf); } -- 2.32.0.402.g57bb445576-goog