mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Morten Rasmussen <morten.rasmussen@arm.com>
To: mingo@kernel.org, peterz@infradead.org
Cc: arjan@linux.intel.com, vincent.guittot@linaro.org,
	preeti@linux.vnet.ibm.com, alex.shi@intel.com, efault@gmx.de,
	pjt@google.com, len.brown@intel.com, corbet@lwn.net,
	akpm@linux-foundation.org, torvalds@linux-foundation.org,
	tglx@linutronix.de, catalin.marinas@arm.com,
	linux-kernel@vger.kernel.org, linaro-kernel@lists.linaro.org,
	morten.rasmussen@arm.com
Subject: [RFC][PATCH 7/9] sched: power: Add power driver interface
Date: Tue,  9 Jul 2013 16:55:36 +0100	[thread overview]
Message-ID: <1373385338-12983-8-git-send-email-morten.rasmussen@arm.com> (raw)
In-Reply-To: <1373385338-12983-1-git-send-email-morten.rasmussen@arm.com>

Initial power driver interface. The unified power driver is to
replace freq and idle drivers and more. Currently only frequency
scaling interface is considered. The power scheduler may query the
power driver for information about current the state and provide
hints for state changes.

Signed-off-by: Morten Rasmussen <morten.rasmussen@arm.com>
CC: Ingo Molnar <mingo@kernel.org>
CC: Peter Zijlstra <peterz@infradead.org>
CC: Catalin Marinas <catalin.marinas@arm.com>
---
 include/linux/sched/power.h |   29 +++++++++++++++++++++++++++++
 kernel/sched/power.c        |   42 +++++++++++++++++++++++++++++++++++++++---
 2 files changed, 68 insertions(+), 3 deletions(-)
 create mode 100644 include/linux/sched/power.h

diff --git a/include/linux/sched/power.h b/include/linux/sched/power.h
new file mode 100644
index 0000000..ae11fec
--- /dev/null
+++ b/include/linux/sched/power.h
@@ -0,0 +1,29 @@
+/*
+ * include/linux/sched/power.h
+ *
+ * Copyright (C) 2013 ARM Limited.
+ * Author: Morten Rasmussen <morten.rasmussen@arm.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+#ifndef _LINUX_SCHED_POWER_H
+#define _LINUX_SCHED_POWER_H
+
+struct sched_power_driver {
+	/* performance scaling:
+	 * get_power returns the average performance (cpu_power) since last call
+	 * get_power_cap returns the max available performance state (cpu_power)
+	 * such that get_power_cap - get_power is the currently available
+	 * capacity.
+	 * req_power (optional) requests driver to change the performance state.
+	 */
+	unsigned long (*get_power)	(int cpu);
+	unsigned long (*get_power_cap)	(int cpu);
+	unsigned long (*req_power)	(int cpu, unsigned long cpu_power);
+};
+
+int sched_power_register_driver(struct sched_power_driver *driver);
+int sched_power_unregister_driver(struct sched_power_driver *driver);
+#endif
diff --git a/kernel/sched/power.c b/kernel/sched/power.c
index 1ff8e4a..9e44c0e 100644
--- a/kernel/sched/power.c
+++ b/kernel/sched/power.c
@@ -15,6 +15,7 @@
 #include <linux/percpu.h>
 #include <linux/workqueue.h>
 #include <linux/sched.h>
+#include <linux/sched/power.h>
 
 #include "sched.h"
 
@@ -30,6 +31,8 @@ struct power_domain {
 	struct cpumask span;
 	/* current max power supported by platform */
 	unsigned long arch_power;
+	/* current power reported by power driver */
+	unsigned long curr_power;
 	/* cpu power exposed to the scheduler (fair.c) */
 	unsigned long sched_power;
 	/* load ratio (load tracking) */
@@ -38,6 +41,7 @@ struct power_domain {
 };
 
 static struct power_domain power_hierarchy;
+static struct sched_power_driver *power_driver;
 
 DEFINE_PER_CPU(struct power_domain, *cpu_pds);
 
@@ -102,12 +106,26 @@ static void get_arch_cpu_power(void)
 	int i;
 
 	if (sched_feat(ARCH_POWER)) {
-		for_each_online_cpu(i)
+		for_each_online_cpu(i) {
 			cpu_pd(i)->arch_power =
 				arch_scale_freq_power(cpu_rq(i)->sd, i);
+			cpu_pd(i)->curr_power = cpu_pd(i)->arch_power;
+		}
 	} else {
-		for_each_online_cpu(i)
+		for_each_online_cpu(i) {
 			cpu_pd(i)->arch_power = SCHED_POWER_SCALE;
+			cpu_pd(i)->curr_power = cpu_pd(i)->arch_power;
+		}
+	}
+}
+
+static void get_driver_cpu_power(void)
+{
+	int i;
+
+	for_each_possible_cpu(i) {
+		cpu_pd(i)->arch_power = power_driver->get_power_cap(i);
+		cpu_pd(i)->curr_power = power_driver->get_power(i);
 	}
 }
 
@@ -167,7 +185,10 @@ static void __power_schedule(void)
 {
 	rcu_read_lock();
 
-	get_arch_cpu_power();
+	if (!power_driver)
+		get_arch_cpu_power();
+	else
+		get_driver_cpu_power();
 	update_cpu_load();
 	calculate_cpu_capacities();
 
@@ -236,6 +257,21 @@ void power_schedule_wq(struct work_struct *work)
 				msecs_to_jiffies(INTERVAL));
 }
 
+int sched_power_register_driver(struct sched_power_driver *driver)
+{
+	if (!driver->get_power || !driver->get_power_cap)
+		return -1;
+
+	power_driver = driver;
+	return 0;
+}
+
+int sched_power_unregister_driver(struct sched_power_driver *driver)
+{
+	power_driver = NULL;
+	return 0;
+}
+
 static int __init sched_power_init(void)
 {
 	init_power_hierarchy();
-- 
1.7.9.5



  parent reply	other threads:[~2013-07-09 15:56 UTC|newest]

Thread overview: 64+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-07-09 15:55 [RFC][PATCH 0/9] sched: Power scheduler design proposal Morten Rasmussen
2013-07-09 15:55 ` [RFC][PATCH 1/9] sched: Introduce power scheduler Morten Rasmussen
2013-07-09 16:48   ` Arjan van de Ven
2013-07-10  2:10   ` Arjan van de Ven
2013-07-10 11:11     ` Morten Rasmussen
2013-07-10 11:19       ` Vincent Guittot
2013-07-09 15:55 ` [RFC][PATCH 2/9] sched: Redirect update_cpu_power to sched/power.c Morten Rasmussen
2013-07-09 15:55 ` [RFC][PATCH 3/9] sched: Make select_idle_sibling() skip cpu with a cpu_power of 1 Morten Rasmussen
2013-07-09 15:55 ` [RFC][PATCH 4/9] sched: Make periodic load-balance disregard cpus " Morten Rasmussen
2013-07-09 15:55 ` [RFC][PATCH 5/9] sched: Make idle_balance() skip " Morten Rasmussen
2013-07-09 15:55 ` [RFC][PATCH 6/9] sched: power: add power_domain data structure Morten Rasmussen
2013-07-09 15:55 ` Morten Rasmussen [this message]
2013-07-09 15:55 ` [RFC][PATCH 8/9] sched: power: Add initial frequency scaling support to power scheduler Morten Rasmussen
2013-07-10 13:10   ` Arjan van de Ven
2013-07-12 12:51     ` Morten Rasmussen
2013-07-12 13:06       ` Catalin Marinas
2013-07-12 15:37       ` Arjan van de Ven
2013-07-09 15:55 ` [RFC][PATCH 9/9] sched: power: cpufreq: Initial schedpower cpufreq governor Morten Rasmussen
2013-07-09 16:58 ` [RFC][PATCH 0/9] sched: Power scheduler design proposal Arjan van de Ven
2013-07-10 11:16   ` Morten Rasmussen
2013-07-10 13:05     ` Arjan van de Ven
2013-07-12 12:46       ` Morten Rasmussen
2013-07-12 15:35         ` Arjan van de Ven
2013-07-12 13:00       ` Catalin Marinas
2013-07-12 15:44         ` Arjan van de Ven
2013-07-11 11:34   ` Preeti U Murthy
2013-07-12 13:48     ` Morten Rasmussen
2013-07-15  3:43       ` Preeti U Murthy
2013-07-15  9:55         ` Catalin Marinas
2013-07-15 15:24           ` Arjan van de Ven
2013-07-12 13:31   ` Catalin Marinas
2013-07-13  6:49 ` Peter Zijlstra
2013-07-13 10:23   ` Catalin Marinas
2013-07-15  7:53     ` Vincent Guittot
2013-07-15 20:39     ` Peter Zijlstra
2013-07-16 12:42       ` Catalin Marinas
2013-07-16 15:23         ` Arjan van de Ven
2013-07-17 14:14           ` Catalin Marinas
2013-07-24 13:50             ` Morten Rasmussen
2013-07-24 15:16               ` Arjan van de Ven
2013-07-24 16:46                 ` Morten Rasmussen
2013-07-24 16:48                   ` Arjan van de Ven
2013-07-25  8:00                     ` Morten Rasmussen
2013-07-13 14:40   ` Arjan van de Ven
2013-07-15 19:59     ` Peter Zijlstra
2013-07-15 20:37       ` Arjan van de Ven
2013-07-15 21:03         ` Peter Zijlstra
2013-07-15 22:46           ` Arjan van de Ven
2013-07-16 20:45             ` David Lang
2013-07-15 20:41       ` Arjan van de Ven
2013-07-15 21:06         ` Peter Zijlstra
2013-07-15 21:12           ` Peter Zijlstra
2013-07-15 22:52             ` Arjan van de Ven
2013-07-16 17:38               ` Peter Zijlstra
2013-07-16 18:44                 ` Arjan van de Ven
2013-07-16 19:21                   ` Peter Zijlstra
2013-07-16 19:57                     ` Arjan van de Ven
2013-07-16 20:17                       ` Peter Zijlstra
2013-07-16 20:21                         ` Arjan van de Ven
2013-07-16 20:32                         ` Arjan van de Ven
2013-07-15 22:46           ` Arjan van de Ven
2013-07-13 16:14   ` Arjan van de Ven
2013-07-15  2:05     ` Alex Shi
2013-07-24 13:16   ` Morten Rasmussen

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1373385338-12983-8-git-send-email-morten.rasmussen@arm.com \
    --to=morten.rasmussen@arm.com \
    --cc=akpm@linux-foundation.org \
    --cc=alex.shi@intel.com \
    --cc=arjan@linux.intel.com \
    --cc=catalin.marinas@arm.com \
    --cc=corbet@lwn.net \
    --cc=efault@gmx.de \
    --cc=len.brown@intel.com \
    --cc=linaro-kernel@lists.linaro.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@kernel.org \
    --cc=peterz@infradead.org \
    --cc=pjt@google.com \
    --cc=preeti@linux.vnet.ibm.com \
    --cc=tglx@linutronix.de \
    --cc=torvalds@linux-foundation.org \
    --cc=vincent.guittot@linaro.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®