aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/watchdog.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/watchdog.c')
-rw-r--r--kernel/watchdog.c21
1 files changed, 11 insertions, 10 deletions
diff --git a/kernel/watchdog.c b/kernel/watchdog.c
index 0d53c8e853b1..501cb6edca4b 100644
--- a/kernel/watchdog.c
+++ b/kernel/watchdog.c
@@ -371,7 +371,7 @@ static int watchdog_nmi_enable(int cpu)
371 } 371 }
372 372
373 printk(KERN_ERR "NMI watchdog failed to create perf event on cpu%i: %p\n", cpu, event); 373 printk(KERN_ERR "NMI watchdog failed to create perf event on cpu%i: %p\n", cpu, event);
374 return -1; 374 return PTR_ERR(event);
375 375
376 /* success path */ 376 /* success path */
377out_save: 377out_save:
@@ -415,17 +415,19 @@ static int watchdog_prepare_cpu(int cpu)
415static int watchdog_enable(int cpu) 415static int watchdog_enable(int cpu)
416{ 416{
417 struct task_struct *p = per_cpu(softlockup_watchdog, cpu); 417 struct task_struct *p = per_cpu(softlockup_watchdog, cpu);
418 int err;
418 419
419 /* enable the perf event */ 420 /* enable the perf event */
420 if (watchdog_nmi_enable(cpu) != 0) 421 err = watchdog_nmi_enable(cpu);
421 return -1; 422 if (err)
423 return err;
422 424
423 /* create the watchdog thread */ 425 /* create the watchdog thread */
424 if (!p) { 426 if (!p) {
425 p = kthread_create(watchdog, (void *)(unsigned long)cpu, "watchdog/%d", cpu); 427 p = kthread_create(watchdog, (void *)(unsigned long)cpu, "watchdog/%d", cpu);
426 if (IS_ERR(p)) { 428 if (IS_ERR(p)) {
427 printk(KERN_ERR "softlockup watchdog for %i failed\n", cpu); 429 printk(KERN_ERR "softlockup watchdog for %i failed\n", cpu);
428 return -1; 430 return PTR_ERR(p);
429 } 431 }
430 kthread_bind(p, cpu); 432 kthread_bind(p, cpu);
431 per_cpu(watchdog_touch_ts, cpu) = 0; 433 per_cpu(watchdog_touch_ts, cpu) = 0;
@@ -519,17 +521,16 @@ static int __cpuinit
519cpu_callback(struct notifier_block *nfb, unsigned long action, void *hcpu) 521cpu_callback(struct notifier_block *nfb, unsigned long action, void *hcpu)
520{ 522{
521 int hotcpu = (unsigned long)hcpu; 523 int hotcpu = (unsigned long)hcpu;
524 int err = 0;
522 525
523 switch (action) { 526 switch (action) {
524 case CPU_UP_PREPARE: 527 case CPU_UP_PREPARE:
525 case CPU_UP_PREPARE_FROZEN: 528 case CPU_UP_PREPARE_FROZEN:
526 if (watchdog_prepare_cpu(hotcpu)) 529 err = watchdog_prepare_cpu(hotcpu);
527 return NOTIFY_BAD;
528 break; 530 break;
529 case CPU_ONLINE: 531 case CPU_ONLINE:
530 case CPU_ONLINE_FROZEN: 532 case CPU_ONLINE_FROZEN:
531 if (watchdog_enable(hotcpu)) 533 err = watchdog_enable(hotcpu);
532 return NOTIFY_BAD;
533 break; 534 break;
534#ifdef CONFIG_HOTPLUG_CPU 535#ifdef CONFIG_HOTPLUG_CPU
535 case CPU_UP_CANCELED: 536 case CPU_UP_CANCELED:
@@ -542,7 +543,7 @@ cpu_callback(struct notifier_block *nfb, unsigned long action, void *hcpu)
542 break; 543 break;
543#endif /* CONFIG_HOTPLUG_CPU */ 544#endif /* CONFIG_HOTPLUG_CPU */
544 } 545 }
545 return NOTIFY_OK; 546 return notifier_from_errno(err);
546} 547}
547 548
548static struct notifier_block __cpuinitdata cpu_nfb = { 549static struct notifier_block __cpuinitdata cpu_nfb = {
@@ -558,7 +559,7 @@ static int __init spawn_watchdog_task(void)
558 return 0; 559 return 0;
559 560
560 err = cpu_callback(&cpu_nfb, CPU_UP_PREPARE, cpu); 561 err = cpu_callback(&cpu_nfb, CPU_UP_PREPARE, cpu);
561 WARN_ON(err == NOTIFY_BAD); 562 WARN_ON(notifier_to_errno(err));
562 563
563 cpu_callback(&cpu_nfb, CPU_ONLINE, cpu); 564 cpu_callback(&cpu_nfb, CPU_ONLINE, cpu);
564 register_cpu_notifier(&cpu_nfb); 565 register_cpu_notifier(&cpu_nfb);