All of lore.kernel.org
 help / color / mirror / Atom feed
From: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
To: rui.zhang@intel.com, rafael@kernel.org, daniel.lezcano@linaro.org
Cc: amitk@kernel.org, linux-kernel@vger.kernel.org,
	linux-pm@vger.kernel.org,
	Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
Subject: [PATCH 2/4] powercap: idle_inject: Add begin/end callbacks
Date: Mon,  7 Nov 2022 19:03:40 -0800	[thread overview]
Message-ID: <20221108030342.1127216-3-srinivas.pandruvada@linux.intel.com> (raw)
In-Reply-To: <20221108030342.1127216-1-srinivas.pandruvada@linux.intel.com>

The actual CPU Idle percent can be different than what can be observed
from the hardware. Since the objective for CPU Idle injection is for
thermal control, the idle percent observed by the hardware is more
relevant.

To account for hardware feedback the actual runtime/idle time should be
adjusted.

Add a capability to register a begin and end callback during call to
idle_inject_register(). If they are not NULL, then begin callback is
called before calling play_idle_precise() and end callback is called
after play_idle_precise().

If begin callback is present and returns non 0 value then
play_idle_precise() is not called as it means there is some over
compensation.

Signed-off-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
---
 drivers/powercap/idle_inject.c    | 19 ++++++++++++++++++-
 drivers/thermal/cpuidle_cooling.c |  2 +-
 include/linux/idle_inject.h       |  4 +++-
 3 files changed, 22 insertions(+), 3 deletions(-)

diff --git a/drivers/powercap/idle_inject.c b/drivers/powercap/idle_inject.c
index e73885bd9065..14968b0ff133 100644
--- a/drivers/powercap/idle_inject.c
+++ b/drivers/powercap/idle_inject.c
@@ -70,6 +70,8 @@ struct idle_inject_device {
 	unsigned int idle_duration_us;
 	unsigned int run_duration_us;
 	unsigned int latency_us;
+	int (*idle_inject_begin)(unsigned int cpu);
+	void (*idle_inject_end)(unsigned int cpu);
 	unsigned long cpumask[];
 };
 
@@ -132,6 +134,7 @@ static void idle_inject_fn(unsigned int cpu)
 {
 	struct idle_inject_device *ii_dev;
 	struct idle_inject_thread *iit;
+	int ret;
 
 	ii_dev = per_cpu(idle_inject_device, cpu);
 	iit = per_cpu_ptr(&idle_inject_thread, cpu);
@@ -141,8 +144,18 @@ static void idle_inject_fn(unsigned int cpu)
 	 */
 	iit->should_run = 0;
 
+	if (ii_dev->idle_inject_begin) {
+		ret = ii_dev->idle_inject_begin(cpu);
+		if (ret)
+			goto skip;
+	}
+
 	play_idle_precise(READ_ONCE(ii_dev->idle_duration_us) * NSEC_PER_USEC,
 			  READ_ONCE(ii_dev->latency_us) * NSEC_PER_USEC);
+
+skip:
+	if (ii_dev->idle_inject_end)
+		ii_dev->idle_inject_end(cpu);
 }
 
 /**
@@ -302,7 +315,9 @@ static int idle_inject_should_run(unsigned int cpu)
  * Return: NULL if memory allocation fails, idle injection control device
  * pointer on success.
  */
-struct idle_inject_device *idle_inject_register(struct cpumask *cpumask)
+struct idle_inject_device *idle_inject_register(struct cpumask *cpumask,
+						int (*idle_inject_begin)(unsigned int cpu),
+						void (*idle_inject_end)(unsigned int cpu))
 {
 	struct idle_inject_device *ii_dev;
 	int cpu, cpu_rb;
@@ -315,6 +330,8 @@ struct idle_inject_device *idle_inject_register(struct cpumask *cpumask)
 	hrtimer_init(&ii_dev->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
 	ii_dev->timer.function = idle_inject_timer_fn;
 	ii_dev->latency_us = UINT_MAX;
+	ii_dev->idle_inject_begin = idle_inject_begin;
+	ii_dev->idle_inject_end = idle_inject_end;
 
 	for_each_cpu(cpu, to_cpumask(ii_dev->cpumask)) {
 
diff --git a/drivers/thermal/cpuidle_cooling.c b/drivers/thermal/cpuidle_cooling.c
index 4f41102e8b16..e8b35b3b5767 100644
--- a/drivers/thermal/cpuidle_cooling.c
+++ b/drivers/thermal/cpuidle_cooling.c
@@ -184,7 +184,7 @@ static int __cpuidle_cooling_register(struct device_node *np,
 		goto out;
 	}
 
-	ii_dev = idle_inject_register(drv->cpumask);
+	ii_dev = idle_inject_register(drv->cpumask, NULL, NULL);
 	if (!ii_dev) {
 		ret = -EINVAL;
 		goto out_kfree;
diff --git a/include/linux/idle_inject.h b/include/linux/idle_inject.h
index fb88e23a99d3..73f3414fafe2 100644
--- a/include/linux/idle_inject.h
+++ b/include/linux/idle_inject.h
@@ -11,7 +11,9 @@
 /* private idle injection device structure */
 struct idle_inject_device;
 
-struct idle_inject_device *idle_inject_register(struct cpumask *cpumask);
+struct idle_inject_device *idle_inject_register(struct cpumask *cpumask,
+						int (*idle_inject_begin)(unsigned int cpu),
+						void (*idle_inject_end)(unsigned int cpu));
 
 void idle_inject_unregister(struct idle_inject_device *ii_dev);
 
-- 
2.37.3


  parent reply	other threads:[~2022-11-08  3:04 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-11-08  3:03 [PATCH 0/4] Per CPU idle injection Srinivas Pandruvada
2022-11-08  3:03 ` [PATCH 1/4] powercap: idle_inject: Export symbols Srinivas Pandruvada
2022-11-08  3:03 ` Srinivas Pandruvada [this message]
2022-11-09 14:48   ` [PATCH 2/4] powercap: idle_inject: Add begin/end callbacks Rafael J. Wysocki
2022-11-10 23:13     ` srinivas pandruvada
2022-11-08  3:03 ` [PATCH 3/4] thermal/drivers/intel_powerclamp: Use powercap idle-inject framework Srinivas Pandruvada
2022-11-08 12:44   ` kernel test robot
2022-11-08  3:03 ` [PATCH 4/4] thermal/drivers/intel_cpu_idle_cooling: Introduce Intel cpu idle cooling driver Srinivas Pandruvada
2022-11-08  9:42   ` kernel test robot
2022-11-08 12:14   ` kernel test robot

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=20221108030342.1127216-3-srinivas.pandruvada@linux.intel.com \
    --to=srinivas.pandruvada@linux.intel.com \
    --cc=amitk@kernel.org \
    --cc=daniel.lezcano@linaro.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pm@vger.kernel.org \
    --cc=rafael@kernel.org \
    --cc=rui.zhang@intel.com \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.