check return value of cpu_callback
PATCH 1/1 check return value of cpu_callback
Spawing ksoftirqd, migration, or watchdog, and calling init_timers_cpu() may fail with small memory. If it happens in initcalls, kernel NULL pointer dereference happens later. This patch makes crash happen immediately in such cases. It seems a bit better than getting kernel NULL pointer dereference later.
CC Ingo Molnar <[email protected]>
Signed-off-by Akinobu Mita <[email protected]>
kernel/sched.c | 4 +++- kernel/softirq.c | 4 +++- kernel/softlockup.c | 3 ++- kernel/timer.c | 4 +++- 4 files changed, 11 insertions(+), 4 deletions(-)
kernel/softirq.c +3 -1
@@ -612,7 +612,9 @@ static struct notifier_block __cpuinitda__init int spawn_ksoftirqd (void ) {void *cpu = (void *)(long )smp_processor_id (); -cpu_callback (&cpu_nfb,CPU_UP_PREPARE , cpu); +int err =cpu_callback (&cpu_nfb,CPU_UP_PREPARE , cpu); + +BUG_ON (err ==NOTIFY_BAD );cpu_callback (&cpu_nfb,CPU_ONLINE , cpu);register_cpu_notifier (&cpu_nfb);return 0 ;
kernel/softlockup.c +2 -1
@@ -149,8 +149,9 @@ static struct notifier_block __cpuinitda__init void spawn_softlockup_task (void ) {void *cpu = (void *)(long )smp_processor_id (); +int err =cpu_callback (&cpu_nfb,CPU_UP_PREPARE , cpu); -cpu_callback (&cpu_nfb,CPU_UP_PREPARE , cpu); +BUG_ON (err ==NOTIFY_BAD );cpu_callback (&cpu_nfb,CPU_ONLINE , cpu);register_cpu_notifier (&cpu_nfb);
kernel/sched.c +3 -1
@@ -5237,9 +5237,11 @@ static struct notifier_block __cpuinitdaint __init migration_init (void ) {void *cpu = (void *)(long )smp_processor_id (); +int err;/* Start one for the boot CPU: */ -migration_call (&migration_notifier,CPU_UP_PREPARE , cpu); + err =migration_call (&migration_notifier,CPU_UP_PREPARE , cpu); +BUG_ON (err ==NOTIFY_BAD );migration_call (&migration_notifier,CPU_ONLINE , cpu);register_cpu_notifier (&migration_notifier);
kernel/timer.c +3 -1
@@ -1715,8 +1715,10 @@ static struct notifier_block __cpuinitdavoid __init init_timers (void ) { -timer_cpu_notify (&timers_nb, (unsigned long )CPU_UP_PREPARE , +int err =timer_cpu_notify (&timers_nb, (unsigned long )CPU_UP_PREPARE , (void *)(long )smp_processor_id ()); + +BUG_ON (err ==NOTIFY_BAD );register_cpu_notifier (&timers_nb);open_softirq (TIMER_SOFTIRQ , run_timer_softirq,NULL ); }