at v6.17-rc3 4.8 kB view raw
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 8struct page; 9struct vm_area_struct; 10struct mm_struct; 11struct vma_iterator; 12struct vma_merge_struct; 13 14void dump_page(const struct page *page, const char *reason); 15void dump_vma(const struct vm_area_struct *vma); 16void dump_mm(const struct mm_struct *mm); 17void dump_vmg(const struct vma_merge_struct *vmg, const char *reason); 18void 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