From patchwork Fri May 23 18:16:34 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Morten Rasmussen X-Patchwork-Id: 30852 Return-Path: X-Original-To: linaro@patches.linaro.org Delivered-To: linaro@patches.linaro.org Received: from mail-ig0-f200.google.com (mail-ig0-f200.google.com [209.85.213.200]) by ip-10-151-82-157.ec2.internal (Postfix) with ESMTPS id 4061120369 for ; Fri, 23 May 2014 18:20:08 +0000 (UTC) Received: by mail-ig0-f200.google.com with SMTP id uy17sf2958246igb.3 for ; Fri, 23 May 2014 11:20:07 -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=ApK7RCH6c7CFwzPX9W6hLiNODvQilG4TqzNzvPHEyC4=; b=kZA2UW80VcSwBptUqD1KLxjtRS3sJHjlSCVuoIGphRyjnu7hpxg6GNyTqaM1bJ93Jy 9HRlAWYh56rXvY3WtNTSV2aSgPWhlC4IsPtWA2O73ELsMlO01zjh6khGmovL+MluGxvP pW8XSrBGcijEhZ1Cz4+kVNENelgZppF0sAxpy9h63ycoTDT9dyVhnHBmWB34/A1u83ZP UnCrRzP3yQULuvUzU2sobw2uKgjcci1XoqqNRwKY3V6rYfr/vQv6D9lHlporyLOxEngj 5C9JDJrTKE9DdqhAz/9elzcpUIGGzQx2KuCvJ+tzJW89DLd4tuEKvtWI90kpuDpG/1Nj DraA== X-Gm-Message-State: ALoCoQmjeRyYfCIAZ3QrTEdbw85k44dSpN5EHcxKLwHR002eLPkLHqfcQTrhYPP/l/TkwAsIlFsw X-Received: by 10.42.235.144 with SMTP id kg16mr2528320icb.33.1400869207717; Fri, 23 May 2014 11:20:07 -0700 (PDT) MIME-Version: 1.0 X-BeenThere: patchwork-forward@linaro.org Received: by 10.140.36.14 with SMTP id o14ls1773223qgo.63.gmail; Fri, 23 May 2014 11:20:07 -0700 (PDT) X-Received: by 10.58.119.167 with SMTP id kv7mr58772veb.78.1400869207554; Fri, 23 May 2014 11:20:07 -0700 (PDT) Received: from mail-vc0-f177.google.com (mail-vc0-f177.google.com [209.85.220.177]) by mx.google.com with ESMTPS id aq3si2127611vdc.7.2014.05.23.11.20.07 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Fri, 23 May 2014 11:20:07 -0700 (PDT) Received-SPF: pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.220.177 as permitted sender) client-ip=209.85.220.177; Received: by mail-vc0-f177.google.com with SMTP id hq11so900964vcb.36 for ; Fri, 23 May 2014 11:20:07 -0700 (PDT) X-Received: by 10.58.34.72 with SMTP id x8mr78780vei.61.1400869207473; Fri, 23 May 2014 11:20:07 -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.220.221.72 with SMTP id ib8csp52458vcb; Fri, 23 May 2014 11:20:07 -0700 (PDT) X-Received: by 10.66.150.228 with SMTP id ul4mr8465055pab.16.1400869206682; Fri, 23 May 2014 11:20:06 -0700 (PDT) Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id yh2si4942270pbb.130.2014.05.23.11.20.06; Fri, 23 May 2014 11:20:06 -0700 (PDT) Received-SPF: none (google.com: linux-pm-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 S1751473AbaEWST6 (ORCPT + 12 others); Fri, 23 May 2014 14:19:58 -0400 Received: from service87.mimecast.com ([91.220.42.44]:36102 "EHLO service87.mimecast.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751397AbaEWSQx (ORCPT ); Fri, 23 May 2014 14:16:53 -0400 Received: from cam-owa2.Emea.Arm.com (fw-tnat.cambridge.arm.com [217.140.96.21]) by service87.mimecast.com; Fri, 23 May 2014 19:16:51 +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); Fri, 23 May 2014 19:16:50 +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 Subject: [RFC PATCH 07/16] sched: Introduce system-wide sched_energy Date: Fri, 23 May 2014 19:16:34 +0100 Message-Id: <1400869003-27769-8-git-send-email-morten.rasmussen@arm.com> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1400869003-27769-1-git-send-email-morten.rasmussen@arm.com> References: <1400869003-27769-1-git-send-email-morten.rasmussen@arm.com> X-OriginalArrivalTime: 23 May 2014 18:16:50.0932 (UTC) FILETIME=[2AFA8B40:01CF76B3] X-MC-Unique: 114052319165102701 Sender: linux-pm-owner@vger.kernel.org Precedence: list List-ID: X-Mailing-List: linux-pm@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.220.177 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 Energy-aware algorithm needs system wide sched energy information on certain platforms (e.g. a one socket system with multiple cpus). In such a system, the sched energy data is only attached to the sched groups for the individual cpus in the sched domain MC level. For those systems, this patch adds a _hack_ to provide system-wide sched energy data via the sched_domain_topology_level table. The problem is that the sched_domain_topology_level table is not an interface to provide system-wide data but we want to keep the configuration of all sched energy related data in one place. The sched_domain_energy_f of the last entry (the one which is initialized with {NULL, }) of the sched_domain_topology_level table is set to cpu_sys_energy(). Since the sched_domain_mask_f of this entry stays NULL it is still not considered for the existing scheduler set-up code (see for_each_sd_topology()). A second call to init_sched_energy() with a struct sched_domain pointer equal NULL as an argument will initialize the system-wide sched energy structure sse. For the example platform (ARM TC2 (MC and DIE sd level)), the system-wide sched_domain_energy_f returns NULL, so struct sched_energy *sse stays NULL. Signed-off-by: Dietmar Eggemann --- arch/arm/kernel/topology.c | 8 +++++++- kernel/sched/core.c | 26 ++++++++++++++++++++++---- kernel/sched/sched.h | 2 ++ 3 files changed, 31 insertions(+), 5 deletions(-) diff --git a/arch/arm/kernel/topology.c b/arch/arm/kernel/topology.c index 4050348..0b9c1e0 100644 --- a/arch/arm/kernel/topology.c +++ b/arch/arm/kernel/topology.c @@ -374,6 +374,11 @@ static inline const struct sched_energy *cpu_core_energy(int cpu) return cpu_topology[cpu].socket_id ? &energy_core_a7 : &energy_core_a15; } + +static inline const struct sched_energy *cpu_sys_energy(int cpu) +{ + return NULL; +} #endif /* CONFIG_SCHED_ENERGY */ static inline const int cpu_corepower_flags(void) @@ -392,10 +397,11 @@ static struct sched_domain_topology_level arm_topology[] = { #endif #ifdef CONFIG_SCHED_ENERGY { cpu_cpu_mask, 0, cpu_cluster_energy, SD_INIT_NAME(DIE) }, + { NULL, 0, cpu_sys_energy}, #else { cpu_cpu_mask, SD_INIT_NAME(DIE) }, + { NULL, }, #endif - { NULL, }, }; /* diff --git a/kernel/sched/core.c b/kernel/sched/core.c index 096fa55..530a348 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -5866,20 +5866,35 @@ static void init_sched_groups_power(int cpu, struct sched_domain *sd) } #ifdef CONFIG_SCHED_ENERGY +/* System-wide energy information. */ +struct sched_energy *sse; + static void init_sched_energy(int cpu, struct sched_domain *sd, struct sched_domain_topology_level *tl) { - struct sched_group *sg = sd->groups; - struct sched_energy *energy = &sg->sge->data; + struct sched_group *sg = sd ? sd->groups : NULL; + struct sched_energy *energy = sd ? &sg->sge->data : sse; sched_domain_energy_f fn = tl->energy; - struct cpumask *mask = sched_group_cpus(sg); + const struct cpumask *mask = sd ? sched_group_cpus(sg) : + cpu_cpu_mask(cpu); - if (!fn || !fn(cpu)) + if (!fn || !fn(cpu) || (!sd && energy)) return; if (cpumask_weight(mask) > 1) check_sched_energy_data(cpu, fn, mask); + if (!sd) { + energy = sse = kzalloc_node(sizeof(struct sched_energy) + + fn(cpu)->nr_cap_states* + sizeof(struct capacity_state), + GFP_KERNEL, cpu_to_node(cpu)); + BUG_ON(!energy); + + energy->cap_states = (struct capacity_state *)((void *)energy + + sizeof(struct sched_energy)); + } + energy->max_capacity = fn(cpu)->max_capacity; energy->idle_power = fn(cpu)->idle_power; energy->wakeup_energy = fn(cpu)->wakeup_energy; @@ -6579,6 +6594,9 @@ static int build_sched_domains(const struct cpumask *cpu_map, claim_allocations(i, sd); init_sched_groups_power(i, sd); } +#ifdef CONFIG_SCHED_ENERGY + init_sched_energy(i, NULL, tl); +#endif } /* Attach the domains */ diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h index 6726437..9ff67a7 100644 --- a/kernel/sched/sched.h +++ b/kernel/sched/sched.h @@ -760,6 +760,8 @@ struct sched_group_energy { atomic_t ref; struct sched_energy data; }; + +extern struct sched_energy *sse; #endif struct sched_group {