On Thu, 17 Jul 2008 15:48:02 +0200 Thomas Renninger <trenn@xxxxxxx> wrote: > Hi, > > maybe I found something..., can someone review/test this. > > Thanks, > > Thomas > > ------------ > CPUFREQ ACPI: Only call _PPC after cpufreq ACPI init funcs got called already > > Ingo Molnar provided a fix to not call _PPC at processor driver initialization > time. > Git commit #e4233dec749a3519069d9390561b5636a75c7579 > > But it can still happen that _PPC is called at processor driver > initialization time. > > This patch should make sure that this is not possible anymore. There is no actual description of what this fixes, is there? Do machines go oops, or what? How do we proceed from here with this patch? Who should review it, who should test it, who should ack it and who should merge it? e4233dec749a3519069d9390561b5636a75c7579 was in January so this patch is applicable to 2.6.25.x and to 2.6.26.x. But is it needed there? Insufficient info. Ho hum. I queued it, tagged as needed-in-2.6.25.x and 2.6.26.x. But I am unsure about that. Please help to clarify these things. > Signed-off-by: Thomas Renninger <trenn@xxxxxxx> > --- > arch/powerpc/platforms/cell/cbe_cpufreq_pmi.c | 6 ++++++ > drivers/acpi/processor_perflib.c | 13 ++++++++++++- > drivers/cpufreq/cpufreq.c | 3 +++ > include/linux/cpufreq.h | 1 + > 4 files changed, 22 insertions(+), 1 deletions(-) > > diff --git a/arch/powerpc/platforms/cell/cbe_cpufreq_pmi.c > b/arch/powerpc/platforms/cell/cbe_cpufreq_pmi.c > index 69288f6..3233fe8 100644 > --- a/arch/powerpc/platforms/cell/cbe_cpufreq_pmi.c > +++ b/arch/powerpc/platforms/cell/cbe_cpufreq_pmi.c > @@ -96,6 +96,12 @@ static int pmi_notifier(struct notifier_block *nb, > struct cpufreq_frequency_table *cbe_freqs; > u8 node; > > + /* Should this really be called for CPUFREQ_ADJUST, CPUFREQ_INCOMPATIBLE > + * and CPUFREQ_NOTIFY policy events?) > + */ > + if (event == CPUFREQ_START) > + return 0; > + > cbe_freqs = cpufreq_frequency_get_table(policy->cpu); > node = cbe_cpu_to_node(policy->cpu); > > diff --git a/drivers/acpi/processor_perflib.c > b/drivers/acpi/processor_perflib.c > index b474996..63ccf80 100644 > --- a/drivers/acpi/processor_perflib.c > +++ b/drivers/acpi/processor_perflib.c > @@ -72,7 +72,13 @@ MODULE_PARM_DESC(ignore_ppc, "If the frequency of your > machine gets wrongly" \ > #define PPC_REGISTERED 1 > #define PPC_IN_USE 2 > > -static int acpi_processor_ppc_status = 0; > +/* ignore_ppc: > + * -1 -> cpufreq low level drivers not initialized -> _PSS, etc. not called > yet I am going to start hanging around in dark alleys in the hope of meeting the person who invented wordwrapping. Here it is again, fixed: From: Thomas Renninger <trenn@xxxxxxx> Ingo Molnar provided a fix to not call _PPC at processor driver initialization time. Git commit #e4233dec749a3519069d9390561b5636a75c7579 But it can still happen that _PPC is called at processor driver initialization time. This patch should make sure that this is not possible anymore. Signed-off-by: Thomas Renninger <trenn@xxxxxxx> Cc: Dave Jones <davej@xxxxxxxxxx> Cc: Len Brown <len.brown@xxxxxxxxx> Cc: Venkatesh Pallipadi <venkatesh.pallipadi@xxxxxxxxx> Cc: Chandra Seetharaman <sekharan@xxxxxxxxxx> Cc: Ingo Molnar <mingo@xxxxxxx> Cc: Benjamin Herrenschmidt <benh@xxxxxxxxxxxxxxxxxxx> Cc: Arkadiusz Miskiewicz <arekm@xxxxxxxx> Cc: <gnorton@xxxxxxxxxx> Cc: <miguel@xxxxxxxxxx> Cc: <stable@xxxxxxxxxx> [2.6.25.x, 2.6.26.x] Signed-off-by: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> --- arch/powerpc/platforms/cell/cbe_cpufreq_pmi.c | 6 ++++++ drivers/acpi/processor_perflib.c | 13 ++++++++++++- drivers/cpufreq/cpufreq.c | 3 +++ include/linux/cpufreq.h | 1 + 4 files changed, 22 insertions(+), 1 deletion(-) diff -puN arch/powerpc/platforms/cell/cbe_cpufreq_pmi.c~cpufreq-acpi-only-call-_ppc-after-cpufreq-acpi-init-funcs-got-called-already arch/powerpc/platforms/cell/cbe_cpufreq_pmi.c --- a/arch/powerpc/platforms/cell/cbe_cpufreq_pmi.c~cpufreq-acpi-only-call-_ppc-after-cpufreq-acpi-init-funcs-got-called-already +++ a/arch/powerpc/platforms/cell/cbe_cpufreq_pmi.c @@ -96,6 +96,12 @@ static int pmi_notifier(struct notifier_ struct cpufreq_frequency_table *cbe_freqs; u8 node; + /* Should this really be called for CPUFREQ_ADJUST, CPUFREQ_INCOMPATIBLE + * and CPUFREQ_NOTIFY policy events?) + */ + if (event == CPUFREQ_START) + return 0; + cbe_freqs = cpufreq_frequency_get_table(policy->cpu); node = cbe_cpu_to_node(policy->cpu); diff -puN drivers/acpi/processor_perflib.c~cpufreq-acpi-only-call-_ppc-after-cpufreq-acpi-init-funcs-got-called-already drivers/acpi/processor_perflib.c --- a/drivers/acpi/processor_perflib.c~cpufreq-acpi-only-call-_ppc-after-cpufreq-acpi-init-funcs-got-called-already +++ a/drivers/acpi/processor_perflib.c @@ -72,7 +72,13 @@ MODULE_PARM_DESC(ignore_ppc, "If the fre #define PPC_REGISTERED 1 #define PPC_IN_USE 2 -static int acpi_processor_ppc_status = 0; +/* ignore_ppc: + * -1 -> cpufreq low level drivers not initialized -> _PSS, etc. not called yet + * ignore _PPC + * 0 -> cpufreq low level drivers initialized -> consider _PPC values + * 1 -> ignore _PPC totally -> forced by user through boot param + */ +static int acpi_processor_ppc_status = -1; static int acpi_processor_ppc_notifier(struct notifier_block *nb, unsigned long event, void *data) @@ -81,6 +87,11 @@ static int acpi_processor_ppc_notifier(s struct acpi_processor *pr; unsigned int ppc = 0; + if (event == CPUFREQ_START && ignore_ppc <= 0) { + ignore_ppc = 0; + return 0; + } + if (ignore_ppc) return 0; diff -puN drivers/cpufreq/cpufreq.c~cpufreq-acpi-only-call-_ppc-after-cpufreq-acpi-init-funcs-got-called-already drivers/cpufreq/cpufreq.c --- a/drivers/cpufreq/cpufreq.c~cpufreq-acpi-only-call-_ppc-after-cpufreq-acpi-init-funcs-got-called-already +++ a/drivers/cpufreq/cpufreq.c @@ -825,6 +825,9 @@ static int cpufreq_add_dev(struct sys_de policy->user_policy.min = policy->cpuinfo.min_freq; policy->user_policy.max = policy->cpuinfo.max_freq; + blocking_notifier_call_chain(&cpufreq_policy_notifier_list, + CPUFREQ_START, policy); + #ifdef CONFIG_SMP #ifdef CONFIG_HOTPLUG_CPU diff -puN include/linux/cpufreq.h~cpufreq-acpi-only-call-_ppc-after-cpufreq-acpi-init-funcs-got-called-already include/linux/cpufreq.h --- a/include/linux/cpufreq.h~cpufreq-acpi-only-call-_ppc-after-cpufreq-acpi-init-funcs-got-called-already +++ a/include/linux/cpufreq.h @@ -106,6 +106,7 @@ struct cpufreq_policy { #define CPUFREQ_ADJUST (0) #define CPUFREQ_INCOMPATIBLE (1) #define CPUFREQ_NOTIFY (2) +#define CPUFREQ_START (3) #define CPUFREQ_SHARED_TYPE_NONE (0) /* None */ #define CPUFREQ_SHARED_TYPE_HW (1) /* HW does needed coordination */ _ -- To unsubscribe from this list: send the line "unsubscribe linux-acpi" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html