Received: by 2002:a25:ad19:0:0:0:0:0 with SMTP id y25csp913239ybi; Fri, 2 Aug 2019 06:23:15 -0700 (PDT) X-Google-Smtp-Source: APXvYqzYzQcJiIAXRQq8X7xbR8gx+mOGdtoIfi7Ens8CIJDKIv3R6RwjlQ8QcHdWTtsNdc67oara X-Received: by 2002:a65:6448:: with SMTP id s8mr124847196pgv.223.1564752195357; Fri, 02 Aug 2019 06:23:15 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1564752195; cv=none; d=google.com; s=arc-20160816; b=cCeL7t3eml2H3Kb79sXd7RGJIsw9Wrfl9gUfzgyss4sNCR7DK6yjXiaaeP+jXtjB9D CRrlOSkhETj0HvNRMYSdhK9iLXSTeQReU8KtDUS+Il5H+/lGzr/riGS18f5XTZB7lhSH 4wyqTsgmp5/Qz9sC25XffDNjURieoApUmK/5Q7zgZoFHBdGuJrTsY+zwYx10n/YHAlOA zoKd5mOZwvR8ieNxIs5EZN53PBrR9Bs7L0DKXE4xyTDqY1ZKXgWXThoKX04lu0zsJnzb RGxR8KLHHCF9nGAbhHP6N8IgHmEFKqFMHxw34ZiNrZkZcRxhvtA+DKJbX3TWlLKm6TOq Kb/A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=eLldTjo4TZiwiNsju9Z63DWoxx/5RTcRdTh90dhPmFc=; b=svK6S8ishqAHP35SIBfhdz3VcmBLGTrpP+TY369C5WODo9wM2seOO7KDjrFRrzsbi3 Hx+wh8xcxluyUNnPCB6QiLZRp4fMWYSSemrLJsYhqVXJwpdTS9CoDpB6XeL543oEALpa NF7nfPsjBWuQceJYE6MmYuLLZ7Xf71rBILfps5cC0wm/k5BIc83kKZQzFnyDSVxpYPmo jfPErsyVM21DsYyeJWyFKSETOMsVhfZu7o2vVcx9oNmalTe0Q3O2cXjuQq7PMr+g9K+b n0ItOimkVshN/hV01RAwOaD3SQ3K+1jQbHgDtN6Ftnc6/4x21kxQeQYULcFNJ9pdEA2l KIbw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id i4si375547pgq.219.2019.08.02.06.23.00; Fri, 02 Aug 2019 06:23:15 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2404629AbfHBJJY (ORCPT + 99 others); Fri, 2 Aug 2019 05:09:24 -0400 Received: from foss.arm.com ([217.140.110.172]:47134 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2404618AbfHBJJW (ORCPT ); Fri, 2 Aug 2019 05:09:22 -0400 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 9B9191596; Fri, 2 Aug 2019 02:09:21 -0700 (PDT) Received: from e110439-lin.cambridge.arm.com (e110439-lin.cambridge.arm.com [10.1.194.43]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id EC63C3F575; Fri, 2 Aug 2019 02:09:18 -0700 (PDT) From: Patrick Bellasi To: linux-kernel@vger.kernel.org, linux-pm@vger.kernel.org, linux-api@vger.kernel.org, cgroups@vger.kernel.org Cc: Ingo Molnar , Peter Zijlstra , Tejun Heo , "Rafael J . Wysocki" , Vincent Guittot , Viresh Kumar , Paul Turner , Michal Koutny , Quentin Perret , Dietmar Eggemann , Morten Rasmussen , Juri Lelli , Todd Kjos , Joel Fernandes , Steve Muckle , Suren Baghdasaryan , Alessio Balsini Subject: [PATCH v13 5/6] sched/core: uclamp: Update CPU's refcount on TG's clamp changes Date: Fri, 2 Aug 2019 10:08:52 +0100 Message-Id: <20190802090853.4810-6-patrick.bellasi@arm.com> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20190802090853.4810-1-patrick.bellasi@arm.com> References: <20190802090853.4810-1-patrick.bellasi@arm.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On updates of task group (TG) clamp values, ensure that these new values are enforced on all RUNNABLE tasks of the task group, i.e. all RUNNABLE tasks are immediately boosted and/or capped as requested. Do that each time we update effective clamps from cpu_util_update_eff(). Use the *cgroup_subsys_state (css) to walk the list of tasks in each affected TG and update their RUNNABLE tasks. Update each task by using the same mechanism used for cpu affinity masks updates, i.e. by taking the rq lock. Signed-off-by: Patrick Bellasi Acked-by: Tejun Heo Cc: Ingo Molnar Cc: Peter Zijlstra Cc: Tejun Heo --- kernel/sched/core.c | 58 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/kernel/sched/core.c b/kernel/sched/core.c index 106cf69d70cc..8cc1198e7199 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -1043,6 +1043,57 @@ 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_update_active(struct task_struct *p, unsigned int clamp_id) +{ + struct rq_flags rf; + struct rq *rq; + + /* + * Lock the task and the rq where the task is (or was) queued. + * + * We might lock the (previous) rq of a !RUNNABLE task, but that's the + * price to pay to safely serialize util_{min,max} updates with + * enqueues, dequeues and migration operations. + * This is the same locking schema used by __set_cpus_allowed_ptr(). + */ + rq = task_rq_lock(p, &rf); + + /* + * Setting the clamp bucket is serialized by task_rq_lock(). + * If the task is not yet RUNNABLE and its task_struct is not + * affecting a valid clamp bucket, the next time it's enqueued, + * it will already see the updated clamp bucket value. + */ + if (!p->uclamp[clamp_id].active) + goto done; + + uclamp_rq_dec_id(rq, p, clamp_id); + uclamp_rq_inc_id(rq, p, clamp_id); + +done: + + task_rq_unlock(rq, p, &rf); +} + +static inline void +uclamp_update_active_tasks(struct cgroup_subsys_state *css, + unsigned int clamps) +{ + struct css_task_iter it; + struct task_struct *p; + unsigned int clamp_id; + + css_task_iter_start(css, 0, &it); + while ((p = css_task_iter_next(&it))) { + for_each_clamp_id(clamp_id) { + if ((0x1 << clamp_id) & clamps) + uclamp_update_active(p, clamp_id); + } + } + css_task_iter_end(&it); +} + #ifdef CONFIG_UCLAMP_TASK_GROUP static void cpu_util_update_eff(struct cgroup_subsys_state *css); static void uclamp_update_root_tg(void) @@ -7148,8 +7199,13 @@ static void cpu_util_update_eff(struct cgroup_subsys_state *css) uc_se[clamp_id].bucket_id = uclamp_bucket_id(eff[clamp_id]); clamps |= (0x1 << clamp_id); } - if (!clamps) + if (!clamps) { css = css_rightmost_descendant(css); + continue; + } + + /* Immediately update descendants RUNNABLE tasks */ + uclamp_update_active_tasks(css, clamps); } } -- 2.22.0