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