Jan Beulich
2008-Jul-23 12:32 UTC
[Xen-devel] [PATCH] linux/acpi: adjust extcntl code so that CONFIG_ACPI_PROCESSOR=m is possible again
This is done by inverting the calling direction for registering the extcntl_ops structure, similar to arch_acpi_processor_init_pdc(). As usual, written and tested on 2.6.26 and made apply to the 2.6.18 tree without further testing. Signed-off-by: Jan Beulich <jbeulich@novell.com> Index: head-2008-07-21/arch/i386/kernel/acpi/processor_extcntl_xen.c ==================================================================--- head-2008-07-21.orig/arch/i386/kernel/acpi/processor_extcntl_xen.c 2008-07-22 17:19:29.000000000 +0200 +++ head-2008-07-21/arch/i386/kernel/acpi/processor_extcntl_xen.c 2008-07-22 15:58:45.000000000 +0200 @@ -221,7 +221,7 @@ static struct processor_extcntl_ops xen_ .hotplug = xen_hotplug_notifier, }; -static int __cpuinit xen_init_processor_extcntl(void) +void arch_acpi_processor_init_extcntl(const struct processor_extcntl_ops **ops) { if (xen_processor_pmbits & XEN_PROCESSOR_PM_CX) xen_extcntl_ops.pm_ops[PM_TYPE_IDLE] = xen_cx_notifier; @@ -230,6 +230,6 @@ static int __cpuinit xen_init_processor_ if (xen_processor_pmbits & XEN_PROCESSOR_PM_TX) xen_extcntl_ops.pm_ops[PM_TYPE_THR] = xen_tx_notifier; - return processor_register_extcntl(&xen_extcntl_ops); + *ops = &xen_extcntl_ops; } -core_initcall(xen_init_processor_extcntl); +EXPORT_SYMBOL(arch_acpi_processor_init_extcntl); Index: head-2008-07-21/drivers/acpi/Kconfig ==================================================================--- head-2008-07-21.orig/drivers/acpi/Kconfig 2008-07-22 09:14:58.000000000 +0200 +++ head-2008-07-21/drivers/acpi/Kconfig 2008-07-21 14:14:13.000000000 +0200 @@ -371,7 +371,6 @@ config ACPI_PV_SLEEP config PROCESSOR_EXTERNAL_CONTROL bool depends on X86 && XEN - select ACPI_PROCESSOR default y endif # ACPI Index: head-2008-07-21/drivers/acpi/processor_extcntl.c ==================================================================--- head-2008-07-21.orig/drivers/acpi/processor_extcntl.c 2008-07-22 17:19:29.000000000 +0200 +++ head-2008-07-21/drivers/acpi/processor_extcntl.c 2008-07-22 17:20:52.000000000 +0200 @@ -36,7 +36,7 @@ static int processor_extcntl_get_perform * External processor control logic may register with its own set of * ops to get ACPI related notification. One example is like VMM. */ -struct processor_extcntl_ops *processor_extcntl_ops; +const struct processor_extcntl_ops *processor_extcntl_ops; EXPORT_SYMBOL(processor_extcntl_ops); static int processor_notify_smm(void) @@ -105,47 +105,13 @@ int processor_notify_external(struct acp } /* - * 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. - * - * Such ownership is unlikely to be switched in the fly, and thus - * not sure unregister interface is required or not. Being same reason, - * lock is not forced now. - */ -int processor_register_extcntl(struct processor_extcntl_ops *ops) -{ - if (!ops) - return -EINVAL; - - if (processor_extcntl_ops && - (processor_extcntl_ops != ops)) - return -EBUSY; - - processor_extcntl_ops = ops; - return 0; -} - -int processor_unregister_extcntl(struct processor_extcntl_ops *ops) -{ - if (processor_extcntl_ops == ops) - processor_extcntl_ops = NULL; - - return 0; -} - -/* * This is called from ACPI processor init, and targeted to hold * some tricky housekeeping jobs to satisfy external control model. * For example, we may put dependency parse stub here for idle * and performance state. Those information may be not available * if splitting from dom0 control logic like cpufreq driver. */ -int processor_extcntl_init(struct acpi_processor *pr) +int __cpuinit processor_extcntl_init(struct acpi_processor *pr) { /* parse cstate dependency information */ if (processor_pm_external()) @@ -155,6 +121,18 @@ int processor_extcntl_init(struct acpi_p 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: head-2008-07-21/include/acpi/processor.h ==================================================================--- head-2008-07-21.orig/include/acpi/processor.h 2008-07-22 17:19:29.000000000 +0200 +++ head-2008-07-21/include/acpi/processor.h 2008-07-22 16:01:43.000000000 +0200 @@ -323,7 +323,7 @@ struct processor_extcntl_ops { /* Notify physical processor status to external control logic */ int (*hotplug)(struct acpi_processor *pr, int event); }; -extern struct processor_extcntl_ops *processor_extcntl_ops; +extern const struct processor_extcntl_ops *processor_extcntl_ops; static inline int processor_cntl_external(void) { @@ -350,11 +350,10 @@ static inline int processor_pmthr_extern extern int processor_notify_external(struct acpi_processor *pr, int event, int type); -extern int processor_register_extcntl(struct processor_extcntl_ops *ops); -extern int processor_unregister_extcntl(struct processor_extcntl_ops *ops); extern int processor_extcntl_init(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 **); #else static inline int processor_cntl_external(void) {return 0;} static inline int processor_pm_external(void) {return 0;} _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel