[RFC][PATCH 1/7] Initial power driver interface infrastructure

From: Morten Rasmussen
Date: Fri Oct 11 2013 - 13:21:24 EST


Infrastructure for power driver registration and defines three initial
power driver interface calls: go_faster(), go_slower(), and
at_max_capacity(). The intention is to use these to guide scheduling
decisions and frequency state selection in the power driver.

Signed-off-by: Morten Rasmussen <morten.rasmussen@xxxxxxx>
---
arch/arm/Kconfig | 4 +++
include/linux/sched/power.h | 32 ++++++++++++++++++++++++
kernel/sched/Makefile | 1 +
kernel/sched/power.c | 58 +++++++++++++++++++++++++++++++++++++++++++
4 files changed, 95 insertions(+)
create mode 100644 include/linux/sched/power.h
create mode 100644 kernel/sched/power.c

diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
index 43594d5..763d147 100644
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -1844,6 +1844,10 @@ config XEN
help
Say Y if you want to run Linux in a Virtual Machine on Xen on ARM.

+config SCHED_POWER
+ bool "(EXPERIMENTAL) Power aware scheduling"
+ default n
+
endmenu

menu "Boot options"
diff --git a/include/linux/sched/power.h b/include/linux/sched/power.h
new file mode 100644
index 0000000..cb2cf37
--- /dev/null
+++ b/include/linux/sched/power.h
@@ -0,0 +1,32 @@
+/*
+ * include/linux/sched/power.h
+ *
+ * Copyright (C) 2013 ARM Limited.
+ * Author: Morten Rasmussen <morten.rasmussen@xxxxxxx>
+ *
+ * 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 power_driver {
+
+ /*
+ * Power driver calls may happen from scheduler context with irq
+ * disabled and rq locks held. This must be taken into account in the
+ * power driver.
+ */
+
+ /* cpu already at max capacity? */
+ int (*at_max_capacity) (int cpu);
+ /* Increase cpu capacity hint */
+ int (*go_faster) (int cpu, int hint);
+ /* Decrease cpu capacity hint */
+ int (*go_slower) (int cpu, int hint);
+};
+
+int power_driver_register(struct power_driver *driver);
+int power_driver_unregister(struct power_driver *driver);
+#endif
diff --git a/kernel/sched/Makefile b/kernel/sched/Makefile
index 54adcf3..55727b4 100644
--- a/kernel/sched/Makefile
+++ b/kernel/sched/Makefile
@@ -17,3 +17,4 @@ obj-$(CONFIG_SCHED_AUTOGROUP) += auto_group.o
obj-$(CONFIG_SCHEDSTATS) += stats.o
obj-$(CONFIG_SCHED_DEBUG) += debug.o
obj-$(CONFIG_CGROUP_CPUACCT) += cpuacct.o
+obj-$(CONFIG_SCHED_POWER) += power.o
diff --git a/kernel/sched/power.c b/kernel/sched/power.c
new file mode 100644
index 0000000..b82965a
--- /dev/null
+++ b/kernel/sched/power.c
@@ -0,0 +1,58 @@
+/*
+ * kernel/sched/power.c
+ *
+ * Copyright (C) 2013 ARM Limited.
+ * Author: Morten Rasmussen <morten.rasmussen@xxxxxxx>
+ *
+ * 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.
+ *
+ */
+
+#include <linux/kernel.h>
+#include <linux/sched/power.h>
+
+static struct power_driver *power_driver;
+
+int power_driver_register(struct power_driver *driver)
+{
+ power_driver = driver;
+
+ return 1;
+}
+
+int power_driver_unregister(struct power_driver *driver)
+{
+ power_driver = NULL;
+
+ return 1;
+}
+
+int at_max_capacity(int cpu)
+{
+ /* Assume no performance scaling when no driver */
+ if (!power_driver)
+ return 1;
+
+ return power_driver->at_max_capacity(cpu);
+}
+
+int go_faster(int cpu, int hint)
+{
+ /* Assume no performance scaling when no driver */
+ if (!power_driver)
+ return 0;
+
+ return power_driver->go_faster(cpu, hint);
+}
+
+int go_slower(int cpu, int hint)
+{
+ /* Assume no performance scaling when no driver */
+ if (!power_driver)
+ return 0;
+
+ return power_driver->go_slower(cpu, hint);
+}
+
--
1.7.9.5


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/