]> xenbits.xensource.com Git - xenclient/kernel.git/commitdiff
acpi: Fix broken extctnl mechanism.
authorKeir Fraser <keir.fraser@citrix.com>
Mon, 28 Jul 2008 10:26:33 +0000 (11:26 +0100)
committerKeir Fraser <keir.fraser@citrix.com>
Mon, 28 Jul 2008 10:26:33 +0000 (11:26 +0100)
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 <gang.wei@intel.com>
drivers/acpi/processor_core.c
drivers/acpi/processor_extcntl.c
include/acpi/processor.h

index 969f176beb6bddb77c04e9c33703e27ec456b5c4..14d6db012e2076f21b80708b38dda9690b62081d 100644 (file)
@@ -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;
 
index f4739526bff532134a7397ba457be08903781303..3ce588a0566ba6904de118bc30b548398cd1f565 100644 (file)
@@ -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;
 }
 
index 3f60b84ccf7882371debd484a29bec3e62f4c994..dcd9adbaa11560fa9e56b945d0116466ce0d1d69 100644 (file)
@@ -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;
 }