From patchwork Thu Jul 3 16:25:50 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Morten Rasmussen X-Patchwork-Id: 33055 Return-Path: X-Original-To: linaro@patches.linaro.org Delivered-To: linaro@patches.linaro.org Received: from mail-vc0-f197.google.com (mail-vc0-f197.google.com [209.85.220.197]) by ip-10-151-82-157.ec2.internal (Postfix) with ESMTPS id BC5BE203AC for ; Thu, 3 Jul 2014 16:33:50 +0000 (UTC) Received: by mail-vc0-f197.google.com with SMTP id il7sf1243862vcb.0 for ; Thu, 03 Jul 2014 09:33:50 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:delivered-to:from:to:cc:subject :date:message-id:in-reply-to:references:sender:precedence:list-id :x-original-sender:x-original-authentication-results:mailing-list :list-post:list-help:list-archive:list-unsubscribe:content-type :content-transfer-encoding; bh=bU/G6AT+nMlNmAHzbfp5Vjqk7RX95MUhG6tCG6pKkTM=; b=hzxVHTBZ4+vIy/T+aUI/46FyEP0e+5YFlTVVZECgHTA2u2OpK0pY4sIkfj/QIGJtYI bWT7ugz/a1wrknrVMinDO7mzijJgnLls4FIZe5u+w91/Zu0VTASlxkX15XhRsK4v7hl4 NXDnz2HnpOfg0mXUQWSLSoot+yEqfRgctwWCY6JvX8oFygxRdxXFpkE44zCefMMtx0GU doF2bk9qZg2V9ctoxKca77piWtGyKKHmutV6K4YvZ7V87gGIVyZJbAx+don4y9ykUjol ppmN/uM9sxXOwhKjAe9EEzTb29yZAMZbLdZmq9C+kXSGANNd2OZN1+XPMaavYv6NmtAW geLw== X-Gm-Message-State: ALoCoQnorzUjTWt8atUR9rDL49+3ZpF2GlcVnOrTLKXKD1dNLAhMkKB23VdfQjzEB1LKIRobazTZ X-Received: by 10.236.189.68 with SMTP id b44mr2466741yhn.4.1404405230578; Thu, 03 Jul 2014 09:33:50 -0700 (PDT) MIME-Version: 1.0 X-BeenThere: patchwork-forward@linaro.org Received: by 10.140.92.131 with SMTP id b3ls545244qge.29.gmail; Thu, 03 Jul 2014 09:33:50 -0700 (PDT) X-Received: by 10.220.69.4 with SMTP id x4mr835484vci.74.1404405230465; Thu, 03 Jul 2014 09:33:50 -0700 (PDT) Received: from mail-ve0-f178.google.com (mail-ve0-f178.google.com [209.85.128.178]) by mx.google.com with ESMTPS id ya3si14422928vec.105.2014.07.03.09.33.50 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Thu, 03 Jul 2014 09:33:50 -0700 (PDT) Received-SPF: pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.128.178 as permitted sender) client-ip=209.85.128.178; Received: by mail-ve0-f178.google.com with SMTP id oy12so494278veb.23 for ; Thu, 03 Jul 2014 09:33:50 -0700 (PDT) X-Received: by 10.220.92.135 with SMTP id r7mr4803081vcm.11.1404405230352; Thu, 03 Jul 2014 09:33:50 -0700 (PDT) X-Forwarded-To: patchwork-forward@linaro.org X-Forwarded-For: patch@linaro.org patchwork-forward@linaro.org Delivered-To: patch@linaro.org Received: by 10.221.37.5 with SMTP id tc5csp390908vcb; Thu, 3 Jul 2014 09:33:49 -0700 (PDT) X-Received: by 10.70.138.4 with SMTP id qm4mr5091059pdb.151.1404405229495; Thu, 03 Jul 2014 09:33:49 -0700 (PDT) Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id k7si968363pdn.124.2014.07.03.09.33.48; Thu, 03 Jul 2014 09:33:48 -0700 (PDT) Received-SPF: none (google.com: linux-kernel-owner@vger.kernel.org does not designate permitted sender hosts) client-ip=209.132.180.67; Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1759644AbaGCQdA (ORCPT + 27 others); Thu, 3 Jul 2014 12:33:00 -0400 Received: from service87.mimecast.com ([91.220.42.44]:44916 "EHLO service87.mimecast.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1758847AbaGCQ0J (ORCPT ); Thu, 3 Jul 2014 12:26:09 -0400 Received: from cam-owa2.Emea.Arm.com (fw-tnat.cambridge.arm.com [217.140.96.21]) by service87.mimecast.com; Thu, 03 Jul 2014 17:26:08 +0100 Received: from e103034-lin.cambridge.arm.com ([10.1.255.212]) by cam-owa2.Emea.Arm.com with Microsoft SMTPSVC(6.0.3790.3959); Thu, 3 Jul 2014 17:26:08 +0100 From: Morten Rasmussen To: linux-kernel@vger.kernel.org, linux-pm@vger.kernel.org, peterz@infradead.org, mingo@kernel.org Cc: rjw@rjwysocki.net, vincent.guittot@linaro.org, daniel.lezcano@linaro.org, preeti@linux.vnet.ibm.com, Dietmar.Eggemann@arm.com, pjt@google.com Subject: [RFCv2 PATCH 03/23] sched: Introduce energy data structures Date: Thu, 3 Jul 2014 17:25:50 +0100 Message-Id: <1404404770-323-4-git-send-email-morten.rasmussen@arm.com> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1404404770-323-1-git-send-email-morten.rasmussen@arm.com> References: <1404404770-323-1-git-send-email-morten.rasmussen@arm.com> X-OriginalArrivalTime: 03 Jul 2014 16:26:08.0225 (UTC) FILETIME=[7E8DA510:01CF96DB] X-MC-Unique: 114070317260800401 Sender: linux-kernel-owner@vger.kernel.org Precedence: list List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Removed-Original-Auth: Dkim didn't pass. X-Original-Sender: morten.rasmussen@arm.com X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.128.178 as permitted sender) smtp.mail=patch+caf_=patchwork-forward=linaro.org@linaro.org Mailing-list: list patchwork-forward@linaro.org; contact patchwork-forward+owners@linaro.org X-Google-Group-Id: 836684582541 List-Post: , List-Help: , List-Archive: List-Unsubscribe: , From: Dietmar Eggemann The struct sched_group_energy represents the per sched_group related data which is needed for energy aware scheduling. It contains: (1) atomic reference counter for scheduler internal bookkeeping of data allocation and freeing (2) number of elements of the idle state array (3) pointer to the idle state array which comprises 'power consumption and wakeup energy for the run->sleep->run cycle' tuples for each idle state (4) number of elements of the capacity state array (5) pointer to the capacity state array which comprises 'compute capacity and power consumption' tuples for each capacity state Allocation and freeing of struct sched_group_energy utilizes the existing infrastructure of the scheduler which is currently used for the other sd hierarchy data structures (e.g. struct sched_domain) as well. That's why struct sd_data is provisioned with a per cpu struct sched_group_energy double pointer. The struct sched_group obtains a pointer to a struct sched_group_energy. The function pointer sched_domain_energy_f is introduced into struct sched_domain_topology_level which will allow the arch to pass a particular struct sched_group_energy from the topology shim layer into the scheduler core. The function pointer sched_domain_energy_f has an 'int cpu' parameter since the folding of two adjacent sd levels via sd degenerate doesn't work for all sd levels. I.e. it is not possible for example to use this feature to provide per-cpu energy in sd level DIE on ARM's TC2 platform. It was discussed that the folding of sd levels approach is preferable over the cpu parameter approach, simply because the user (the arch specifying the sd topology table) can introduce less errors. But since it is not working, the 'int cpu' parameter is the only way out. It's possible to use the folding of sd levels approach for sched_domain_flags_f and the cpu parameter approach for the sched_domain_energy_f at the same time though. With the use of the 'int cpu' parameter, an extra check function has to be provided to make sure that all cpus spanned by a sched group are provisioned with the same energy data. Signed-off-by: Dietmar Eggemann --- include/linux/sched.h | 21 +++++++++++++++++++++ kernel/sched/sched.h | 1 + 2 files changed, 22 insertions(+) diff --git a/include/linux/sched.h b/include/linux/sched.h index b4f6bf9..1507390 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -909,6 +909,24 @@ struct sched_domain_attr { extern int sched_domain_level_max; +struct capacity_state { + unsigned long cap; /* compute capacity */ + unsigned long power; /* power consumption at this compute capacity */ +}; + +struct idle_state { + unsigned long power; /* power consumption in this idle state */ + unsigned long wu_energy; /* energy for run->sleep->run cycle (<<10) */ +}; + +struct sched_group_energy { + atomic_t ref; + unsigned int nr_idle_states; /* number of idle states */ + struct idle_state *idle_states; /* ptr to idle state array */ + unsigned int nr_cap_states; /* number of capacity states */ + struct capacity_state *cap_states; /* ptr to capacity state array */ +}; + struct sched_group; struct sched_domain { @@ -1007,6 +1025,7 @@ bool cpus_share_cache(int this_cpu, int that_cpu); typedef const struct cpumask *(*sched_domain_mask_f)(int cpu); typedef const int (*sched_domain_flags_f)(void); +typedef const struct sched_group_energy *(*sched_domain_energy_f)(int cpu); #define SDTL_OVERLAP 0x01 @@ -1014,11 +1033,13 @@ struct sd_data { struct sched_domain **__percpu sd; struct sched_group **__percpu sg; struct sched_group_capacity **__percpu sgc; + struct sched_group_energy **__percpu sge; }; struct sched_domain_topology_level { sched_domain_mask_f mask; sched_domain_flags_f sd_flags; + sched_domain_energy_f energy; int flags; int numa_level; struct sd_data data; diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h index 2f86361..d300a64 100644 --- a/kernel/sched/sched.h +++ b/kernel/sched/sched.h @@ -753,6 +753,7 @@ struct sched_group { unsigned int group_weight; struct sched_group_capacity *sgc; + struct sched_group_energy *sge; /* * The CPUs this group covers.