Move idle notifiers into arch-agnostic code. Adapt x86 64 accordingly to call the new architecture-agnostic notifiers rather than its own. Other architectures are still "todo". Signed-off-by: Mathieu Desnoyers --- arch/x86/include/asm/idle.h | 7 ------- arch/x86/kernel/process_64.c | 19 +++---------------- drivers/idle/i7300_idle.c | 5 +++-- include/linux/idle.h | 19 +++++++++++++++++++ kernel/notifier.c | 25 +++++++++++++++++++++++++ 5 files changed, 50 insertions(+), 25 deletions(-) Index: linux.trees.git/arch/x86/kernel/process_64.c =================================================================== --- linux.trees.git.orig/arch/x86/kernel/process_64.c 2010-06-25 15:12:56.000000000 -0400 +++ linux.trees.git/arch/x86/kernel/process_64.c 2010-06-25 15:12:59.000000000 -0400 @@ -35,6 +35,7 @@ #include #include #include +#include #include #include @@ -58,31 +59,17 @@ asmlinkage extern void ret_from_fork(voi DEFINE_PER_CPU(unsigned long, old_rsp); static DEFINE_PER_CPU(unsigned char, is_idle); -static ATOMIC_NOTIFIER_HEAD(idle_notifier); - -void idle_notifier_register(struct notifier_block *n) -{ - atomic_notifier_chain_register(&idle_notifier, n); -} -EXPORT_SYMBOL_GPL(idle_notifier_register); - -void idle_notifier_unregister(struct notifier_block *n) -{ - atomic_notifier_chain_unregister(&idle_notifier, n); -} -EXPORT_SYMBOL_GPL(idle_notifier_unregister); - void enter_idle(void) { percpu_write(is_idle, 1); - atomic_notifier_call_chain(&idle_notifier, IDLE_START, NULL); + notify_idle(IDLE_START); } static void __exit_idle(void) { if (x86_test_and_clear_bit_percpu(0, is_idle) == 0) return; - atomic_notifier_call_chain(&idle_notifier, IDLE_END, NULL); + notify_idle(IDLE_END); } /* Called from interrupts to signify idle end */ Index: linux.trees.git/arch/x86/include/asm/idle.h =================================================================== --- linux.trees.git.orig/arch/x86/include/asm/idle.h 2010-06-25 15:12:56.000000000 -0400 +++ linux.trees.git/arch/x86/include/asm/idle.h 2010-06-25 15:12:59.000000000 -0400 @@ -1,13 +1,6 @@ #ifndef _ASM_X86_IDLE_H #define _ASM_X86_IDLE_H -#define IDLE_START 1 -#define IDLE_END 2 - -struct notifier_block; -void idle_notifier_register(struct notifier_block *n); -void idle_notifier_unregister(struct notifier_block *n); - #ifdef CONFIG_X86_64 void enter_idle(void); void exit_idle(void); Index: linux.trees.git/include/linux/idle.h =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ linux.trees.git/include/linux/idle.h 2010-06-25 15:12:59.000000000 -0400 @@ -0,0 +1,19 @@ +/* + * include/linux/idle.h - generic idle definition + * + */ +#ifndef _LINUX_IDLE_H_ +#define _LINUX_IDLE_H_ + +#include + +enum idle_val { + IDLE_START = 1, + IDLE_END = 2, +}; + +int notify_idle(enum idle_val val); +void register_idle_notifier(struct notifier_block *n); +void unregister_idle_notifier(struct notifier_block *n); + +#endif /* _LINUX_IDLE_H_ */ Index: linux.trees.git/kernel/notifier.c =================================================================== --- linux.trees.git.orig/kernel/notifier.c 2010-06-25 15:12:59.000000000 -0400 +++ linux.trees.git/kernel/notifier.c 2010-06-25 15:12:59.000000000 -0400 @@ -5,6 +5,7 @@ #include #include #include +#include /* * Notifier list for kernel code which wants to be called @@ -584,3 +585,27 @@ int unregister_die_notifier(struct notif return atomic_notifier_chain_unregister(&die_chain, nb); } EXPORT_SYMBOL_GPL(unregister_die_notifier); + +static ATOMIC_NOTIFIER_HEAD(idle_notifier); + +/* + * Trace last event before calling notifiers. Notifiers flush data from buffers + * before going to idle. + */ +int notrace notify_idle(enum idle_val val) +{ + return atomic_notifier_call_chain(&idle_notifier, val, NULL); +} +EXPORT_SYMBOL_GPL(notify_idle); + +void register_idle_notifier(struct notifier_block *n) +{ + atomic_notifier_chain_register(&idle_notifier, n); +} +EXPORT_SYMBOL_GPL(register_idle_notifier); + +void unregister_idle_notifier(struct notifier_block *n) +{ + atomic_notifier_chain_unregister(&idle_notifier, n); +} +EXPORT_SYMBOL_GPL(unregister_idle_notifier); Index: linux.trees.git/drivers/idle/i7300_idle.c =================================================================== --- linux.trees.git.orig/drivers/idle/i7300_idle.c 2010-06-19 16:08:34.000000000 -0400 +++ linux.trees.git/drivers/idle/i7300_idle.c 2010-06-25 15:13:11.000000000 -0400 @@ -27,6 +27,7 @@ #include #include #include +#include #include @@ -583,7 +584,7 @@ static int __init i7300_idle_init(void) } } - idle_notifier_register(&i7300_idle_nb); + register_idle_notifier(&i7300_idle_nb); printk(KERN_INFO "i7300_idle: loaded v%s\n", I7300_IDLE_DRIVER_VERSION); return 0; @@ -591,7 +592,7 @@ static int __init i7300_idle_init(void) static void __exit i7300_idle_exit(void) { - idle_notifier_unregister(&i7300_idle_nb); + unregister_idle_notifier(&i7300_idle_nb); free_cpumask_var(idle_cpumask); if (debugfs_dir) { -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/