diff options
| -rw-r--r-- | kernel/watchdog.c | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/kernel/watchdog.c b/kernel/watchdog.c index 2316f50b07a4..506edcc500c4 100644 --- a/kernel/watchdog.c +++ b/kernel/watchdog.c | |||
| @@ -41,6 +41,8 @@ | |||
| 41 | #define NMI_WATCHDOG_ENABLED (1 << NMI_WATCHDOG_ENABLED_BIT) | 41 | #define NMI_WATCHDOG_ENABLED (1 << NMI_WATCHDOG_ENABLED_BIT) |
| 42 | #define SOFT_WATCHDOG_ENABLED (1 << SOFT_WATCHDOG_ENABLED_BIT) | 42 | #define SOFT_WATCHDOG_ENABLED (1 << SOFT_WATCHDOG_ENABLED_BIT) |
| 43 | 43 | ||
| 44 | static DEFINE_MUTEX(watchdog_proc_mutex); | ||
| 45 | |||
| 44 | #ifdef CONFIG_HARDLOCKUP_DETECTOR | 46 | #ifdef CONFIG_HARDLOCKUP_DETECTOR |
| 45 | static unsigned long __read_mostly watchdog_enabled = SOFT_WATCHDOG_ENABLED|NMI_WATCHDOG_ENABLED; | 47 | static unsigned long __read_mostly watchdog_enabled = SOFT_WATCHDOG_ENABLED|NMI_WATCHDOG_ENABLED; |
| 46 | #else | 48 | #else |
| @@ -608,26 +610,36 @@ void watchdog_nmi_enable_all(void) | |||
| 608 | { | 610 | { |
| 609 | int cpu; | 611 | int cpu; |
| 610 | 612 | ||
| 611 | if (!watchdog_user_enabled) | 613 | mutex_lock(&watchdog_proc_mutex); |
| 612 | return; | 614 | |
| 615 | if (!(watchdog_enabled & NMI_WATCHDOG_ENABLED)) | ||
| 616 | goto unlock; | ||
| 613 | 617 | ||
| 614 | get_online_cpus(); | 618 | get_online_cpus(); |
| 615 | for_each_online_cpu(cpu) | 619 | for_each_online_cpu(cpu) |
| 616 | watchdog_nmi_enable(cpu); | 620 | watchdog_nmi_enable(cpu); |
| 617 | put_online_cpus(); | 621 | put_online_cpus(); |
| 622 | |||
| 623 | unlock: | ||
| 624 | mutex_lock(&watchdog_proc_mutex); | ||
| 618 | } | 625 | } |
| 619 | 626 | ||
| 620 | void watchdog_nmi_disable_all(void) | 627 | void watchdog_nmi_disable_all(void) |
| 621 | { | 628 | { |
| 622 | int cpu; | 629 | int cpu; |
| 623 | 630 | ||
| 631 | mutex_lock(&watchdog_proc_mutex); | ||
| 632 | |||
| 624 | if (!watchdog_running) | 633 | if (!watchdog_running) |
| 625 | return; | 634 | goto unlock; |
| 626 | 635 | ||
| 627 | get_online_cpus(); | 636 | get_online_cpus(); |
| 628 | for_each_online_cpu(cpu) | 637 | for_each_online_cpu(cpu) |
| 629 | watchdog_nmi_disable(cpu); | 638 | watchdog_nmi_disable(cpu); |
| 630 | put_online_cpus(); | 639 | put_online_cpus(); |
| 640 | |||
| 641 | unlock: | ||
| 642 | mutex_unlock(&watchdog_proc_mutex); | ||
| 631 | } | 643 | } |
| 632 | #else | 644 | #else |
| 633 | static int watchdog_nmi_enable(unsigned int cpu) { return 0; } | 645 | static int watchdog_nmi_enable(unsigned int cpu) { return 0; } |
| @@ -744,8 +756,6 @@ static int proc_watchdog_update(void) | |||
| 744 | 756 | ||
| 745 | } | 757 | } |
| 746 | 758 | ||
| 747 | static DEFINE_MUTEX(watchdog_proc_mutex); | ||
| 748 | |||
| 749 | /* | 759 | /* |
| 750 | * common function for watchdog, nmi_watchdog and soft_watchdog parameter | 760 | * common function for watchdog, nmi_watchdog and soft_watchdog parameter |
| 751 | * | 761 | * |
