hw_nmi.c 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. /*
  2. * HW NMI watchdog support
  3. *
  4. * started by Don Zickus, Copyright (C) 2010 Red Hat, Inc.
  5. *
  6. * Arch specific calls to support NMI watchdog
  7. *
  8. * Bits copied from original nmi.c file
  9. *
  10. */
  11. #include <asm/apic.h>
  12. #include <asm/nmi.h>
  13. #include <linux/cpumask.h>
  14. #include <linux/kdebug.h>
  15. #include <linux/notifier.h>
  16. #include <linux/kprobes.h>
  17. #include <linux/nmi.h>
  18. #include <linux/module.h>
  19. #include <linux/delay.h>
  20. #include <linux/seq_buf.h>
  21. #ifdef CONFIG_HARDLOCKUP_DETECTOR
  22. u64 hw_nmi_get_sample_period(int watchdog_thresh)
  23. {
  24. return (u64)(cpu_khz) * 1000 * watchdog_thresh;
  25. }
  26. #endif
  27. #ifdef arch_trigger_all_cpu_backtrace
  28. /* For reliability, we're prepared to waste bits here. */
  29. static DECLARE_BITMAP(backtrace_mask, NR_CPUS) __read_mostly;
  30. static cpumask_t printtrace_mask;
  31. #define NMI_BUF_SIZE 4096
  32. struct nmi_seq_buf {
  33. unsigned char buffer[NMI_BUF_SIZE];
  34. struct seq_buf seq;
  35. };
  36. /* Safe printing in NMI context */
  37. static DEFINE_PER_CPU(struct nmi_seq_buf, nmi_print_seq);
  38. /* "in progress" flag of arch_trigger_all_cpu_backtrace */
  39. static unsigned long backtrace_flag;
  40. static void print_seq_line(struct nmi_seq_buf *s, int start, int end)
  41. {
  42. const char *buf = s->buffer + start;
  43. printk("%.*s", (end - start) + 1, buf);
  44. }
  45. void arch_trigger_all_cpu_backtrace(bool include_self)
  46. {
  47. struct nmi_seq_buf *s;
  48. int len;
  49. int cpu;
  50. int i;
  51. int this_cpu = get_cpu();
  52. if (test_and_set_bit(0, &backtrace_flag)) {
  53. /*
  54. * If there is already a trigger_all_cpu_backtrace() in progress
  55. * (backtrace_flag == 1), don't output double cpu dump infos.
  56. */
  57. put_cpu();
  58. return;
  59. }
  60. cpumask_copy(to_cpumask(backtrace_mask), cpu_online_mask);
  61. if (!include_self)
  62. cpumask_clear_cpu(this_cpu, to_cpumask(backtrace_mask));
  63. cpumask_copy(&printtrace_mask, to_cpumask(backtrace_mask));
  64. /*
  65. * Set up per_cpu seq_buf buffers that the NMIs running on the other
  66. * CPUs will write to.
  67. */
  68. for_each_cpu(cpu, to_cpumask(backtrace_mask)) {
  69. s = &per_cpu(nmi_print_seq, cpu);
  70. seq_buf_init(&s->seq, s->buffer, NMI_BUF_SIZE);
  71. }
  72. if (!cpumask_empty(to_cpumask(backtrace_mask))) {
  73. pr_info("sending NMI to %s CPUs:\n",
  74. (include_self ? "all" : "other"));
  75. apic->send_IPI_mask(to_cpumask(backtrace_mask), NMI_VECTOR);
  76. }
  77. /* Wait for up to 10 seconds for all CPUs to do the backtrace */
  78. for (i = 0; i < 10 * 1000; i++) {
  79. if (cpumask_empty(to_cpumask(backtrace_mask)))
  80. break;
  81. mdelay(1);
  82. touch_softlockup_watchdog();
  83. }
  84. /*
  85. * Now that all the NMIs have triggered, we can dump out their
  86. * back traces safely to the console.
  87. */
  88. for_each_cpu(cpu, &printtrace_mask) {
  89. int last_i = 0;
  90. s = &per_cpu(nmi_print_seq, cpu);
  91. len = seq_buf_used(&s->seq);
  92. if (!len)
  93. continue;
  94. /* Print line by line. */
  95. for (i = 0; i < len; i++) {
  96. if (s->buffer[i] == '\n') {
  97. print_seq_line(s, last_i, i);
  98. last_i = i + 1;
  99. }
  100. }
  101. /* Check if there was a partial line. */
  102. if (last_i < len) {
  103. print_seq_line(s, last_i, len - 1);
  104. pr_cont("\n");
  105. }
  106. }
  107. clear_bit(0, &backtrace_flag);
  108. smp_mb__after_atomic();
  109. put_cpu();
  110. }
  111. /*
  112. * It is not safe to call printk() directly from NMI handlers.
  113. * It may be fine if the NMI detected a lock up and we have no choice
  114. * but to do so, but doing a NMI on all other CPUs to get a back trace
  115. * can be done with a sysrq-l. We don't want that to lock up, which
  116. * can happen if the NMI interrupts a printk in progress.
  117. *
  118. * Instead, we redirect the vprintk() to this nmi_vprintk() that writes
  119. * the content into a per cpu seq_buf buffer. Then when the NMIs are
  120. * all done, we can safely dump the contents of the seq_buf to a printk()
  121. * from a non NMI context.
  122. */
  123. static int nmi_vprintk(const char *fmt, va_list args)
  124. {
  125. struct nmi_seq_buf *s = this_cpu_ptr(&nmi_print_seq);
  126. unsigned int len = seq_buf_used(&s->seq);
  127. seq_buf_vprintf(&s->seq, fmt, args);
  128. return seq_buf_used(&s->seq) - len;
  129. }
  130. static int
  131. arch_trigger_all_cpu_backtrace_handler(unsigned int cmd, struct pt_regs *regs)
  132. {
  133. int cpu;
  134. cpu = smp_processor_id();
  135. if (cpumask_test_cpu(cpu, to_cpumask(backtrace_mask))) {
  136. printk_func_t printk_func_save = this_cpu_read(printk_func);
  137. /* Replace printk to write into the NMI seq */
  138. this_cpu_write(printk_func, nmi_vprintk);
  139. printk(KERN_WARNING "NMI backtrace for cpu %d\n", cpu);
  140. show_regs(regs);
  141. this_cpu_write(printk_func, printk_func_save);
  142. cpumask_clear_cpu(cpu, to_cpumask(backtrace_mask));
  143. return NMI_HANDLED;
  144. }
  145. return NMI_DONE;
  146. }
  147. NOKPROBE_SYMBOL(arch_trigger_all_cpu_backtrace_handler);
  148. static int __init register_trigger_all_cpu_backtrace(void)
  149. {
  150. register_nmi_handler(NMI_LOCAL, arch_trigger_all_cpu_backtrace_handler,
  151. 0, "arch_bt");
  152. return 0;
  153. }
  154. early_initcall(register_trigger_all_cpu_backtrace);
  155. #endif