mmdebug.h 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. #ifndef LINUX_MM_DEBUG_H
  3. #define LINUX_MM_DEBUG_H 1
  4. #include <linux/bug.h>
  5. #include <linux/stringify.h>
  6. struct page;
  7. struct vm_area_struct;
  8. struct mm_struct;
  9. void dump_page(struct page *page, const char *reason);
  10. void dump_vma(const struct vm_area_struct *vma);
  11. void dump_mm(const struct mm_struct *mm);
  12. #ifdef CONFIG_DEBUG_VM
  13. #define VM_BUG_ON(cond) BUG_ON(cond)
  14. #define VM_BUG_ON_PAGE(cond, page) \
  15. do { \
  16. if (unlikely(cond)) { \
  17. dump_page(page, "VM_BUG_ON_PAGE(" __stringify(cond)")");\
  18. BUG(); \
  19. } \
  20. } while (0)
  21. #define VM_BUG_ON_FOLIO(cond, folio) \
  22. do { \
  23. if (unlikely(cond)) { \
  24. dump_page(&folio->page, "VM_BUG_ON_FOLIO(" __stringify(cond)")");\
  25. BUG(); \
  26. } \
  27. } while (0)
  28. #define VM_BUG_ON_VMA(cond, vma) \
  29. do { \
  30. if (unlikely(cond)) { \
  31. dump_vma(vma); \
  32. BUG(); \
  33. } \
  34. } while (0)
  35. #define VM_BUG_ON_MM(cond, mm) \
  36. do { \
  37. if (unlikely(cond)) { \
  38. dump_mm(mm); \
  39. BUG(); \
  40. } \
  41. } while (0)
  42. #define VM_WARN_ON_ONCE_PAGE(cond, page) ({ \
  43. static bool __section(".data.once") __warned; \
  44. int __ret_warn_once = !!(cond); \
  45. \
  46. if (unlikely(__ret_warn_once && !__warned)) { \
  47. dump_page(page, "VM_WARN_ON_ONCE_PAGE(" __stringify(cond)")");\
  48. __warned = true; \
  49. WARN_ON(1); \
  50. } \
  51. unlikely(__ret_warn_once); \
  52. })
  53. #define VM_WARN_ON_FOLIO(cond, folio) ({ \
  54. int __ret_warn = !!(cond); \
  55. \
  56. if (unlikely(__ret_warn)) { \
  57. dump_page(&folio->page, "VM_WARN_ON_FOLIO(" __stringify(cond)")");\
  58. WARN_ON(1); \
  59. } \
  60. unlikely(__ret_warn); \
  61. })
  62. #define VM_WARN_ON_ONCE_FOLIO(cond, folio) ({ \
  63. static bool __section(".data.once") __warned; \
  64. int __ret_warn_once = !!(cond); \
  65. \
  66. if (unlikely(__ret_warn_once && !__warned)) { \
  67. dump_page(&folio->page, "VM_WARN_ON_ONCE_FOLIO(" __stringify(cond)")");\
  68. __warned = true; \
  69. WARN_ON(1); \
  70. } \
  71. unlikely(__ret_warn_once); \
  72. })
  73. #define VM_WARN_ON(cond) (void)WARN_ON(cond)
  74. #define VM_WARN_ON_ONCE(cond) (void)WARN_ON_ONCE(cond)
  75. #define VM_WARN_ONCE(cond, format...) (void)WARN_ONCE(cond, format)
  76. #define VM_WARN(cond, format...) (void)WARN(cond, format)
  77. #else
  78. #define VM_BUG_ON(cond) BUILD_BUG_ON_INVALID(cond)
  79. #define VM_BUG_ON_PAGE(cond, page) VM_BUG_ON(cond)
  80. #define VM_BUG_ON_FOLIO(cond, folio) VM_BUG_ON(cond)
  81. #define VM_BUG_ON_VMA(cond, vma) VM_BUG_ON(cond)
  82. #define VM_BUG_ON_MM(cond, mm) VM_BUG_ON(cond)
  83. #define VM_WARN_ON(cond) BUILD_BUG_ON_INVALID(cond)
  84. #define VM_WARN_ON_ONCE(cond) BUILD_BUG_ON_INVALID(cond)
  85. #define VM_WARN_ON_ONCE_PAGE(cond, page) BUILD_BUG_ON_INVALID(cond)
  86. #define VM_WARN_ON_FOLIO(cond, folio) BUILD_BUG_ON_INVALID(cond)
  87. #define VM_WARN_ON_ONCE_FOLIO(cond, folio) BUILD_BUG_ON_INVALID(cond)
  88. #define VM_WARN_ONCE(cond, format...) BUILD_BUG_ON_INVALID(cond)
  89. #define VM_WARN(cond, format...) BUILD_BUG_ON_INVALID(cond)
  90. #endif
  91. #ifdef CONFIG_DEBUG_VM_IRQSOFF
  92. #define VM_WARN_ON_IRQS_ENABLED() WARN_ON_ONCE(!irqs_disabled())
  93. #else
  94. #define VM_WARN_ON_IRQS_ENABLED() do { } while (0)
  95. #endif
  96. #ifdef CONFIG_DEBUG_VIRTUAL
  97. #define VIRTUAL_BUG_ON(cond) BUG_ON(cond)
  98. #else
  99. #define VIRTUAL_BUG_ON(cond) do { } while (0)
  100. #endif
  101. #ifdef CONFIG_DEBUG_VM_PGFLAGS
  102. #define VM_BUG_ON_PGFLAGS(cond, page) VM_BUG_ON_PAGE(cond, page)
  103. #else
  104. #define VM_BUG_ON_PGFLAGS(cond, page) BUILD_BUG_ON_INVALID(cond)
  105. #endif
  106. #endif