All of lore.kernel.org
 help / color / mirror / Atom feed
From: Lukasz Luba <lukasz.luba@arm.com>
To: linux-kernel@vger.kernel.org, linux-pm@vger.kernel.org,
	rafael@kernel.org
Cc: lukasz.luba@arm.com, dietmar.eggemann@arm.com,
	rui.zhang@intel.com, amit.kucheria@verdurent.com,
	amit.kachhap@gmail.com, daniel.lezcano@linaro.org,
	viresh.kumar@linaro.org, len.brown@intel.com, pavel@ucw.cz,
	mhiramat@kernel.org, qyousef@layalina.io, wvw@google.com,
	xuewen.yan94@gmail.com
Subject: [PATCH v8 07/23] PM: EM: Split the allocation and initialization of the EM table
Date: Thu,  8 Feb 2024 11:55:41 +0000	[thread overview]
Message-ID: <20240208115557.1273962-8-lukasz.luba@arm.com> (raw)
In-Reply-To: <20240208115557.1273962-1-lukasz.luba@arm.com>

Split the process of allocation and data initialization for the EM table.
The upcoming changes for modifiable EM will use it.

This change is not expected to alter the general functionality.

Reviewed-by: Dietmar Eggemann <dietmar.eggemann@arm.com>
Tested-by: Dietmar Eggemann <dietmar.eggemann@arm.com>
Signed-off-by: Lukasz Luba <lukasz.luba@arm.com>
---
 kernel/power/energy_model.c | 55 ++++++++++++++++++++++---------------
 1 file changed, 33 insertions(+), 22 deletions(-)

diff --git a/kernel/power/energy_model.c b/kernel/power/energy_model.c
index 21d761223255..7468fa92134b 100644
--- a/kernel/power/energy_model.c
+++ b/kernel/power/energy_model.c
@@ -142,18 +142,26 @@ static int em_compute_costs(struct device *dev, struct em_perf_state *table,
 	return 0;
 }
 
+static int em_allocate_perf_table(struct em_perf_domain *pd,
+				  int nr_states)
+{
+	pd->table = kcalloc(nr_states, sizeof(struct em_perf_state),
+			    GFP_KERNEL);
+	if (!pd->table)
+		return -ENOMEM;
+
+	return 0;
+}
+
 static int em_create_perf_table(struct device *dev, struct em_perf_domain *pd,
-				int nr_states, struct em_data_callback *cb,
+				struct em_perf_state *table,
+				struct em_data_callback *cb,
 				unsigned long flags)
 {
 	unsigned long power, freq, prev_freq = 0;
-	struct em_perf_state *table;
+	int nr_states = pd->nr_perf_states;
 	int i, ret;
 
-	table = kcalloc(nr_states, sizeof(*table), GFP_KERNEL);
-	if (!table)
-		return -ENOMEM;
-
 	/* Build the list of performance states for this performance domain */
 	for (i = 0, freq = 0; i < nr_states; i++, freq++) {
 		/*
@@ -165,7 +173,7 @@ static int em_create_perf_table(struct device *dev, struct em_perf_domain *pd,
 		if (ret) {
 			dev_err(dev, "EM: invalid perf. state: %d\n",
 				ret);
-			goto free_ps_table;
+			return -EINVAL;
 		}
 
 		/*
@@ -175,7 +183,7 @@ static int em_create_perf_table(struct device *dev, struct em_perf_domain *pd,
 		if (freq <= prev_freq) {
 			dev_err(dev, "EM: non-increasing freq: %lu\n",
 				freq);
-			goto free_ps_table;
+			return -EINVAL;
 		}
 
 		/*
@@ -185,7 +193,7 @@ static int em_create_perf_table(struct device *dev, struct em_perf_domain *pd,
 		if (!power || power > EM_MAX_POWER) {
 			dev_err(dev, "EM: invalid power: %lu\n",
 				power);
-			goto free_ps_table;
+			return -EINVAL;
 		}
 
 		table[i].power = power;
@@ -194,16 +202,9 @@ static int em_create_perf_table(struct device *dev, struct em_perf_domain *pd,
 
 	ret = em_compute_costs(dev, table, cb, nr_states, flags);
 	if (ret)
-		goto free_ps_table;
-
-	pd->table = table;
-	pd->nr_perf_states = nr_states;
+		return -EINVAL;
 
 	return 0;
-
-free_ps_table:
-	kfree(table);
-	return -EINVAL;
 }
 
 static int em_create_pd(struct device *dev, int nr_states,
@@ -234,11 +235,15 @@ static int em_create_pd(struct device *dev, int nr_states,
 			return -ENOMEM;
 	}
 
-	ret = em_create_perf_table(dev, pd, nr_states, cb, flags);
-	if (ret) {
-		kfree(pd);
-		return ret;
-	}
+	pd->nr_perf_states = nr_states;
+
+	ret = em_allocate_perf_table(pd, nr_states);
+	if (ret)
+		goto free_pd;
+
+	ret = em_create_perf_table(dev, pd, pd->table, cb, flags);
+	if (ret)
+		goto free_pd_table;
 
 	if (_is_cpu_device(dev))
 		for_each_cpu(cpu, cpus) {
@@ -249,6 +254,12 @@ static int em_create_pd(struct device *dev, int nr_states,
 	dev->em_pd = pd;
 
 	return 0;
+
+free_pd_table:
+	kfree(pd->table);
+free_pd:
+	kfree(pd);
+	return -EINVAL;
 }
 
 static void
-- 
2.25.1


  parent reply	other threads:[~2024-02-08 11:56 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-02-08 11:55 [PATCH v8 00/23] Introduce runtime modifiable Energy Model Lukasz Luba
2024-02-08 11:55 ` [PATCH v8 01/23] PM: EM: Add missing newline for the message log Lukasz Luba
2024-02-08 11:55 ` [PATCH v8 02/23] PM: EM: Extend em_cpufreq_update_efficiencies() argument list Lukasz Luba
2024-02-08 11:55 ` [PATCH v8 03/23] PM: EM: Find first CPU active while updating OPP efficiency Lukasz Luba
2024-02-08 11:55 ` [PATCH v8 04/23] PM: EM: Refactor em_pd_get_efficient_state() to be more flexible Lukasz Luba
2024-02-08 11:55 ` [PATCH v8 05/23] PM: EM: Introduce em_compute_costs() Lukasz Luba
2024-02-08 11:55 ` [PATCH v8 06/23] PM: EM: Check if the get_cost() callback is present in em_compute_costs() Lukasz Luba
2024-02-08 11:55 ` Lukasz Luba [this message]
2024-02-08 11:55 ` [PATCH v8 08/23] PM: EM: Introduce runtime modifiable table Lukasz Luba
2024-02-08 11:55 ` [PATCH v8 09/23] PM: EM: Use runtime modified EM for CPUs energy estimation in EAS Lukasz Luba
2024-02-08 11:55 ` [PATCH v8 10/23] PM: EM: Add functions for memory allocations for new EM tables Lukasz Luba
2024-02-08 11:55 ` [PATCH v8 11/23] PM: EM: Introduce em_dev_update_perf_domain() for EM updates Lukasz Luba
2024-02-08 11:55 ` [PATCH v8 12/23] PM: EM: Add em_perf_state_from_pd() to get performance states table Lukasz Luba
2024-02-08 11:55 ` [PATCH v8 13/23] PM: EM: Add performance field to struct em_perf_state and optimize Lukasz Luba
2024-02-08 11:55 ` [PATCH v8 14/23] PM: EM: Support late CPUs booting and capacity adjustment Lukasz Luba
2024-02-08 11:55 ` [PATCH v8 15/23] PM: EM: Optimize em_cpu_energy() and remove division Lukasz Luba
2024-02-08 11:55 ` [PATCH v8 16/23] powercap/dtpm_cpu: Use new Energy Model interface to get table Lukasz Luba
2024-02-08 11:55 ` [PATCH v8 17/23] powercap/dtpm_devfreq: " Lukasz Luba
2024-02-08 11:55 ` [PATCH v8 18/23] drivers/thermal/cpufreq_cooling: Use new Energy Model interface Lukasz Luba
2024-02-08 11:55 ` [PATCH v8 19/23] drivers/thermal/devfreq_cooling: " Lukasz Luba
2024-02-08 11:55 ` [PATCH v8 20/23] PM: EM: Change debugfs configuration to use runtime EM table data Lukasz Luba
2024-02-08 11:55 ` [PATCH v8 21/23] PM: EM: Remove old table Lukasz Luba
2024-02-08 11:55 ` [PATCH v8 22/23] PM: EM: Add em_dev_compute_costs() Lukasz Luba
2024-02-08 11:55 ` [PATCH v8 23/23] Documentation: EM: Update with runtime modification design Lukasz Luba
2024-02-08 14:01 ` [PATCH v8 00/23] Introduce runtime modifiable Energy Model Rafael J. Wysocki
2024-02-08 15:00   ` Lukasz Luba

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=20240208115557.1273962-8-lukasz.luba@arm.com \
    --to=lukasz.luba@arm.com \
    --cc=amit.kachhap@gmail.com \
    --cc=amit.kucheria@verdurent.com \
    --cc=daniel.lezcano@linaro.org \
    --cc=dietmar.eggemann@arm.com \
    --cc=len.brown@intel.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pm@vger.kernel.org \
    --cc=mhiramat@kernel.org \
    --cc=pavel@ucw.cz \
    --cc=qyousef@layalina.io \
    --cc=rafael@kernel.org \
    --cc=rui.zhang@intel.com \
    --cc=viresh.kumar@linaro.org \
    --cc=wvw@google.com \
    --cc=xuewen.yan94@gmail.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.