diff options
author | Satyam Sharma <satyam@infradead.org> | 2007-10-12 10:11:31 -0400 |
---|---|---|
committer | Martin Schwidefsky <schwidefsky@de.ibm.com> | 2007-10-12 10:13:05 -0400 |
commit | 11b8bf0107e688434b9e0570fd05e7c715534f3b (patch) | |
tree | a20866c1fbc638fa9026c4ea1919ed13f3f6d685 /arch/s390/appldata | |
parent | 2af48080e100d66db8f086af70a70713a953a83d (diff) |
[S390] appldata_base: Misc cpuinit annotations and bugfix
appldata_offline_cpu() is only called from __cpuinit-marked hotplug
notifier callback and from the __exit-marked module_exit function,
therefore candidate for __cpuexit.
BTW the __exit module_exit function appldata_exit() of this driver fails to
unregister_hotcpu_notifier() the notifier_block that was registered by
appldata_init() during module startup. This will lead to oops if hotplug
notification comes after module has been unloaded. Let's fix this by
unregistering the notifier appropriately (before appldata_offline_cpu()'ing
the CPUs).
Signed-off-by: Satyam Sharma <satyam@infradead.org>
Cc: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Diffstat (limited to 'arch/s390/appldata')
-rw-r--r-- | arch/s390/appldata/appldata_base.c | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/arch/s390/appldata/appldata_base.c b/arch/s390/appldata/appldata_base.c index 62391fb1f61f..a355d8133261 100644 --- a/arch/s390/appldata/appldata_base.c +++ b/arch/s390/appldata/appldata_base.c | |||
@@ -547,8 +547,7 @@ static void __cpuinit appldata_online_cpu(int cpu) | |||
547 | spin_unlock(&appldata_timer_lock); | 547 | spin_unlock(&appldata_timer_lock); |
548 | } | 548 | } |
549 | 549 | ||
550 | static void | 550 | static void __cpuexit appldata_offline_cpu(int cpu) |
551 | appldata_offline_cpu(int cpu) | ||
552 | { | 551 | { |
553 | del_virt_timer(&per_cpu(appldata_timer, cpu)); | 552 | del_virt_timer(&per_cpu(appldata_timer, cpu)); |
554 | if (atomic_dec_and_test(&appldata_expire_count)) { | 553 | if (atomic_dec_and_test(&appldata_expire_count)) { |
@@ -560,9 +559,9 @@ appldata_offline_cpu(int cpu) | |||
560 | spin_unlock(&appldata_timer_lock); | 559 | spin_unlock(&appldata_timer_lock); |
561 | } | 560 | } |
562 | 561 | ||
563 | static int __cpuinit | 562 | static int __cpuinit appldata_cpu_notify(struct notifier_block *self, |
564 | appldata_cpu_notify(struct notifier_block *self, | 563 | unsigned long action, |
565 | unsigned long action, void *hcpu) | 564 | void *hcpu) |
566 | { | 565 | { |
567 | switch (action) { | 566 | switch (action) { |
568 | case CPU_ONLINE: | 567 | case CPU_ONLINE: |
@@ -646,6 +645,8 @@ static void __exit appldata_exit(void) | |||
646 | } | 645 | } |
647 | spin_unlock(&appldata_ops_lock); | 646 | spin_unlock(&appldata_ops_lock); |
648 | 647 | ||
648 | unregister_hotcpu_notifier(&appldata_nb); | ||
649 | |||
649 | for_each_online_cpu(i) | 650 | for_each_online_cpu(i) |
650 | appldata_offline_cpu(i); | 651 | appldata_offline_cpu(i); |
651 | 652 | ||