From: Dominik Brodowski <linux@dominikbrodowski.de>
To: cpufreq@www.linux.org.uk, davej@redhat.com
Subject: [PATCH] cpufreq: 1/4 SMT awareness: save cpumask_t cpus
Date: Mon, 9 Aug 2004 21:54:26 +0200 [thread overview]
Message-ID: <20040809195426.GD9397@dominikbrodowski.de> (raw)
Save the "affected_cpu_map" used in SMT-aware drivers in struct
cpufreq_policy->(cpumask_t) cpus, and use it wherever possible. In
most cases, the ->get() function is only allowed to run on one CPU [the
one passed as argument] to keep code simpler, and as that code path
isn't executed often, and only root can do it anyway.
Signed-off-by: Dominik Brodowski <linux@brodo.de>
arch/i386/kernel/cpu/cpufreq/p4-clockmod.c | 28 ++++---------
arch/i386/kernel/cpu/cpufreq/speedstep-centrino.c | 2
arch/i386/kernel/cpu/cpufreq/speedstep-ich.c | 46 ++++++++--------------
drivers/cpufreq/cpufreq.c | 2
include/linux/cpufreq.h | 4 +
5 files changed, 33 insertions(+), 49 deletions(-)
diff -ruN linux-original/arch/i386/kernel/cpu/cpufreq/p4-clockmod.c linux/arch/i386/kernel/cpu/cpufreq/p4-clockmod.c
--- linux-original/arch/i386/kernel/cpu/cpufreq/p4-clockmod.c 2004-08-05 17:45:13.000000000 +0200
+++ linux/arch/i386/kernel/cpu/cpufreq/p4-clockmod.c 2004-08-06 21:53:14.344397920 +0200
@@ -110,7 +110,7 @@
{
unsigned int newstate = DC_RESV;
struct cpufreq_freqs freqs;
- cpumask_t cpus_allowed, affected_cpu_map;
+ cpumask_t cpus_allowed;
int i;
if (cpufreq_frequency_table_target(policy, &p4clockmod_table[0], target_freq, relation, &newstate))
@@ -122,18 +122,8 @@
if (freqs.new == freqs.old)
return 0;
- /* switch to physical CPU where state is to be changed*/
- cpus_allowed = current->cpus_allowed;
-
- /* only run on CPU to be set, or on its sibling */
-#ifdef CONFIG_SMP
- affected_cpu_map = cpu_sibling_map[policy->cpu];
-#else
- affected_cpu_map = cpumask_of_cpu(policy->cpu);
-#endif
-
/* notifiers */
- for_each_cpu_mask(i, affected_cpu_map) {
+ for_each_cpu_mask(i, policy->cpus) {
freqs.cpu = i;
cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE);
}
@@ -141,7 +131,9 @@
/* run on each logical CPU, see section 13.15.3 of IA32 Intel Architecture Software
* Developer's Manual, Volume 3
*/
- for_each_cpu_mask(i, affected_cpu_map) {
+ cpus_allowed = current->cpus_allowed;
+
+ for_each_cpu_mask(i, policy->cpus) {
cpumask_t this_cpu = cpumask_of_cpu(i);
set_cpus_allowed(current, this_cpu);
@@ -152,7 +144,7 @@
set_cpus_allowed(current, cpus_allowed);
/* notifiers */
- for_each_cpu_mask(i, affected_cpu_map) {
+ for_each_cpu_mask(i, policy->cpus) {
freqs.cpu = i;
cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);
}
@@ -260,14 +252,13 @@
static unsigned int cpufreq_p4_get(unsigned int cpu)
{
- cpumask_t cpus_allowed, affected_cpu_map;
+ cpumask_t cpus_allowed;
u32 l, h;
cpus_allowed = current->cpus_allowed;
- affected_cpu_map = cpumask_of_cpu(cpu);
- set_cpus_allowed(current, affected_cpu_map);
- BUG_ON(!cpu_isset(smp_processor_id(), affected_cpu_map));
+ set_cpus_allowed(current, cpumask_of_cpu(cpu));
+ BUG_ON(smp_processor_id() != cpu);
rdmsr(MSR_IA32_THERM_CONTROL, l, h);
@@ -335,4 +326,3 @@
late_initcall(cpufreq_p4_init);
module_exit(cpufreq_p4_exit);
-
diff -ruN linux-original/arch/i386/kernel/cpu/cpufreq/speedstep-centrino.c linux/arch/i386/kernel/cpu/cpufreq/speedstep-centrino.c
--- linux-original/arch/i386/kernel/cpu/cpufreq/speedstep-centrino.c 2004-08-05 17:45:13.000000000 +0200
+++ linux/arch/i386/kernel/cpu/cpufreq/speedstep-centrino.c 2004-08-06 21:50:57.061268128 +0200
@@ -564,7 +564,7 @@
* Make sure we are running on the CPU that wants to change frequency
*/
saved_mask = current->cpus_allowed;
- set_cpus_allowed(current, cpumask_of_cpu(policy->cpu));
+ set_cpus_allowed(current, policy->cpus);
if (smp_processor_id() != policy->cpu) {
return(-EAGAIN);
}
diff -ruN linux-original/arch/i386/kernel/cpu/cpufreq/speedstep-ich.c linux/arch/i386/kernel/cpu/cpufreq/speedstep-ich.c
--- linux-original/arch/i386/kernel/cpu/cpufreq/speedstep-ich.c 2004-08-05 17:45:13.000000000 +0200
+++ linux/arch/i386/kernel/cpu/cpufreq/speedstep-ich.c 2004-08-06 21:50:57.062267976 +0200
@@ -223,24 +223,23 @@
return 0;
}
-static unsigned int speedstep_get(unsigned int cpu)
+static unsigned int _speedstep_get(cpumask_t cpus)
{
unsigned int speed;
- cpumask_t cpus_allowed,affected_cpu_map;
+ cpumask_t cpus_allowed;
- /* only run on CPU to be set, or on its sibling */
cpus_allowed = current->cpus_allowed;
-#ifdef CONFIG_SMP
- affected_cpu_map = cpu_sibling_map[cpu];
-#else
- affected_cpu_map = cpumask_of_cpu(cpu);
-#endif
- set_cpus_allowed(current, affected_cpu_map);
- speed=speedstep_get_processor_frequency(speedstep_processor);
+ set_cpus_allowed(current, cpus);
+ speed = speedstep_get_processor_frequency(speedstep_processor);
set_cpus_allowed(current, cpus_allowed);
return speed;
}
+static unsigned int speedstep_get(unsigned int cpu)
+{
+ return _speedstep_get(cpumask_of_cpu(cpu));
+}
+
/**
* speedstep_target - set a new CPUFreq policy
* @policy: new policy
@@ -255,13 +254,13 @@
{
unsigned int newstate = 0;
struct cpufreq_freqs freqs;
- cpumask_t cpus_allowed, affected_cpu_map;
+ cpumask_t cpus_allowed;
int i;
if (cpufreq_frequency_table_target(policy, &speedstep_freqs[0], target_freq, relation, &newstate))
return -EINVAL;
- freqs.old = speedstep_get(policy->cpu);
+ freqs.old = _speedstep_get(policy->cpus);
freqs.new = speedstep_freqs[newstate].frequency;
freqs.cpu = policy->cpu;
@@ -271,27 +270,20 @@
cpus_allowed = current->cpus_allowed;
- /* only run on CPU to be set, or on its sibling */
-#ifdef CONFIG_SMP
- affected_cpu_map = cpu_sibling_map[policy->cpu];
-#else
- affected_cpu_map = cpumask_of_cpu(policy->cpu);
-#endif
-
- for_each_cpu_mask(i, affected_cpu_map) {
+ for_each_cpu_mask(i, policy->cpus) {
freqs.cpu = i;
cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE);
}
/* switch to physical CPU where state is to be changed */
- set_cpus_allowed(current, affected_cpu_map);
+ set_cpus_allowed(current, policy->cpus);
speedstep_set_state(newstate);
/* allow to be run on all CPUs */
set_cpus_allowed(current, cpus_allowed);
- for_each_cpu_mask(i, affected_cpu_map) {
+ for_each_cpu_mask(i, policy->cpus) {
freqs.cpu = i;
cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);
}
@@ -317,7 +309,7 @@
{
int result = 0;
unsigned int speed;
- cpumask_t cpus_allowed,affected_cpu_map;
+ cpumask_t cpus_allowed;
/* capability check */
@@ -327,11 +319,9 @@
/* only run on CPU to be set, or on its sibling */
cpus_allowed = current->cpus_allowed;
#ifdef CONFIG_SMP
- affected_cpu_map = cpu_sibling_map[policy->cpu];
-#else
- affected_cpu_map = cpumask_of_cpu(policy->cpu);
+ policy->cpus = cpu_sibling_map[policy->cpu];
#endif
- set_cpus_allowed(current, affected_cpu_map);
+ set_cpus_allowed(current, policy->cpus);
/* detect low and high frequency */
result = speedstep_get_freqs(speedstep_processor,
@@ -343,7 +333,7 @@
return result;
/* get current speed setting */
- speed = speedstep_get(policy->cpu);
+ speed = _speedstep_get(policy->cpus);
if (!speed)
return -EIO;
diff -ruN linux-original/drivers/cpufreq/cpufreq.c linux/drivers/cpufreq/cpufreq.c
--- linux-original/drivers/cpufreq/cpufreq.c 2004-08-05 17:41:41.000000000 +0200
+++ linux/drivers/cpufreq/cpufreq.c 2004-08-06 21:50:57.063267824 +0200
@@ -471,6 +471,8 @@
memset(policy, 0, sizeof(struct cpufreq_policy));
policy->cpu = cpu;
+ policy->cpus = cpumask_of_cpu(cpu);
+
init_MUTEX_LOCKED(&policy->lock);
init_completion(&policy->kobj_unregister);
INIT_WORK(&policy->update, handle_update, (void *)(long)cpu);
diff -ruN linux-original/include/linux/cpufreq.h linux/include/linux/cpufreq.h
--- linux-original/include/linux/cpufreq.h 2004-08-05 17:41:50.000000000 +0200
+++ linux/include/linux/cpufreq.h 2004-08-06 21:50:57.076265848 +0200
@@ -22,6 +22,7 @@
#include <linux/sysfs.h>
#include <linux/completion.h>
#include <linux/workqueue.h>
+#include <linux/cpumask.h>
#define CPUFREQ_NAME_LEN 16
@@ -69,7 +70,8 @@
};
struct cpufreq_policy {
- unsigned int cpu; /* cpu nr */
+ cpumask_t cpus; /* affected CPUs */
+ unsigned int cpu; /* cpu nr of registered CPU */
struct cpufreq_cpuinfo cpuinfo;/* see above */
unsigned int min; /* in kHz */
next reply other threads:[~2004-08-09 19:54 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2004-08-09 19:54 Dominik Brodowski [this message]
2004-08-09 20:20 ` [RFC][CFT] Re: [PATCH] cpufreq: SMT awareness Dominik Brodowski
2004-08-14 20:47 ` [PATCH] cpufreq: 1/4 SMT awareness: save cpumask_t cpus Zwane Mwaikambo
-- strict thread matches above, loose matches on Subject: below --
2004-08-18 16:46 Pallipadi, Venkatesh
2004-08-20 5:35 ` Zwane Mwaikambo
2004-08-29 13:01 ` Dominik Brodowski
2004-08-30 16:45 ` Zwane Mwaikambo
2004-08-30 20:04 ` Dominik Brodowski
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=20040809195426.GD9397@dominikbrodowski.de \
--to=linux@dominikbrodowski.de \
--cc=cpufreq@www.linux.org.uk \
--cc=davej@redhat.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox