Received: by 2002:a25:ab43:0:0:0:0:0 with SMTP id u61csp413104ybi; Fri, 21 Jun 2019 01:44:11 -0700 (PDT) X-Google-Smtp-Source: APXvYqzl8HclKbbbAbnCvomy35jlomkTrob2iQbTlXsNwc405qD7122f50XGH7hsJBr00dz30Rs9 X-Received: by 2002:a17:902:76c3:: with SMTP id j3mr101957151plt.116.1561106651063; Fri, 21 Jun 2019 01:44:11 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1561106651; cv=none; d=google.com; s=arc-20160816; b=LbJ7Fd0sl6jYXbNbCZmsKaWx6zQclzcDkXaFnWVWh0kdo61uFglks5J8awqSH8TNnC 9x0zrubu68FnDxgQqfaM4pjLCyS26a05HgvbrvkCN8X25v/l3CWy9X0gha7UuEBqlUCj I+MofBYmftJyN8bFmnvQW7m0x2wL1SnHnqTe6E6uw3O9j14E0N64fbCY4r3dToRVSkVM uePQKckr8KbC4tZPFjPcEKSOhAwwRavSNgu7GYLEG1R2MhSXBENOrdXdlcPa/+TcqMzj jOUKEGBw6fgytUVNDnsOuGV2J6IXPi4wLV80QFCaboRMmSb58G3eG/El4awBYi2f0Mvk GuzQ== 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=j66h7JUUBSzkik+b1QiS4MQfEM95IrDJ7QDNxM1nUmI=; b=XYsjr8A5qHfK0ADmtY8cL/Or/mlWg/LL0Dzty0YXlhRIbLXVz1v72Up65GGxRj/nZf jByqLUDOCHQjzfugGlO1HjPSI2u8B+n91rGblViHxm0Ef8hKaeoNRU38+5DOagns5G4b aJHJxJVXGKkxmB7xovXMPPpG43M/wBB9LhOUTXBhlTwDA5xDKBiYzy2BB6B1m965YdXb UR1B/zacTRuBBCtwjvsJUy7hgMCdLsNBplpcz0KHGgb7YAP2mwcatTo0wrPI/Q58z2LS bcvfEiv5wdQD61GYr0A0fVU429YpfgPz2NtNtPGiFJK9bMjHEGCVdA9N77CxEFDEFy/L MLFg== 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 i12si1876298pgq.138.2019.06.21.01.43.55; Fri, 21 Jun 2019 01:44:11 -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 S1726798AbfFUInT (ORCPT + 99 others); Fri, 21 Jun 2019 04:43:19 -0400 Received: from foss.arm.com ([217.140.110.172]:51126 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726755AbfFUInQ (ORCPT ); Fri, 21 Jun 2019 04:43:16 -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 1A09915A2; Fri, 21 Jun 2019 01:43:16 -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 BAECA3F246; Fri, 21 Jun 2019 01:43:13 -0700 (PDT) From: Patrick Bellasi To: linux-kernel@vger.kernel.org, linux-pm@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 , Alessio Balsini Subject: [PATCH v10 16/16] sched/core: uclamp: Update CPU's refcount on TG's clamp changes Date: Fri, 21 Jun 2019 09:42:17 +0100 Message-Id: <20190621084217.8167-17-patrick.bellasi@arm.com> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190621084217.8167-1-patrick.bellasi@arm.com> References: <20190621084217.8167-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 | 48 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/kernel/sched/core.c b/kernel/sched/core.c index 8070e11cafa0..1ddc37320f3d 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -1032,6 +1032,51 @@ 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, 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_eff(struct cgroup_subsys_state *css, unsigned int clamp_id); @@ -7064,6 +7109,9 @@ static void cpu_util_update_eff(struct cgroup_subsys_state *css, uc_se->value = value; uc_se->bucket_id = uclamp_bucket_id(value); + + /* Immediately update descendants RUNNABLE tasks */ + uclamp_update_active_tasks(css, clamp_id); } } -- 2.21.0