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_VMG(cond, vmg) ({ \ 93 int __ret_warn = !!(cond); \ 94 \ 95 if (unlikely(__ret_warn)) { \ 96 dump_vmg(vmg, "VM_WARN_ON_VMG(" __stringify(cond)")"); \ 97 WARN_ON(1); \ 98 } \ 99 unlikely(__ret_warn); \ 100 }) 101 102 #define VM_WARN_ON(cond) (void)WARN_ON(cond) 103 #define VM_WARN_ON_ONCE(cond) (void)WARN_ON_ONCE(cond) 104 #define VM_WARN_ONCE(cond, format...) (void)WARN_ONCE(cond, format) 105 #define VM_WARN(cond, format...) (void)WARN(cond, format) 106 #else 107 #define VM_BUG_ON(cond) BUILD_BUG_ON_INVALID(cond) 108 #define VM_BUG_ON_PAGE(cond, page) VM_BUG_ON(cond) 109 #define VM_BUG_ON_FOLIO(cond, folio) VM_BUG_ON(cond) 110 #define VM_BUG_ON_VMA(cond, vma) VM_BUG_ON(cond) 111 #define VM_BUG_ON_MM(cond, mm) VM_BUG_ON(cond) 112 #define VM_WARN_ON(cond) BUILD_BUG_ON_INVALID(cond) 113 #define VM_WARN_ON_ONCE(cond) BUILD_BUG_ON_INVALID(cond) 114 #define VM_WARN_ON_ONCE_PAGE(cond, page) BUILD_BUG_ON_INVALID(cond) 115 #define VM_WARN_ON_FOLIO(cond, folio) BUILD_BUG_ON_INVALID(cond) 116 #define VM_WARN_ON_ONCE_FOLIO(cond, folio) BUILD_BUG_ON_INVALID(cond) 117 #define VM_WARN_ON_ONCE_MM(cond, mm) BUILD_BUG_ON_INVALID(cond) 118 #define VM_WARN_ON_VMG(cond, vmg) BUILD_BUG_ON_INVALID(cond) 119 #define VM_WARN_ONCE(cond, format...) BUILD_BUG_ON_INVALID(cond) 120 #define VM_WARN(cond, format...) BUILD_BUG_ON_INVALID(cond) 121 #endif /* CONFIG_DEBUG_VM */ 122 123 #ifdef CONFIG_DEBUG_VM_IRQSOFF 124 #define VM_WARN_ON_IRQS_ENABLED() WARN_ON_ONCE(!irqs_disabled()) 125 #else 126 #define VM_WARN_ON_IRQS_ENABLED() do { } while (0) 127 #endif 128 129 #ifdef CONFIG_DEBUG_VIRTUAL 130 #define VIRTUAL_BUG_ON(cond) BUG_ON(cond) 131 #else 132 #define VIRTUAL_BUG_ON(cond) do { } while (0) 133 #endif 134 135 #ifdef CONFIG_DEBUG_VM_PGFLAGS 136 #define VM_BUG_ON_PGFLAGS(cond, page) VM_BUG_ON_PAGE(cond, page) 137 #else 138 #define VM_BUG_ON_PGFLAGS(cond, page) BUILD_BUG_ON_INVALID(cond) 139 #endif 140 141 #endif 142