Received: by 2002:ac0:946b:0:0:0:0:0 with SMTP id j40csp1482193imj; Fri, 8 Feb 2019 02:09:10 -0800 (PST) X-Google-Smtp-Source: AHgI3IaimkI/SSezc2ShSexWP/kNG6F+7g2wd4DVOe/FXf08Ccm2BDSbOatO37qbzLzJNviiToWt X-Received: by 2002:a63:c444:: with SMTP id m4mr19735579pgg.310.1549620550650; Fri, 08 Feb 2019 02:09:10 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1549620550; cv=none; d=google.com; s=arc-20160816; b=KPXziz6Sq068mAOi4j9hWaqamEIjgDhaPhJDVvBzmciLnNfhBPNqF3S2hRQJPlZdSb fq264DtBvHkFzpumAv+A42dGKdNhM5Ts6q8YrpjMpLCdGlviBmB7rU7aPtQJEgfmqTH5 +lI6n+n6TY4lMvoRAO2VCF+NYIqqKetPbTfs2SUT42vgERtXF02AA7ZkxvHMw8rEDZeJ dvqdJTDofNZLCK7JwkwBaF1xPn4CUMLlY1LKairIo7v8uijJhY768jJnN/GNZabT1puF OkHJAzo2SxwPxe60k2JFMml1zjYtoG9AjgIy6jVOqyZc02rymdZSMT6veYOAXjqUGowG 9rtA== 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=vJ62Tzxr24PJsd4GQvk8GpPH9ya4PqpTKX1uKgloGNg=; b=TzpGBdkKqQd0069AP7FE2EvqN3EHnV1FiGQbCt0i35UOYsCWHo51vc+mY9Cb37zU8E ODlxcHzkzROL5meMsBPaE0On8qziHK4AgIXDnsIjRnCMkxxkqRp5CDP+nvYyT2wRNBMv b5cRaN3+yRSnejhQZYJJk3s0kGLjxxdEfhporFKJ+uNpbZj57bMul0MwF3z/+LQZVCxS dxlUbKK6SkqNjcrzJc+iK+F6FF3mnTNgsh/6WShZgmBKNryQ4e+qMtPT8ad6BUWewc7V +0W+0KYAezL3ERKW6oY+Xq8/CzHQOJVtAkDhyTA3RuyeGuwxIr6LlFIj5yH5HiVrSIiA tJLA== 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 g81si1853436pfe.13.2019.02.08.02.08.54; Fri, 08 Feb 2019 02:09:10 -0800 (PST) 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 S1726852AbfBHKHG (ORCPT + 99 others); Fri, 8 Feb 2019 05:07:06 -0500 Received: from foss.arm.com ([217.140.101.70]:47712 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727134AbfBHKHD (ORCPT ); Fri, 8 Feb 2019 05:07:03 -0500 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.72.51.249]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 80236A78; Fri, 8 Feb 2019 02:07:03 -0800 (PST) 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 691B83F557; Fri, 8 Feb 2019 02:07:00 -0800 (PST) From: Patrick Bellasi To: linux-kernel@vger.kernel.org, linux-pm@vger.kernel.org, linux-api@vger.kernel.org Cc: Ingo Molnar , Peter Zijlstra , Tejun Heo , "Rafael J . Wysocki" , Vincent Guittot , Viresh Kumar , Paul Turner , Quentin Perret , Dietmar Eggemann , Morten Rasmussen , Juri Lelli , Todd Kjos , Joel Fernandes , Steve Muckle , Suren Baghdasaryan Subject: [PATCH v7 15/15] sched/core: uclamp: Update CPU's refcount on TG's clamp changes Date: Fri, 8 Feb 2019 10:05:54 +0000 Message-Id: <20190208100554.32196-16-patrick.bellasi@arm.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190208100554.32196-1-patrick.bellasi@arm.com> References: <20190208100554.32196-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 clamped as requested. Do that by slightly refactoring uclamp_bucket_inc(). An additional parameter *cgroup_subsys_state (css) is used to walk the list of tasks in the TGs and update the RUNNABLE ones. Do that by taking the rq lock for each task, the same mechanism used for cpu affinity masks updates. Signed-off-by: Patrick Bellasi Cc: Ingo Molnar Cc: Peter Zijlstra Cc: Tejun Heo --- kernel/sched/core.c | 46 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/kernel/sched/core.c b/kernel/sched/core.c index 6f8f68d18d0f..e0fdc98b3663 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -1030,6 +1030,51 @@ static inline void uclamp_rq_dec(struct rq *rq, struct task_struct *p) uclamp_rq_dec_id(p, rq, 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(p, rq, clamp_id); + uclamp_rq_inc_id(p, rq, clamp_id); + +done: + + task_rq_unlock(rq, p, &rf); +} + +static inline void +uclamp_update_active_tasks(struct cgroup_subsys_state *css, int clamp_id) +{ + struct css_task_iter it; + struct task_struct *p; + + css_task_iter_start(css, 0, &it); + while ((p = css_task_iter_next(&it))) + uclamp_update_active(p, clamp_id); + css_task_iter_end(&it); +} + #ifdef CONFIG_UCLAMP_TASK_GROUP static void cpu_util_update_hier(struct cgroup_subsys_state *css, unsigned int clamp_id, unsigned int bucket_id, @@ -7128,6 +7173,7 @@ static void cpu_util_update_hier(struct cgroup_subsys_state *css, uc_se->effective.value = value; uc_se->effective.bucket_id = bucket_id; + uclamp_update_active_tasks(css, clamp_id); } } -- 2.20.1