Received: by 2002:ac0:950c:0:0:0:0:0 with SMTP id f12csp3900225imc; Thu, 14 Mar 2019 07:47:06 -0700 (PDT) X-Google-Smtp-Source: APXvYqw01fK0FJbDfPYnJcgGqHqumtGVgK9NTecf0ydS91JlJYuHJmqxlAkHQJQvPCa78Rd06d0r X-Received: by 2002:a62:1882:: with SMTP id 124mr1528002pfy.101.1552574826844; Thu, 14 Mar 2019 07:47:06 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1552574826; cv=none; d=google.com; s=arc-20160816; b=NtX2yLO2NobTDl0sEELGl5K0ebErgR3uDBrM/ibpXjkU5DfjuZf0KIdKf0IaMSebTv NuJFN/JuU6SJPkiRyu2M7KrrKPufbV6d4a6+O/mWYLlxUzBn69UaIVa2KGHQd/eeswZj 2uLAGFyHbRabP6A5nStNJAGUyXAmqiojbDaEf9bHVBWVQTFlxkAUE3fXDQ8VkE1JjbL3 TkK0AKfmoSDVINn8vYobbcUUnSBBlNIxP0eVV2wsDdxKzk+GPF4BqO/SXOf7jDBNxz6F lrUz6MSdPQgTBsj+Oy1GZz8sNh8U0ojqUqGTbeCWtLHv+UxWdIe3pdKtuaZx1yaxF+Rm z+fw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:user-agent:in-reply-to :content-disposition:mime-version:references:message-id:subject:cc :to:from:date; bh=1rbqe3lW7Ag5say/s8iAezQoeKVb80fsHFTDaP3oOxk=; b=K7Do7p+okCPf2MXY0hg7kdQx4wgCh08N+skcMeF8B9X85WTtZO9hcMtdrDSnu3qIJc bYa0qpSdiZQcgsb//sraS8ccPBuIaGA609qCWw93ICn8rSU7KvrNcs8e9DUE3Sni+jHh kFj5svPLllJut/aXBefaMYVcmY9+qfGLefih/6+hLQcHepSPP7NEcScRywKUmvckq3Nh um2Huds4pVCQ1vp07d+bz7MuFgeTTJy4aKKtUx/8RszFmrCwSDZIKURyKsfhbmJx+YRJ 0UsH6MAOsde4pIgf194J7LtvpWG8GLy1cyqAsd/xArb/5ImdonL7iqOdnWFsweIqq5XO ebTA== 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 c6si13430650plr.166.2019.03.14.07.46.51; Thu, 14 Mar 2019 07:47:06 -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 S1727040AbfCNOqH (ORCPT + 99 others); Thu, 14 Mar 2019 10:46:07 -0400 Received: from foss.arm.com ([217.140.101.70]:45836 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726501AbfCNOqH (ORCPT ); Thu, 14 Mar 2019 10:46:07 -0400 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 4C56EA78; Thu, 14 Mar 2019 07:46:06 -0700 (PDT) Received: from e110439-lin (e110439-lin.cambridge.arm.com [10.1.194.43]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 575AB3F59C; Thu, 14 Mar 2019 07:46:03 -0700 (PDT) Date: Thu, 14 Mar 2019 14:46:00 +0000 From: Patrick Bellasi To: Suren Baghdasaryan Cc: LKML , linux-pm@vger.kernel.org, linux-api@vger.kernel.org, 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 Subject: Re: [PATCH v7 01/15] sched/core: uclamp: Add CPU's clamp buckets refcounting Message-ID: <20190314144600.2ulpeipad7jbxyiy@e110439-lin> References: <20190208100554.32196-1-patrick.bellasi@arm.com> <20190208100554.32196-2-patrick.bellasi@arm.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: NeoMutt/20180716 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 13-Mar 14:32, Suren Baghdasaryan wrote: > On Fri, Feb 8, 2019 at 2:06 AM Patrick Bellasi wrote: > > > > Utilization clamping allows to clamp the CPU's utilization within a > > [util_min, util_max] range, depending on the set of RUNNABLE tasks on > > that CPU. Each task references two "clamp buckets" defining its minimum > > and maximum (util_{min,max}) utilization "clamp values". A CPU's clamp > > bucket is active if there is at least one RUNNABLE tasks enqueued on > > that CPU and refcounting that bucket. > > > > When a task is {en,de}queued {on,from} a rq, the set of active clamp > > buckets on that CPU can change. Since each clamp bucket enforces a > > different utilization clamp value, when the set of active clamp buckets > > changes, a new "aggregated" clamp value is computed for that CPU. > > > > Clamp values are always MAX aggregated for both util_min and util_max. > > This ensures that no tasks can affect the performance of other > > co-scheduled tasks which are more boosted (i.e. with higher util_min > > clamp) or less capped (i.e. with higher util_max clamp). > > > > Each task has a: > > task_struct::uclamp[clamp_id]::bucket_id > > to track the "bucket index" of the CPU's clamp bucket it refcounts while > > enqueued, for each clamp index (clamp_id). > > > > Each CPU's rq has a: > > rq::uclamp[clamp_id]::bucket[bucket_id].tasks > > to track how many tasks, currently RUNNABLE on that CPU, refcount each > > clamp bucket (bucket_id) of a clamp index (clamp_id). > > > > Each CPU's rq has also a: > > rq::uclamp[clamp_id]::bucket[bucket_id].value > > to track the clamp value of each clamp bucket (bucket_id) of a clamp > > index (clamp_id). > > > > The rq::uclamp::bucket[clamp_id][] array is scanned every time we need > > to find a new MAX aggregated clamp value for a clamp_id. This operation > > is required only when we dequeue the last task of a clamp bucket > > tracking the current MAX aggregated clamp value. In these cases, the CPU > > is either entering IDLE or going to schedule a less boosted or more > > clamped task. > > The expected number of different clamp values, configured at build time, > > is small enough to fit the full unordered array into a single cache > > line. > > I assume you are talking about "struct uclamp_rq uclamp[UCLAMP_CNT]" > here. No, I'm talking about the rq::uclamp::bucket[clamp_id][], which is an array of: struct uclamp_bucket { unsigned long value : bits_per(SCHED_CAPACITY_SCALE); unsigned long tasks : BITS_PER_LONG - bits_per(SCHED_CAPACITY_SCALE); }; defined as part of: struct uclamp_rq { unsigned int value; struct uclamp_bucket bucket[UCLAMP_BUCKETS]; }; So, it's an array of UCLAMP_BUCKETS (value, tasks) pairs. > uclamp_rq size depends on UCLAMP_BUCKETS configurable to be up > to 20. sizeof(long)*20 is already more than 64 bytes. What am I > missing? Right, the comment above refers to the default configuration, which is 5 buckets. With that configuration we have: $> pahole kernel/sched/core.o ---8<--- struct uclamp_bucket { long unsigned int value:11; /* 0:53 8 */ long unsigned int tasks:53; /* 0: 0 8 */ /* size: 8, cachelines: 1, members: 2 */ /* last cacheline: 8 bytes */ }; struct uclamp_rq { unsigned int value; /* 0 4 */ /* XXX 4 bytes hole, try to pack */ struct uclamp_bucket bucket[5]; /* 8 40 */ /* size: 48, cachelines: 1, members: 2 */ /* sum members: 44, holes: 1, sum holes: 4 */ /* last cacheline: 48 bytes */ }; struct rq { // ... /* --- cacheline 2 boundary (128 bytes) --- */ struct uclamp_rq uclamp[2]; /* 128 96 */ /* --- cacheline 3 boundary (192 bytes) was 32 bytes ago --- */ // ... }; ---8<--- Where you see the array fits into a single cache line. Actually I notice now that, since when we removed the bucket dedicated to the default values, we now have some spare space and we can probably increase the default (and minimum) value of UCLAMP_BUCKETS to be 7. This will uses two full cache lines in struct rq, one for each clamp index... Although 7 it's a bit of a odd number and gives by default buckets of ~14% size instead of the ~20%. Thoughts ? [...] -- #include Patrick Bellasi