public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] x86: clean up speedctep-centrino and reduce cpumask_t usage
@ 2008-09-30 23:01 Rusty Russell
  2008-10-01  6:44 ` Ingo Molnar
  0 siblings, 1 reply; 3+ messages in thread
From: Rusty Russell @ 2008-09-30 23:01 UTC (permalink / raw)
  To: Ingo Molnar; +Cc: Jeremy Fitzhardinge, linux-kernel, Mike Travis

1) The #ifdef CONFIG_HOTPLUG_CPU seems unnecessary these days.
2) The loop can simply skip over offline cpus, rather than creating a tmp mask.
3) set_mask is set to either a single cpu or all online cpus in a policy.
   Since it's just used for set_cpus_allowed(), any offline cpus in a policy
   don't matter, so we can just use cpumask_of_cpu() or the policy->cpus.

Note: untested, since I don't have such a system.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>

diff -r dc205c205c8a arch/x86/kernel/cpu/cpufreq/speedstep-centrino.c
--- a/arch/x86/kernel/cpu/cpufreq/speedstep-centrino.c	Sun Sep 28 18:04:20 2008 +1000
+++ b/arch/x86/kernel/cpu/cpufreq/speedstep-centrino.c	Sun Sep 28 18:05:58 2008 +1000
@@ -459,9 +459,7 @@ static int centrino_verify (struct cpufr
  * Sets a new CPUFreq policy.
  */
 struct allmasks {
-	cpumask_t		online_policy_cpus;
 	cpumask_t		saved_mask;
-	cpumask_t		set_mask;
 	cpumask_t		covered_cpus;
 };
 
@@ -475,9 +473,7 @@ static int centrino_target (struct cpufr
 	int			retval = 0;
 	unsigned int		j, k, first_cpu, tmp;
 	CPUMASK_ALLOC(allmasks);
-	CPUMASK_PTR(online_policy_cpus, allmasks);
 	CPUMASK_PTR(saved_mask, allmasks);
-	CPUMASK_PTR(set_mask, allmasks);
 	CPUMASK_PTR(covered_cpus, allmasks);
 
 	if (unlikely(allmasks == NULL))
@@ -497,30 +493,28 @@ static int centrino_target (struct cpufr
 		goto out;
 	}
 
-#ifdef CONFIG_HOTPLUG_CPU
-	/* cpufreq holds the hotplug lock, so we are safe from here on */
-	cpus_and(*online_policy_cpus, cpu_online_map, policy->cpus);
-#else
-	*online_policy_cpus = policy->cpus;
-#endif
-
 	*saved_mask = current->cpus_allowed;
 	first_cpu = 1;
 	cpus_clear(*covered_cpus);
-	for_each_cpu_mask_nr(j, *online_policy_cpus) {
+	for_each_cpu_mask_nr(j, policy->cpus) {
+		const cpumask_t *mask;
+
+		/* cpufreq holds the hotplug lock, so we are safe here */
+		if (!cpu_online(j))
+			continue;
+
 		/*
 		 * Support for SMP systems.
 		 * Make sure we are running on CPU that wants to change freq
 		 */
-		cpus_clear(*set_mask);
 		if (policy->shared_type == CPUFREQ_SHARED_TYPE_ANY)
-			cpus_or(*set_mask, *set_mask, *online_policy_cpus);
+			mask = &policy->cpus;
 		else
-			cpu_set(j, *set_mask);
+			mask = &cpumask_of_cpu(j);
 
-		set_cpus_allowed_ptr(current, set_mask);
+		set_cpus_allowed_ptr(current, mask);
 		preempt_disable();
-		if (unlikely(!cpu_isset(smp_processor_id(), *set_mask))) {
+		if (unlikely(!cpu_isset(smp_processor_id(), *mask))) {
 			dprintk("couldn't limit to CPUs in this domain\n");
 			retval = -EAGAIN;
 			if (first_cpu) {
@@ -548,7 +542,9 @@ static int centrino_target (struct cpufr
 			dprintk("target=%dkHz old=%d new=%d msr=%04x\n",
 				target_freq, freqs.old, freqs.new, msr);
 
-			for_each_cpu_mask_nr(k, *online_policy_cpus) {
+			for_each_cpu_mask_nr(k, policy->cpus) {
+				if (!cpu_online(k))
+					continue;
 				freqs.cpu = k;
 				cpufreq_notify_transition(&freqs,
 					CPUFREQ_PRECHANGE);
@@ -571,7 +567,9 @@ static int centrino_target (struct cpufr
 		preempt_enable();
 	}
 
-	for_each_cpu_mask_nr(k, *online_policy_cpus) {
+	for_each_cpu_mask_nr(k, policy->cpus) {
+		if (!cpu_online(k))
+			continue;
 		freqs.cpu = k;
 		cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);
 	}
@@ -584,18 +582,17 @@ static int centrino_target (struct cpufr
 		 * Best effort undo..
 		 */
 
-		if (!cpus_empty(*covered_cpus))
-			for_each_cpu_mask_nr(j, *covered_cpus) {
-				set_cpus_allowed_ptr(current,
-						     &cpumask_of_cpu(j));
-				wrmsr(MSR_IA32_PERF_CTL, oldmsr, h);
-			}
+		for_each_cpu_mask_nr(j, *covered_cpus) {
+			set_cpus_allowed_ptr(current, &cpumask_of_cpu(j));
+			wrmsr(MSR_IA32_PERF_CTL, oldmsr, h);
+		}
 
 		tmp = freqs.new;
 		freqs.new = freqs.old;
 		freqs.old = tmp;
-		for_each_cpu_mask_nr(j, *online_policy_cpus) {
-			freqs.cpu = j;
+		for_each_cpu_mask_nr(j, policy->cpus) {
+			if (!cpu_online(j))
+				continue;
 			cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE);
 			cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);
 		}

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH] x86: clean up speedctep-centrino and reduce cpumask_t usage
  2008-09-30 23:01 [PATCH] x86: clean up speedctep-centrino and reduce cpumask_t usage Rusty Russell
@ 2008-10-01  6:44 ` Ingo Molnar
  2008-10-02  5:05   ` Rusty Russell
  0 siblings, 1 reply; 3+ messages in thread
From: Ingo Molnar @ 2008-10-01  6:44 UTC (permalink / raw)
  To: Rusty Russell; +Cc: Jeremy Fitzhardinge, linux-kernel, Mike Travis, Dave Jones


* Rusty Russell <rusty@rustcorp.com.au> wrote:

> 1) The #ifdef CONFIG_HOTPLUG_CPU seems unnecessary these days.
> 2) The loop can simply skip over offline cpus, rather than creating a tmp mask.
> 3) set_mask is set to either a single cpu or all online cpus in a policy.
>    Since it's just used for set_cpus_allowed(), any offline cpus in a policy
>    don't matter, so we can just use cpumask_of_cpu() or the policy->cpus.
> 
> Note: untested, since I don't have such a system.
> 
> Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>

nice cleanup! (Dave Jones Cc:-ed)

maybe it's better to keep this in the cpumask_t series though, to not 
complicate logistics?

> diff -r dc205c205c8a arch/x86/kernel/cpu/cpufreq/speedstep-centrino.c
> --- a/arch/x86/kernel/cpu/cpufreq/speedstep-centrino.c	Sun Sep 28 18:04:20 2008 +1000
> +++ b/arch/x86/kernel/cpu/cpufreq/speedstep-centrino.c	Sun Sep 28 18:05:58 2008 +1000

( minor technical request: could you please change your patch scripts to 
  include the diffstat too? )

	Ingo

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH] x86: clean up speedctep-centrino and reduce cpumask_t usage
  2008-10-01  6:44 ` Ingo Molnar
@ 2008-10-02  5:05   ` Rusty Russell
  0 siblings, 0 replies; 3+ messages in thread
From: Rusty Russell @ 2008-10-02  5:05 UTC (permalink / raw)
  To: Ingo Molnar; +Cc: Jeremy Fitzhardinge, linux-kernel, Mike Travis, Dave Jones

On Wednesday 01 October 2008 16:44:01 Ingo Molnar wrote:
> * Rusty Russell <rusty@rustcorp.com.au> wrote:
> > 1) The #ifdef CONFIG_HOTPLUG_CPU seems unnecessary these days.
> > 2) The loop can simply skip over offline cpus, rather than creating a tmp
> > mask. 3) set_mask is set to either a single cpu or all online cpus in a
> > policy. Since it's just used for set_cpus_allowed(), any offline cpus in
> > a policy don't matter, so we can just use cpumask_of_cpu() or the
> > policy->cpus.
> >
> > Note: untested, since I don't have such a system.
> >
> > Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
>
> nice cleanup! (Dave Jones Cc:-ed)

One interesting side effect of making onstack cpumasks harder to use is that 
people will put effort into avoiding them.  So far many have been an 
arbitrary implementation choice rather than a fundamental requirement for a 
mask.

> maybe it's better to keep this in the cpumask_t series though, to not
> complicate logistics?

Yeah, I'll keep it for the moment for simplicity; it's really orthogonal, so 
don't really mind.

> > diff -r dc205c205c8a arch/x86/kernel/cpu/cpufreq/speedstep-centrino.c
> > --- a/arch/x86/kernel/cpu/cpufreq/speedstep-centrino.c	Sun Sep 28
> > 18:04:20 2008 +1000 +++
> > b/arch/x86/kernel/cpu/cpufreq/speedstep-centrino.c	Sun Sep 28 18:05:58
> > 2008 +1000
>
> ( minor technical request: could you please change your patch scripts to
>   include the diffstat too? )

Oops, my bad.  They do, but this patch was manual :)

Thanks,
Rusty.

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2008-10-03  1:31 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-09-30 23:01 [PATCH] x86: clean up speedctep-centrino and reduce cpumask_t usage Rusty Russell
2008-10-01  6:44 ` Ingo Molnar
2008-10-02  5:05   ` Rusty Russell

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox