From e55677fc79e67d9ce3745a685c4d0f43ebca604a Mon Sep 17 00:00:00 2001 From: Keir Fraser Date: Mon, 28 Jul 2008 11:26:33 +0100 Subject: [PATCH] acpi: Fix broken extctnl mechanism. Fn arch_acpi_processor_init_extcntl need to be called before any acpi_processor init stuff, otherwise many special paths for xen-cpu-idle & xen-cpu-freq can't get executed. So keep arch_acpi_processor_init_extcntl call in processor_extcntl_init and call it very early, move other stuff of processor_extcntl_init into a new fn processor_extcntl_prepare. Signed-off-by: Wei Gang --- drivers/acpi/processor_core.c | 3 ++- drivers/acpi/processor_extcntl.c | 29 ++++++++++++++++------------- include/acpi/processor.h | 6 ++++-- 3 files changed, 22 insertions(+), 16 deletions(-) diff --git a/drivers/acpi/processor_core.c b/drivers/acpi/processor_core.c index 969f176b..14d6db01 100644 --- a/drivers/acpi/processor_core.c +++ b/drivers/acpi/processor_core.c @@ -526,6 +526,7 @@ static int acpi_processor_start(struct acpi_device *device) acpi_status status = AE_OK; struct acpi_processor *pr; + processor_extcntl_init(); pr = acpi_driver_data(device); @@ -579,7 +580,7 @@ static int acpi_processor_start(struct acpi_device *device) acpi_processor_power_init(pr, device); - result = processor_extcntl_init(pr); + result = processor_extcntl_prepare(pr); if (result) goto end; diff --git a/drivers/acpi/processor_extcntl.c b/drivers/acpi/processor_extcntl.c index f4739526..3ce588a0 100644 --- a/drivers/acpi/processor_extcntl.c +++ b/drivers/acpi/processor_extcntl.c @@ -104,6 +104,21 @@ int processor_notify_external(struct acpi_processor *pr, int event, int type) return ret; } +/* + * External control logic can decide to grab full or part of physical + * processor control bits. Take a VMM for example, physical processors + * are owned by VMM and thus existence information like hotplug is + * always required to be notified to VMM. Similar is processor idle + * state which is also necessarily controlled by VMM. But for other + * control bits like performance/throttle states, VMM may choose to + * control or not upon its own policy. + */ +void processor_extcntl_init(void) +{ + if (!processor_extcntl_ops) + arch_acpi_processor_init_extcntl(&processor_extcntl_ops); +} + /* * This is called from ACPI processor init, and targeted to hold * some tricky housekeeping jobs to satisfy external control model. @@ -111,7 +126,7 @@ int processor_notify_external(struct acpi_processor *pr, int event, int type) * and performance state. Those information may be not available * if splitting from dom0 control logic like cpufreq driver. */ -int __cpuinit processor_extcntl_init(struct acpi_processor *pr) +int processor_extcntl_prepare(struct acpi_processor *pr) { /* parse cstate dependency information */ if (processor_pm_external()) @@ -121,18 +136,6 @@ int __cpuinit processor_extcntl_init(struct acpi_processor *pr) if (processor_pmperf_external()) processor_extcntl_get_performance(pr); - /* - * External control logic can decide to grab full or part of physical - * processor control bits. Take a VMM for example, physical processors - * are owned by VMM and thus existence information like hotplug is - * always required to be notified to VMM. Similar is processor idle - * state which is also necessarily controlled by VMM. But for other - * control bits like performance/throttle states, VMM may choose to - * control or not upon its own policy. - */ - if (!processor_extcntl_ops) - arch_acpi_processor_init_extcntl(&processor_extcntl_ops); - return 0; } diff --git a/include/acpi/processor.h b/include/acpi/processor.h index 3f60b84c..dcd9adba 100644 --- a/include/acpi/processor.h +++ b/include/acpi/processor.h @@ -351,7 +351,8 @@ static inline int processor_pmthr_external(void) extern int processor_notify_external(struct acpi_processor *pr, int event, int type); -extern int processor_extcntl_init(struct acpi_processor *pr); +extern void processor_extcntl_init(void); +extern int processor_extcntl_prepare(struct acpi_processor *pr); extern int acpi_processor_get_performance_info(struct acpi_processor *pr); extern int acpi_processor_get_psd(struct acpi_processor *pr); void arch_acpi_processor_init_extcntl(const struct processor_extcntl_ops **); @@ -365,7 +366,8 @@ static inline int processor_notify_external(struct acpi_processor *pr, { return 0; } -static inline int processor_extcntl_init(struct acpi_processor *pr) +static inline void processor_extcntl_init(void) {} +static inline int processor_extcntl_prepare(struct acpi_processor *pr) { return 0; } -- 2.39.5