1 /* SPDX-License-Identifier: GPL-2.0 */ 2 #ifndef LINUX_MM_DEBUG_H 3 #define LINUX_MM_DEBUG_H 1 4 5 #include <linux/bug.h> 6 #include <linux/stringify.h> 7 8 struct page; 9 struct vm_area_struct; 10 struct mm_struct; 11 struct vma_iterator; 12 struct vma_merge_struct; 13 14 void dump_page(const struct page *page, const char *reason); 15 void dump_vma(const struct vm_area_struct *vma); 16 void dump_mm(const struct mm_struct *mm); 17 void dump_vmg(const struct vma_merge_struct *vmg, const char *reason); 18 void vma_iter_dump_tree(const struct vma_iterator *vmi); 19 20 #ifdef CONFIG_DEBUG_VM 21 #define VM_BUG_ON(cond) BUG_ON(cond) 22 #define VM_BUG_ON_PAGE(cond, page) \ 23 do { \ 24 if (unlikely(cond)) { \ 25 dump_page(page, "VM_BUG_ON_PAGE(" __stringify(cond)")");\ 26 BUG(); \ 27 } \ 28 } while (0) 29 #define VM_BUG_ON_FOLIO(cond, folio) \ 30 do { \ 31 if (unlikely(cond)) { \ 32 dump_page(&folio->page, "VM_BUG_ON_FOLIO(" __stringify(cond)")");\ 33 BUG(); \ 34 } \ 35 } while (0) 36 #define VM_BUG_ON_VMA(cond, vma) \ 37 do { \ 38 if (unlikely(cond)) { \ 39 dump_vma(vma); \ 40 BUG(); \ 41 } \ 42 } while (0) 43 #define VM_BUG_ON_MM(cond, mm) \ 44 do { \ 45 if (unlikely(cond)) { \ 46 dump_mm(mm); \ 47 BUG(); \ 48 } \ 49 } while (0) 50 #define VM_WARN_ON_ONCE_PAGE(cond, page) ({ \ 51 static bool __section(".data..once") __warned; \ 52 int __ret_warn_once = !!(cond); \ 53 \ 54 if (unlikely(__ret_warn_once && !__warned)) { \ 55 dump_page(page, "VM_WARN_ON_ONCE_PAGE(" __stringify(cond)")");\ 56 __warned = true; \ 57 WARN_ON(1); \ 58 } \ 59 unlikely(__ret_warn_once); \ 60 }) 61 #define VM_WARN_ON_FOLIO(cond, folio) ({ \ 62 int __ret_warn = !!(cond); \ 63 \ 64 if (unlikely(__ret_warn)) { \ 65 dump_page(&folio->page, "VM_WARN_ON_FOLIO(" __stringify(cond)")");\ 66 WARN_ON(1); \ 67 } \ 68 unlikely(__ret_warn); \ 69 }) 70 #define VM_WARN_ON_ONCE_FOLIO(cond, folio) ({ \ 71 static bool __section(".data..once") __warned; \ 72 int __ret_warn_once = !!(cond); \ 73 \ 74 if (unlikely(__ret_warn_once && !__warned)) { \ 75 dump_page(&folio->page, "VM_WARN_ON_ONCE_FOLIO(" __stringify(cond)")");\ 76 __warned = true; \ 77 WARN_ON(1); \ 78 } \ 79 unlikely(__ret_warn_once); \ 80 }) 81 #define VM_WARN_ON_ONCE_MM(cond, mm) ({ \ 82 static bool __section(".data..once") __warned; \ 83 int __ret_warn_once = !!(cond); \ 84 \ 85 if (unlikely(__ret_warn_once && !__warned)) { \ 86 dump_mm(mm); \ 87 __warned = true; \ 88 WARN_ON(1); \ 89 } \ 90 unlikely(__ret_warn_once); \ 91 }) 92 #define VM_WARN_ON_ONCE_VMA(cond, vma) ({ \ 93 static bool __section(".data..once") __warned; \ 94 int __ret_warn_once = !!(cond); \ 95 \ 96 if (unlikely(__ret_warn_once && !__warned)) { \ 97 dump_vma(vma); \ 98 __warned = true; \ 99 WARN_ON(1); \ 100 } \ 101 unlikely(__ret_warn_once); \ 102 }) 103 #define VM_WARN_ON_VMG(cond, vmg) ({ \ 104 int __ret_warn = !!(cond); \ 105 \ 106 if (unlikely(__ret_warn)) { \ 107 dump_vmg(vmg, "VM_WARN_ON_VMG(" __stringify(cond)")"); \ 108 WARN_ON(1); \ 109 } \ 110 unlikely(__ret_warn); \ 111 }) 112 113 #define VM_WARN_ON(cond) (void)WARN_ON(cond) 114 #define VM_WARN_ON_ONCE(cond) (void)WARN_ON_ONCE(cond) 115 #define VM_WARN_ONCE(cond, format...) (void)WARN_ONCE(cond, format) 116 #define VM_WARN(cond, format...) (void)WARN(cond, format) 117 #else 118 #define VM_BUG_ON(cond) BUILD_BUG_ON_INVALID(cond) 119 #define VM_BUG_ON_PAGE(cond, page) VM_BUG_ON(cond) 120 #define VM_BUG_ON_FOLIO(cond, folio) VM_BUG_ON(cond) 121 #define VM_BUG_ON_VMA(cond, vma) VM_BUG_ON(cond) 122 #define VM_BUG_ON_MM(cond, mm) VM_BUG_ON(cond) 123 #define VM_WARN_ON(cond) BUILD_BUG_ON_INVALID(cond) 124 #define VM_WARN_ON_ONCE(cond) BUILD_BUG_ON_INVALID(cond) 125 #define VM_WARN_ON_ONCE_PAGE(cond, page) BUILD_BUG_ON_INVALID(cond) 126 #define VM_WARN_ON_FOLIO(cond, folio) BUILD_BUG_ON_INVALID(cond) 127 #define VM_WARN_ON_ONCE_FOLIO(cond, folio) BUILD_BUG_ON_INVALID(cond) 128 #define VM_WARN_ON_ONCE_MM(cond, mm) BUILD_BUG_ON_INVALID(cond) 129 #define VM_WARN_ON_ONCE_VMA(cond, vma) BUILD_BUG_ON_INVALID(cond) 130 #define VM_WARN_ON_VMG(cond, vmg) BUILD_BUG_ON_INVALID(cond) 131 #define VM_WARN_ONCE(cond, format...) BUILD_BUG_ON_INVALID(cond) 132 #define VM_WARN(cond, format...) BUILD_BUG_ON_INVALID(cond) 133 #endif /* CONFIG_DEBUG_VM */ 134 135 #ifdef CONFIG_DEBUG_VM_IRQSOFF 136 #define VM_WARN_ON_IRQS_ENABLED() WARN_ON_ONCE(!irqs_disabled()) 137 #else 138 #define VM_WARN_ON_IRQS_ENABLED() do { } while (0) 139 #endif 140 141 #ifdef CONFIG_DEBUG_VIRTUAL 142 #define VIRTUAL_BUG_ON(cond) BUG_ON(cond) 143 #else 144 #define VIRTUAL_BUG_ON(cond) do { } while (0) 145 #endif 146 147 #ifdef CONFIG_DEBUG_VM_PGFLAGS 148 #define VM_BUG_ON_PGFLAGS(cond, page) VM_BUG_ON_PAGE(cond, page) 149 #else 150 #define VM_BUG_ON_PGFLAGS(cond, page) BUILD_BUG_ON_INVALID(cond) 151 #endif 152 153 #endif 154