linux/kernel/watchdog.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 * Detect hard and soft lockups on a system
   4 *
   5 * started by Don Zickus, Copyright (C) 2010 Red Hat, Inc.
   6 *
   7 * Note: Most of this code is borrowed heavily from the original softlockup
   8 * detector, so thanks to Ingo for the initial implementation.
   9 * Some chunks also taken from the old x86-specific nmi watchdog code, thanks
  10 * to those contributors as well.
  11 */
  12
  13#define pr_fmt(fmt) "watchdog: " fmt
  14
  15#include <linux/mm.h>
  16#include <linux/cpu.h>
  17#include <linux/nmi.h>
  18#include <linux/init.h>
  19#include <linux/module.h>
  20#include <linux/sysctl.h>
  21#include <linux/tick.h>
  22#include <linux/sched/clock.h>
  23#include <linux/sched/debug.h>
  24#include <linux/sched/isolation.h>
  25#include <linux/stop_machine.h>
  26
  27#include <asm/irq_regs.h>
  28#include <linux/kvm_para.h>
  29
  30static DEFINE_MUTEX(watchdog_mutex);
  31
  32#if defined(CONFIG_HARDLOCKUP_DETECTOR) || defined(CONFIG_HAVE_NMI_WATCHDOG)
  33# define WATCHDOG_DEFAULT       (SOFT_WATCHDOG_ENABLED | NMI_WATCHDOG_ENABLED)
  34# define NMI_WATCHDOG_DEFAULT   1
  35#else
  36# define WATCHDOG_DEFAULT       (SOFT_WATCHDOG_ENABLED)
  37# define NMI_WATCHDOG_DEFAULT   0
  38#endif
  39
  40unsigned long __read_mostly watchdog_enabled;
  41int __read_mostly watchdog_user_enabled = 1;
  42int __read_mostly nmi_watchdog_user_enabled = NMI_WATCHDOG_DEFAULT;
  43int __read_mostly soft_watchdog_user_enabled = 1;
  44int __read_mostly watchdog_thresh = 10;
  45int __read_mostly nmi_watchdog_available;
  46
  47struct cpumask watchdog_allowed_mask __read_mostly;
  48
  49struct cpumask watchdog_cpumask __read_mostly;
  50unsigned long *watchdog_cpumask_bits = cpumask_bits(&watchdog_cpumask);
  51
  52#ifdef CONFIG_HARDLOCKUP_DETECTOR
  53/*
  54 * Should we panic when a soft-lockup or hard-lockup occurs:
  55 */
  56unsigned int __read_mostly hardlockup_panic =
  57                        CONFIG_BOOTPARAM_HARDLOCKUP_PANIC_VALUE;
  58/*
  59 * We may not want to enable hard lockup detection by default in all cases,
  60 * for example when running the kernel as a guest on a hypervisor. In these
  61 * cases this function can be called to disable hard lockup detection. This
  62 * function should only be executed once by the boot processor before the
  63 * kernel command line parameters are parsed, because otherwise it is not
  64 * possible to override this in hardlockup_panic_setup().
  65 */
  66void __init hardlockup_detector_disable(void)
  67{
  68        nmi_watchdog_user_enabled = 0;
  69}
  70
  71static int __init hardlockup_panic_setup(char *str)
  72{
  73        if (!strncmp(str, "panic", 5))
  74                hardlockup_panic = 1;
  75        else if (!strncmp(str, "nopanic", 7))
  76                hardlockup_panic = 0;
  77        else if (!strncmp(str, "0", 1))
  78                nmi_watchdog_user_enabled = 0;
  79        else if (!strncmp(str, "1", 1))
  80                nmi_watchdog_user_enabled = 1;
  81        return 1;
  82}
  83__setup("nmi_watchdog=", hardlockup_panic_setup);
  84
  85# ifdef CONFIG_SMP
  86int __read_mostly sysctl_hardlockup_all_cpu_backtrace;
  87
  88static int __init hardlockup_all_cpu_backtrace_setup(char *str)
  89{
  90        sysctl_hardlockup_all_cpu_backtrace = !!simple_strtol(str, NULL, 0);
  91        return 1;
  92}
  93__setup("hardlockup_all_cpu_backtrace=", hardlockup_all_cpu_backtrace_setup);
  94# endif /* CONFIG_SMP */
  95#endif /* CONFIG_HARDLOCKUP_DETECTOR */
  96
  97/*
  98 * These functions can be overridden if an architecture implements its
  99 * own hardlockup detector.
 100 *
 101 * watchdog_nmi_enable/disable can be implemented to start and stop when
 102 * softlockup watchdog threads start and stop. The arch must select the
 103 * SOFTLOCKUP_DETECTOR Kconfig.
 104 */
 105int __weak watchdog_nmi_enable(unsigned int cpu)
 106{
 107        hardlockup_detector_perf_enable();
 108        return 0;
 109}
 110
 111void __weak watchdog_nmi_disable(unsigned int cpu)
 112{
 113        hardlockup_detector_perf_disable();
 114}
 115
 116/* Return 0, if a NMI watchdog is available. Error code otherwise */
 117int __weak __init watchdog_nmi_probe(void)
 118{
 119        return hardlockup_detector_perf_init();
 120}
 121
 122/**
 123 * watchdog_nmi_stop - Stop the watchdog for reconfiguration
 124 *
 125 * The reconfiguration steps are:
 126 * watchdog_nmi_stop();
 127 * update_variables();
 128 * watchdog_nmi_start();
 129 */
 130void __weak watchdog_nmi_stop(void) { }
 131
 132/**
 133 * watchdog_nmi_start - Start the watchdog after reconfiguration
 134 *
 135 * Counterpart to watchdog_nmi_stop().
 136 *
 137 * The following variables have been updated in update_variables() and
 138 * contain the currently valid configuration:
 139 * - watchdog_enabled
 140 * - watchdog_thresh
 141 * - watchdog_cpumask
 142 */
 143void __weak watchdog_nmi_start(void) { }
 144
 145/**
 146 * lockup_detector_update_enable - Update the sysctl enable bit
 147 *
 148 * Caller needs to make sure that the NMI/perf watchdogs are off, so this
 149 * can't race with watchdog_nmi_disable().
 150 */
 151static void lockup_detector_update_enable(void)
 152{
 153        watchdog_enabled = 0;
 154        if (!watchdog_user_enabled)
 155                return;
 156        if (nmi_watchdog_available && nmi_watchdog_user_enabled)
 157                watchdog_enabled |= NMI_WATCHDOG_ENABLED;
 158        if (soft_watchdog_user_enabled)
 159                watchdog_enabled |= SOFT_WATCHDOG_ENABLED;
 160}
 161
 162#ifdef CONFIG_SOFTLOCKUP_DETECTOR
 163
 164/* Global variables, exported for sysctl */
 165unsigned int __read_mostly softlockup_panic =
 166                        CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE;
 167
 168static bool softlockup_initialized __read_mostly;
 169static u64 __read_mostly sample_period;
 170
 171static DEFINE_PER_CPU(unsigned long, watchdog_touch_ts);
 172static DEFINE_PER_CPU(struct hrtimer, watchdog_hrtimer);
 173static DEFINE_PER_CPU(bool, softlockup_touch_sync);
 174static DEFINE_PER_CPU(bool, soft_watchdog_warn);
 175static DEFINE_PER_CPU(unsigned long, hrtimer_interrupts);
 176static DEFINE_PER_CPU(unsigned long, soft_lockup_hrtimer_cnt);
 177static DEFINE_PER_CPU(struct task_struct *, softlockup_task_ptr_saved);
 178static DEFINE_PER_CPU(unsigned long, hrtimer_interrupts_saved);
 179static unsigned long soft_lockup_nmi_warn;
 180
 181static int __init softlockup_panic_setup(char *str)
 182{
 183        softlockup_panic = simple_strtoul(str, NULL, 0);
 184        return 1;
 185}
 186__setup("softlockup_panic=", softlockup_panic_setup);
 187
 188static int __init nowatchdog_setup(char *str)
 189{
 190        watchdog_user_enabled = 0;
 191        return 1;
 192}
 193__setup("nowatchdog", nowatchdog_setup);
 194
 195static int __init nosoftlockup_setup(char *str)
 196{
 197        soft_watchdog_user_enabled = 0;
 198        return 1;
 199}
 200__setup("nosoftlockup", nosoftlockup_setup);
 201
 202#ifdef CONFIG_SMP
 203int __read_mostly sysctl_softlockup_all_cpu_backtrace;
 204
 205static int __init softlockup_all_cpu_backtrace_setup(char *str)
 206{
 207        sysctl_softlockup_all_cpu_backtrace = !!simple_strtol(str, NULL, 0);
 208        return 1;
 209}
 210__setup("softlockup_all_cpu_backtrace=", softlockup_all_cpu_backtrace_setup);
 211#endif
 212
 213static void __lockup_detector_cleanup(void);
 214
 215/*
 216 * Hard-lockup warnings should be triggered after just a few seconds. Soft-
 217 * lockups can have false positives under extreme conditions. So we generally
 218 * want a higher threshold for soft lockups than for hard lockups. So we couple
 219 * the thresholds with a factor: we make the soft threshold twice the amount of
 220 * time the hard threshold is.
 221 */
 222static int get_softlockup_thresh(void)
 223{
 224        return watchdog_thresh * 2;
 225}
 226
 227/*
 228 * Returns seconds, approximately.  We don't need nanosecond
 229 * resolution, and we don't need to waste time with a big divide when
 230 * 2^30ns == 1.074s.
 231 */
 232static unsigned long get_timestamp(void)
 233{
 234        return running_clock() >> 30LL;  /* 2^30 ~= 10^9 */
 235}
 236
 237static void set_sample_period(void)
 238{
 239        /*
 240         * convert watchdog_thresh from seconds to ns
 241         * the divide by 5 is to give hrtimer several chances (two
 242         * or three with the current relation between the soft
 243         * and hard thresholds) to increment before the
 244         * hardlockup detector generates a warning
 245         */
 246        sample_period = get_softlockup_thresh() * ((u64)NSEC_PER_SEC / 5);
 247        watchdog_update_hrtimer_threshold(sample_period);
 248}
 249
 250/* Commands for resetting the watchdog */
 251static void __touch_watchdog(void)
 252{
 253        __this_cpu_write(watchdog_touch_ts, get_timestamp());
 254}
 255
 256/**
 257 * touch_softlockup_watchdog_sched - touch watchdog on scheduler stalls
 258 *
 259 * Call when the scheduler may have stalled for legitimate reasons
 260 * preventing the watchdog task from executing - e.g. the scheduler
 261 * entering idle state.  This should only be used for scheduler events.
 262 * Use touch_softlockup_watchdog() for everything else.
 263 */
 264notrace void touch_softlockup_watchdog_sched(void)
 265{
 266        /*
 267         * Preemption can be enabled.  It doesn't matter which CPU's timestamp
 268         * gets zeroed here, so use the raw_ operation.
 269         */
 270        raw_cpu_write(watchdog_touch_ts, 0);
 271}
 272
 273notrace void touch_softlockup_watchdog(void)
 274{
 275        touch_softlockup_watchdog_sched();
 276        wq_watchdog_touch(raw_smp_processor_id());
 277}
 278EXPORT_SYMBOL(touch_softlockup_watchdog);
 279
 280void touch_all_softlockup_watchdogs(void)
 281{
 282        int cpu;
 283
 284        /*
 285         * watchdog_mutex cannpt be taken here, as this might be called
 286         * from (soft)interrupt context, so the access to
 287         * watchdog_allowed_cpumask might race with a concurrent update.
 288         *
 289         * The watchdog time stamp can race against a concurrent real
 290         * update as well, the only side effect might be a cycle delay for
 291         * the softlockup check.
 292         */
 293        for_each_cpu(cpu, &watchdog_allowed_mask)
 294                per_cpu(watchdog_touch_ts, cpu) = 0;
 295        wq_watchdog_touch(-1);
 296}
 297
 298void touch_softlockup_watchdog_sync(void)
 299{
 300        __this_cpu_write(softlockup_touch_sync, true);
 301        __this_cpu_write(watchdog_touch_ts, 0);
 302}
 303
 304static int is_softlockup(unsigned long touch_ts)
 305{
 306        unsigned long now = get_timestamp();
 307
 308        if ((watchdog_enabled & SOFT_WATCHDOG_ENABLED) && watchdog_thresh){
 309                /* Warn about unreasonable delays. */
 310                if (time_after(now, touch_ts + get_softlockup_thresh()))
 311                        return now - touch_ts;
 312        }
 313        return 0;
 314}
 315
 316/* watchdog detector functions */
 317bool is_hardlockup(void)
 318{
 319        unsigned long hrint = __this_cpu_read(hrtimer_interrupts);
 320
 321        if (__this_cpu_read(hrtimer_interrupts_saved) == hrint)
 322                return true;
 323
 324        __this_cpu_write(hrtimer_interrupts_saved, hrint);
 325        return false;
 326}
 327
 328static void watchdog_interrupt_count(void)
 329{
 330        __this_cpu_inc(hrtimer_interrupts);
 331}
 332
 333static DEFINE_PER_CPU(struct completion, softlockup_completion);
 334static DEFINE_PER_CPU(struct cpu_stop_work, softlockup_stop_work);
 335
 336/*
 337 * The watchdog thread function - touches the timestamp.
 338 *
 339 * It only runs once every sample_period seconds (4 seconds by
 340 * default) to reset the softlockup timestamp. If this gets delayed
 341 * for more than 2*watchdog_thresh seconds then the debug-printout
 342 * triggers in watchdog_timer_fn().
 343 */
 344static int softlockup_fn(void *data)
 345{
 346        __this_cpu_write(soft_lockup_hrtimer_cnt,
 347                         __this_cpu_read(hrtimer_interrupts));
 348        __touch_watchdog();
 349        complete(this_cpu_ptr(&softlockup_completion));
 350
 351        return 0;
 352}
 353
 354/* watchdog kicker functions */
 355static enum hrtimer_restart watchdog_timer_fn(struct hrtimer *hrtimer)
 356{
 357        unsigned long touch_ts = __this_cpu_read(watchdog_touch_ts);
 358        struct pt_regs *regs = get_irq_regs();
 359        int duration;
 360        int softlockup_all_cpu_backtrace = sysctl_softlockup_all_cpu_backtrace;
 361
 362        if (!watchdog_enabled)
 363                return HRTIMER_NORESTART;
 364
 365        /* kick the hardlockup detector */
 366        watchdog_interrupt_count();
 367
 368        /* kick the softlockup detector */
 369        if (completion_done(this_cpu_ptr(&softlockup_completion))) {
 370                reinit_completion(this_cpu_ptr(&softlockup_completion));
 371                stop_one_cpu_nowait(smp_processor_id(),
 372                                softlockup_fn, NULL,
 373                                this_cpu_ptr(&softlockup_stop_work));
 374        }
 375
 376        /* .. and repeat */
 377        hrtimer_forward_now(hrtimer, ns_to_ktime(sample_period));
 378
 379        if (touch_ts == 0) {
 380                if (unlikely(__this_cpu_read(softlockup_touch_sync))) {
 381                        /*
 382                         * If the time stamp was touched atomically
 383                         * make sure the scheduler tick is up to date.
 384                         */
 385                        __this_cpu_write(softlockup_touch_sync, false);
 386                        sched_clock_tick();
 387                }
 388
 389                /* Clear the guest paused flag on watchdog reset */
 390                kvm_check_and_clear_guest_paused();
 391                __touch_watchdog();
 392                return HRTIMER_RESTART;
 393        }
 394
 395        /* check for a softlockup
 396         * This is done by making sure a high priority task is
 397         * being scheduled.  The task touches the watchdog to
 398         * indicate it is getting cpu time.  If it hasn't then
 399         * this is a good indication some task is hogging the cpu
 400         */
 401        duration = is_softlockup(touch_ts);
 402        if (unlikely(duration)) {
 403                /*
 404                 * If a virtual machine is stopped by the host it can look to
 405                 * the watchdog like a soft lockup, check to see if the host
 406                 * stopped the vm before we issue the warning
 407                 */
 408                if (kvm_check_and_clear_guest_paused())
 409                        return HRTIMER_RESTART;
 410
 411                /* only warn once */
 412                if (__this_cpu_read(soft_watchdog_warn) == true) {
 413                        /*
 414                         * When multiple processes are causing softlockups the
 415                         * softlockup detector only warns on the first one
 416                         * because the code relies on a full quiet cycle to
 417                         * re-arm.  The second process prevents the quiet cycle
 418                         * and never gets reported.  Use task pointers to detect
 419                         * this.
 420                         */
 421                        if (__this_cpu_read(softlockup_task_ptr_saved) !=
 422                            current) {
 423                                __this_cpu_write(soft_watchdog_warn, false);
 424                                __touch_watchdog();
 425                        }
 426                        return HRTIMER_RESTART;
 427                }
 428
 429                if (softlockup_all_cpu_backtrace) {
 430                        /* Prevent multiple soft-lockup reports if one cpu is already
 431                         * engaged in dumping cpu back traces
 432                         */
 433                        if (test_and_set_bit(0, &soft_lockup_nmi_warn)) {
 434                                /* Someone else will report us. Let's give up */
 435                                __this_cpu_write(soft_watchdog_warn, true);
 436                                return HRTIMER_RESTART;
 437                        }
 438                }
 439
 440                pr_emerg("BUG: soft lockup - CPU#%d stuck for %us! [%s:%d]\n",
 441                        smp_processor_id(), duration,
 442                        current->comm, task_pid_nr(current));
 443                __this_cpu_write(softlockup_task_ptr_saved, current);
 444                print_modules();
 445                print_irqtrace_events(current);
 446                if (regs)
 447                        show_regs(regs);
 448                else
 449                        dump_stack();
 450
 451                if (softlockup_all_cpu_backtrace) {
 452                        /* Avoid generating two back traces for current
 453                         * given that one is already made above
 454                         */
 455                        trigger_allbutself_cpu_backtrace();
 456
 457                        clear_bit(0, &soft_lockup_nmi_warn);
 458                        /* Barrier to sync with other cpus */
 459                        smp_mb__after_atomic();
 460                }
 461
 462                add_taint(TAINT_SOFTLOCKUP, LOCKDEP_STILL_OK);
 463                if (softlockup_panic)
 464                        panic("softlockup: hung tasks");
 465                __this_cpu_write(soft_watchdog_warn, true);
 466        } else
 467                __this_cpu_write(soft_watchdog_warn, false);
 468
 469        return HRTIMER_RESTART;
 470}
 471
 472static void watchdog_enable(unsigned int cpu)
 473{
 474        struct hrtimer *hrtimer = this_cpu_ptr(&watchdog_hrtimer);
 475        struct completion *done = this_cpu_ptr(&softlockup_completion);
 476
 477        WARN_ON_ONCE(cpu != smp_processor_id());
 478
 479        init_completion(done);
 480        complete(done);
 481
 482        /*
 483         * Start the timer first to prevent the NMI watchdog triggering
 484         * before the timer has a chance to fire.
 485         */
 486        hrtimer_init(hrtimer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
 487        hrtimer->function = watchdog_timer_fn;
 488        hrtimer_start(hrtimer, ns_to_ktime(sample_period),
 489                      HRTIMER_MODE_REL_PINNED);
 490
 491        /* Initialize timestamp */
 492        __touch_watchdog();
 493        /* Enable the perf event */
 494        if (watchdog_enabled & NMI_WATCHDOG_ENABLED)
 495                watchdog_nmi_enable(cpu);
 496}
 497
 498static void watchdog_disable(unsigned int cpu)
 499{
 500        struct hrtimer *hrtimer = this_cpu_ptr(&watchdog_hrtimer);
 501
 502        WARN_ON_ONCE(cpu != smp_processor_id());
 503
 504        /*
 505         * Disable the perf event first. That prevents that a large delay
 506         * between disabling the timer and disabling the perf event causes
 507         * the perf NMI to detect a false positive.
 508         */
 509        watchdog_nmi_disable(cpu);
 510        hrtimer_cancel(hrtimer);
 511        wait_for_completion(this_cpu_ptr(&softlockup_completion));
 512}
 513
 514static int softlockup_stop_fn(void *data)
 515{
 516        watchdog_disable(smp_processor_id());
 517        return 0;
 518}
 519
 520static void softlockup_stop_all(void)
 521{
 522        int cpu;
 523
 524        if (!softlockup_initialized)
 525                return;
 526
 527        for_each_cpu(cpu, &watchdog_allowed_mask)
 528                smp_call_on_cpu(cpu, softlockup_stop_fn, NULL, false);
 529
 530        cpumask_clear(&watchdog_allowed_mask);
 531}
 532
 533static int softlockup_start_fn(void *data)
 534{
 535        watchdog_enable(smp_processor_id());
 536        return 0;
 537}
 538
 539static void softlockup_start_all(void)
 540{
 541        int cpu;
 542
 543        cpumask_copy(&watchdog_allowed_mask, &watchdog_cpumask);
 544        for_each_cpu(cpu, &watchdog_allowed_mask)
 545                smp_call_on_cpu(cpu, softlockup_start_fn, NULL, false);
 546}
 547
 548int lockup_detector_online_cpu(unsigned int cpu)
 549{
 550        watchdog_enable(cpu);
 551        return 0;
 552}
 553
 554int lockup_detector_offline_cpu(unsigned int cpu)
 555{
 556        watchdog_disable(cpu);
 557        return 0;
 558}
 559
 560static void lockup_detector_reconfigure(void)
 561{
 562        cpus_read_lock();
 563        watchdog_nmi_stop();
 564
 565        softlockup_stop_all();
 566        set_sample_period();
 567        lockup_detector_update_enable();
 568        if (watchdog_enabled && watchdog_thresh)
 569                softlockup_start_all();
 570
 571        watchdog_nmi_start();
 572        cpus_read_unlock();
 573        /*
 574         * Must be called outside the cpus locked section to prevent
 575         * recursive locking in the perf code.
 576         */
 577        __lockup_detector_cleanup();
 578}
 579
 580/*
 581 * Create the watchdog thread infrastructure and configure the detector(s).
 582 *
 583 * The threads are not unparked as watchdog_allowed_mask is empty.  When
 584 * the threads are sucessfully initialized, take the proper locks and
 585 * unpark the threads in the watchdog_cpumask if the watchdog is enabled.
 586 */
 587static __init void lockup_detector_setup(void)
 588{
 589        /*
 590         * If sysctl is off and watchdog got disabled on the command line,
 591         * nothing to do here.
 592         */
 593        lockup_detector_update_enable();
 594
 595        if (!IS_ENABLED(CONFIG_SYSCTL) &&
 596            !(watchdog_enabled && watchdog_thresh))
 597                return;
 598
 599        mutex_lock(&watchdog_mutex);
 600        lockup_detector_reconfigure();
 601        softlockup_initialized = true;
 602        mutex_unlock(&watchdog_mutex);
 603}
 604
 605#else /* CONFIG_SOFTLOCKUP_DETECTOR */
 606static void lockup_detector_reconfigure(void)
 607{
 608        cpus_read_lock();
 609        watchdog_nmi_stop();
 610        lockup_detector_update_enable();
 611        watchdog_nmi_start();
 612        cpus_read_unlock();
 613}
 614static inline void lockup_detector_setup(void)
 615{
 616        lockup_detector_reconfigure();
 617}
 618#endif /* !CONFIG_SOFTLOCKUP_DETECTOR */
 619
 620static void __lockup_detector_cleanup(void)
 621{
 622        lockdep_assert_held(&watchdog_mutex);
 623        hardlockup_detector_perf_cleanup();
 624}
 625
 626/**
 627 * lockup_detector_cleanup - Cleanup after cpu hotplug or sysctl changes
 628 *
 629 * Caller must not hold the cpu hotplug rwsem.
 630 */
 631void lockup_detector_cleanup(void)
 632{
 633        mutex_lock(&watchdog_mutex);
 634        __lockup_detector_cleanup();
 635        mutex_unlock(&watchdog_mutex);
 636}
 637
 638/**
 639 * lockup_detector_soft_poweroff - Interface to stop lockup detector(s)
 640 *
 641 * Special interface for parisc. It prevents lockup detector warnings from
 642 * the default pm_poweroff() function which busy loops forever.
 643 */
 644void lockup_detector_soft_poweroff(void)
 645{
 646        watchdog_enabled = 0;
 647}
 648
 649#ifdef CONFIG_SYSCTL
 650
 651/* Propagate any changes to the watchdog threads */
 652static void proc_watchdog_update(void)
 653{
 654        /* Remove impossible cpus to keep sysctl output clean. */
 655        cpumask_and(&watchdog_cpumask, &watchdog_cpumask, cpu_possible_mask);
 656        lockup_detector_reconfigure();
 657}
 658
 659/*
 660 * common function for watchdog, nmi_watchdog and soft_watchdog parameter
 661 *
 662 * caller             | table->data points to      | 'which'
 663 * -------------------|----------------------------|--------------------------
 664 * proc_watchdog      | watchdog_user_enabled      | NMI_WATCHDOG_ENABLED |
 665 *                    |                            | SOFT_WATCHDOG_ENABLED
 666 * -------------------|----------------------------|--------------------------
 667 * proc_nmi_watchdog  | nmi_watchdog_user_enabled  | NMI_WATCHDOG_ENABLED
 668 * -------------------|----------------------------|--------------------------
 669 * proc_soft_watchdog | soft_watchdog_user_enabled | SOFT_WATCHDOG_ENABLED
 670 */
 671static int proc_watchdog_common(int which, struct ctl_table *table, int write,
 672                                void __user *buffer, size_t *lenp, loff_t *ppos)
 673{
 674        int err, old, *param = table->data;
 675
 676        mutex_lock(&watchdog_mutex);
 677
 678        if (!write) {
 679                /*
 680                 * On read synchronize the userspace interface. This is a
 681                 * racy snapshot.
 682                 */
 683                *param = (watchdog_enabled & which) != 0;
 684                err = proc_dointvec_minmax(table, write, buffer, lenp, ppos);
 685        } else {
 686                old = READ_ONCE(*param);
 687                err = proc_dointvec_minmax(table, write, buffer, lenp, ppos);
 688                if (!err && old != READ_ONCE(*param))
 689                        proc_watchdog_update();
 690        }
 691        mutex_unlock(&watchdog_mutex);
 692        return err;
 693}
 694
 695/*
 696 * /proc/sys/kernel/watchdog
 697 */
 698int proc_watchdog(struct ctl_table *table, int write,
 699                  void __user *buffer, size_t *lenp, loff_t *ppos)
 700{
 701        return proc_watchdog_common(NMI_WATCHDOG_ENABLED|SOFT_WATCHDOG_ENABLED,
 702                                    table, write, buffer, lenp, ppos);
 703}
 704
 705/*
 706 * /proc/sys/kernel/nmi_watchdog
 707 */
 708int proc_nmi_watchdog(struct ctl_table *table, int write,
 709                      void __user *buffer, size_t *lenp, loff_t *ppos)
 710{
 711        if (!nmi_watchdog_available && write)
 712                return -ENOTSUPP;
 713        return proc_watchdog_common(NMI_WATCHDOG_ENABLED,
 714                                    table, write, buffer, lenp, ppos);
 715}
 716
 717/*
 718 * /proc/sys/kernel/soft_watchdog
 719 */
 720int proc_soft_watchdog(struct ctl_table *table, int write,
 721                        void __user *buffer, size_t *lenp, loff_t *ppos)
 722{
 723        return proc_watchdog_common(SOFT_WATCHDOG_ENABLED,
 724                                    table, write, buffer, lenp, ppos);
 725}
 726
 727/*
 728 * /proc/sys/kernel/watchdog_thresh
 729 */
 730int proc_watchdog_thresh(struct ctl_table *table, int write,
 731                         void __user *buffer, size_t *lenp, loff_t *ppos)
 732{
 733        int err, old;
 734
 735        mutex_lock(&watchdog_mutex);
 736
 737        old = READ_ONCE(watchdog_thresh);
 738        err = proc_dointvec_minmax(table, write, buffer, lenp, ppos);
 739
 740        if (!err && write && old != READ_ONCE(watchdog_thresh))
 741                proc_watchdog_update();
 742
 743        mutex_unlock(&watchdog_mutex);
 744        return err;
 745}
 746
 747/*
 748 * The cpumask is the mask of possible cpus that the watchdog can run
 749 * on, not the mask of cpus it is actually running on.  This allows the
 750 * user to specify a mask that will include cpus that have not yet
 751 * been brought online, if desired.
 752 */
 753int proc_watchdog_cpumask(struct ctl_table *table, int write,
 754                          void __user *buffer, size_t *lenp, loff_t *ppos)
 755{
 756        int err;
 757
 758        mutex_lock(&watchdog_mutex);
 759
 760        err = proc_do_large_bitmap(table, write, buffer, lenp, ppos);
 761        if (!err && write)
 762                proc_watchdog_update();
 763
 764        mutex_unlock(&watchdog_mutex);
 765        return err;
 766}
 767#endif /* CONFIG_SYSCTL */
 768
 769void __init lockup_detector_init(void)
 770{
 771        if (tick_nohz_full_enabled())
 772                pr_info("Disabling watchdog on nohz_full cores by default\n");
 773
 774        cpumask_copy(&watchdog_cpumask,
 775                     housekeeping_cpumask(HK_FLAG_TIMER));
 776
 777        if (!watchdog_nmi_probe())
 778                nmi_watchdog_available = true;
 779        lockup_detector_setup();
 780}
 781