From: "Rafael J. Wysocki" <rjw@rjwysocki.net>
To: Linux PM <linux-pm@vger.kernel.org>
Cc: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>,
LKML <linux-kernel@vger.kernel.org>,
Doug Smythies <dsmythies@telus.net>
Subject: [PATCH 3/4] cpufreq: intel_pstate: Add ->offline and ->online callbacks
Date: Thu, 20 Aug 2020 18:38:01 +0200 [thread overview]
Message-ID: <1879185.C8Vd3vmt8n@kreacher> (raw)
In-Reply-To: <2283366.Lr8yYYnyev@kreacher>
From: "Rafael J. Wysocki" <rafael.j.wysocki@intel.com>
Add ->offline and ->online driver callbacksto to do the cleanup
before taking a CPU offline and to restore its working configuration
when it goes back online, respectively, to avoid invoking the ->init
callback on every CPU online which is quite a bit of unnecessary
overhead.
Define ->offline and ->online so that they can be used in the
passive as well as in the active mode and because ->offline will
do the majority of ->stop_cpu work, the passive mode does not
need that callback any more, so drop it.
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
---
drivers/cpufreq/intel_pstate.c | 38 ++++++++++++++++++++++++++++------
1 file changed, 32 insertions(+), 6 deletions(-)
diff --git a/drivers/cpufreq/intel_pstate.c b/drivers/cpufreq/intel_pstate.c
index 3d18934fa975..aca0587b176f 100644
--- a/drivers/cpufreq/intel_pstate.c
+++ b/drivers/cpufreq/intel_pstate.c
@@ -2297,28 +2297,51 @@ static int intel_pstate_verify_policy(struct cpufreq_policy_data *policy)
return 0;
}
-static void intel_cpufreq_stop_cpu(struct cpufreq_policy *policy)
+static int intel_pstate_cpu_offline(struct cpufreq_policy *policy)
{
+ pr_debug("CPU %d going offline\n", policy->cpu);
+
+ intel_pstate_exit_perf_limits(policy);
+
+ /*
+ * If the CPU is an SMT thread and it goes offline with the performance
+ * settings different from the minimum, it will prevent its sibling
+ * from getting to lower performance levels, so force the minimum
+ * performance on CPU offline to prevent that form happening.
+ */
if (hwp_active)
intel_pstate_hwp_force_min_perf(policy->cpu);
else
intel_pstate_set_min_pstate(all_cpu_data[policy->cpu]);
+
+ return 0;
+}
+
+static int intel_pstate_cpu_online(struct cpufreq_policy *policy)
+{
+ pr_debug("CPU %d going online\n", policy->cpu);
+
+ intel_pstate_init_acpi_perf_limits(policy);
+
+ if (hwp_active)
+ wrmsrl_on_cpu(policy->cpu, MSR_HWP_REQUEST,
+ all_cpu_data[policy->cpu]->hwp_req_cached);
+
+ return 0;
}
static void intel_pstate_stop_cpu(struct cpufreq_policy *policy)
{
- pr_debug("CPU %d exiting\n", policy->cpu);
+ pr_debug("CPU %d stopping\n", policy->cpu);
intel_pstate_clear_update_util_hook(policy->cpu);
if (hwp_active)
intel_pstate_hwp_save_state(policy);
-
- intel_cpufreq_stop_cpu(policy);
}
static int intel_pstate_cpu_exit(struct cpufreq_policy *policy)
{
- intel_pstate_exit_perf_limits(policy);
+ pr_debug("CPU %d exiting\n", policy->cpu);
policy->fast_switch_possible = false;
@@ -2398,6 +2421,8 @@ static struct cpufreq_driver intel_pstate = {
.init = intel_pstate_cpu_init,
.exit = intel_pstate_cpu_exit,
.stop_cpu = intel_pstate_stop_cpu,
+ .offline = intel_pstate_cpu_offline,
+ .online = intel_pstate_cpu_online,
.update_limits = intel_pstate_update_limits,
.name = "intel_pstate",
};
@@ -2652,7 +2677,8 @@ static struct cpufreq_driver intel_cpufreq = {
.fast_switch = intel_cpufreq_fast_switch,
.init = intel_cpufreq_cpu_init,
.exit = intel_cpufreq_cpu_exit,
- .stop_cpu = intel_cpufreq_stop_cpu,
+ .offline = intel_pstate_cpu_offline,
+ .online = intel_pstate_cpu_online,
.update_limits = intel_pstate_update_limits,
.name = "intel_cpufreq",
};
--
2.26.2
next prev parent reply other threads:[~2020-08-20 16:39 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-08-20 16:35 [PATCH 0/4] cpufreq: intel_pstate: Address some HWP-related oddities Rafael J. Wysocki
2020-08-20 16:36 ` [PATCH 1/4] cpufreq: intel_pstate: Refuse to turn off with HWP enabled Rafael J. Wysocki
2020-08-20 16:37 ` [PATCH 2/4] cpufreq: intel_pstate: Always return last EPP value from sysfs Rafael J. Wysocki
2020-08-20 16:38 ` Rafael J. Wysocki [this message]
2020-08-22 0:47 ` [PATCH 3/4] cpufreq: intel_pstate: Add ->offline and ->online callbacks Doug Smythies
2020-08-24 13:40 ` [PATCH v2 " Rafael J. Wysocki
2020-08-20 16:38 ` [PATCH 4/4] cpufreq: intel_pstate: Free memory only when turning off Rafael J. Wysocki
2020-08-22 0:47 ` [PATCH 0/4] cpufreq: intel_pstate: Address some HWP-related oddities Doug Smythies
2020-08-24 14:06 ` Rafael J. Wysocki
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=1879185.C8Vd3vmt8n@kreacher \
--to=rjw@rjwysocki.net \
--cc=dsmythies@telus.net \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=srinivas.pandruvada@linux.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.