Re: Fix quilt merge error in acpi-cpufreq.c

Linus Torvalds
2009-04-15T15:09:19Z

On Wed, 15 Apr 2009, Ingo Molnar wrote:
>
> fuller log below. I think this is because smp_call_function_many()
> was essentially unused before - an IPI function should not trigger
> this warning, it will naturally be called in preemptible context.

Yeah, that thing is buggy. It just does "this_cpu = smp_processor_id()".

But I have to admit that the breakage is documented. Both the "other
CPU's" part _and_ the "preemption must be disabled when calling".

So it's not a bug, it's a "feature".

Which is obviously not to say that the thing isn't complete crap.

This patch should fix it - not by fixing smp_call_function_many(), but by
just living with the breakage. Andrew already sent out a patch that just
avoided the function entirely, but at least some systems are likely to be
able to do one single broadcast IPI with this, so it's at least in theory
still better to use that smp_call_function_many() function, even though it
has braindamaged semantics.

Linus

---
arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c | 6 ++++++
1 files changed, 6 insertions(+), 0 deletions(-)

diff --git a/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c b/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c
index 837c2c4..ecdb682 100644
--- a/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c
+++ b/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c
@@ -204,7 +204,13 @@ static void drv_read(struct drv_cmd *cmd)

static void drv_write(struct drv_cmd *cmd)
{
+ int this_cpu;
+
+ this_cpu = get_cpu();
+ if (cpumask_test_cpu(this_cpu, cmd->mask))
+ do_drv_write(cmd);
smp_call_function_many(cmd->mask, do_drv_write, cmd, 1);
+ put_cpu();
}

static u32 get_cur_val(const struct cpumask *mask)