1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */ 259ea7463SJiri Slaby #ifndef LINUX_MM_DEBUG_H 359ea7463SJiri Slaby #define LINUX_MM_DEBUG_H 1 459ea7463SJiri Slaby 51d5cda40SJames Morse #include <linux/bug.h> 6e4f67422SDave Hansen #include <linux/stringify.h> 7e4f67422SDave Hansen 8309381feSSasha Levin struct page; 90bf55139SSasha Levin struct vm_area_struct; 1031c9afa6SSasha Levin struct mm_struct; 11b50e195fSLiam R. Howlett struct vma_iterator; 12*b0d66d82SLorenzo Stoakes struct vma_merge_struct; 13309381feSSasha Levin 14b3a32033SMatthew Wilcox (Oracle) void dump_page(const struct page *page, const char *reason); 150bf55139SSasha Levin void dump_vma(const struct vm_area_struct *vma); 1631c9afa6SSasha Levin void dump_mm(const struct mm_struct *mm); 17*b0d66d82SLorenzo Stoakes void dump_vmg(const struct vma_merge_struct *vmg, const char *reason); 18b50e195fSLiam R. Howlett void vma_iter_dump_tree(const struct vma_iterator *vmi); 19309381feSSasha Levin 2059ea7463SJiri Slaby #ifdef CONFIG_DEBUG_VM 2159ea7463SJiri Slaby #define VM_BUG_ON(cond) BUG_ON(cond) 22309381feSSasha Levin #define VM_BUG_ON_PAGE(cond, page) \ 23e4f67422SDave Hansen do { \ 24e4f67422SDave Hansen if (unlikely(cond)) { \ 25e4f67422SDave Hansen dump_page(page, "VM_BUG_ON_PAGE(" __stringify(cond)")");\ 26e4f67422SDave Hansen BUG(); \ 27e4f67422SDave Hansen } \ 28e4f67422SDave Hansen } while (0) 299e9edb20SMatthew Wilcox (Oracle) #define VM_BUG_ON_FOLIO(cond, folio) \ 309e9edb20SMatthew Wilcox (Oracle) do { \ 319e9edb20SMatthew Wilcox (Oracle) if (unlikely(cond)) { \ 329e9edb20SMatthew Wilcox (Oracle) dump_page(&folio->page, "VM_BUG_ON_FOLIO(" __stringify(cond)")");\ 339e9edb20SMatthew Wilcox (Oracle) BUG(); \ 349e9edb20SMatthew Wilcox (Oracle) } \ 359e9edb20SMatthew Wilcox (Oracle) } while (0) 36fa3759ccSSasha Levin #define VM_BUG_ON_VMA(cond, vma) \ 37fa3759ccSSasha Levin do { \ 38fa3759ccSSasha Levin if (unlikely(cond)) { \ 39fa3759ccSSasha Levin dump_vma(vma); \ 40fa3759ccSSasha Levin BUG(); \ 41fa3759ccSSasha Levin } \ 42fa3759ccSSasha Levin } while (0) 4331c9afa6SSasha Levin #define VM_BUG_ON_MM(cond, mm) \ 4431c9afa6SSasha Levin do { \ 4531c9afa6SSasha Levin if (unlikely(cond)) { \ 4631c9afa6SSasha Levin dump_mm(mm); \ 4731c9afa6SSasha Levin BUG(); \ 4831c9afa6SSasha Levin } \ 4931c9afa6SSasha Levin } while (0) 50a4055888SAlex Shi #define VM_WARN_ON_ONCE_PAGE(cond, page) ({ \ 51dbefa1f3SMasahiro Yamada static bool __section(".data..once") __warned; \ 52a4055888SAlex Shi int __ret_warn_once = !!(cond); \ 53a4055888SAlex Shi \ 54a4055888SAlex Shi if (unlikely(__ret_warn_once && !__warned)) { \ 55a4055888SAlex Shi dump_page(page, "VM_WARN_ON_ONCE_PAGE(" __stringify(cond)")");\ 56a4055888SAlex Shi __warned = true; \ 57a4055888SAlex Shi WARN_ON(1); \ 58a4055888SAlex Shi } \ 59a4055888SAlex Shi unlikely(__ret_warn_once); \ 60a4055888SAlex Shi }) 61020bc44aSJeff Layton #define VM_WARN_ON_FOLIO(cond, folio) ({ \ 62020bc44aSJeff Layton int __ret_warn = !!(cond); \ 63020bc44aSJeff Layton \ 64020bc44aSJeff Layton if (unlikely(__ret_warn)) { \ 65020bc44aSJeff Layton dump_page(&folio->page, "VM_WARN_ON_FOLIO(" __stringify(cond)")");\ 66020bc44aSJeff Layton WARN_ON(1); \ 67020bc44aSJeff Layton } \ 68020bc44aSJeff Layton unlikely(__ret_warn); \ 69020bc44aSJeff Layton }) 709e9edb20SMatthew Wilcox (Oracle) #define VM_WARN_ON_ONCE_FOLIO(cond, folio) ({ \ 71dbefa1f3SMasahiro Yamada static bool __section(".data..once") __warned; \ 729e9edb20SMatthew Wilcox (Oracle) int __ret_warn_once = !!(cond); \ 739e9edb20SMatthew Wilcox (Oracle) \ 749e9edb20SMatthew Wilcox (Oracle) if (unlikely(__ret_warn_once && !__warned)) { \ 759e9edb20SMatthew Wilcox (Oracle) dump_page(&folio->page, "VM_WARN_ON_ONCE_FOLIO(" __stringify(cond)")");\ 769e9edb20SMatthew Wilcox (Oracle) __warned = true; \ 779e9edb20SMatthew Wilcox (Oracle) WARN_ON(1); \ 789e9edb20SMatthew Wilcox (Oracle) } \ 799e9edb20SMatthew Wilcox (Oracle) unlikely(__ret_warn_once); \ 809e9edb20SMatthew Wilcox (Oracle) }) 81b50e195fSLiam R. Howlett #define VM_WARN_ON_ONCE_MM(cond, mm) ({ \ 82dbefa1f3SMasahiro Yamada static bool __section(".data..once") __warned; \ 83b50e195fSLiam R. Howlett int __ret_warn_once = !!(cond); \ 84b50e195fSLiam R. Howlett \ 85b50e195fSLiam R. Howlett if (unlikely(__ret_warn_once && !__warned)) { \ 86b50e195fSLiam R. Howlett dump_mm(mm); \ 87b50e195fSLiam R. Howlett __warned = true; \ 88b50e195fSLiam R. Howlett WARN_ON(1); \ 89b50e195fSLiam R. Howlett } \ 90b50e195fSLiam R. Howlett unlikely(__ret_warn_once); \ 91b50e195fSLiam R. Howlett }) 92*b0d66d82SLorenzo Stoakes #define VM_WARN_ON_VMG(cond, vmg) ({ \ 93*b0d66d82SLorenzo Stoakes int __ret_warn = !!(cond); \ 94*b0d66d82SLorenzo Stoakes \ 95*b0d66d82SLorenzo Stoakes if (unlikely(__ret_warn)) { \ 96*b0d66d82SLorenzo Stoakes dump_vmg(vmg, "VM_WARN_ON_VMG(" __stringify(cond)")"); \ 97*b0d66d82SLorenzo Stoakes WARN_ON(1); \ 98*b0d66d82SLorenzo Stoakes } \ 99*b0d66d82SLorenzo Stoakes unlikely(__ret_warn); \ 100*b0d66d82SLorenzo Stoakes }) 101a4055888SAlex Shi 10291241681SMichal Hocko #define VM_WARN_ON(cond) (void)WARN_ON(cond) 10391241681SMichal Hocko #define VM_WARN_ON_ONCE(cond) (void)WARN_ON_ONCE(cond) 10491241681SMichal Hocko #define VM_WARN_ONCE(cond, format...) (void)WARN_ONCE(cond, format) 10591241681SMichal Hocko #define VM_WARN(cond, format...) (void)WARN(cond, format) 10659ea7463SJiri Slaby #else 10702602a18SKonstantin Khlebnikov #define VM_BUG_ON(cond) BUILD_BUG_ON_INVALID(cond) 108309381feSSasha Levin #define VM_BUG_ON_PAGE(cond, page) VM_BUG_ON(cond) 1099e9edb20SMatthew Wilcox (Oracle) #define VM_BUG_ON_FOLIO(cond, folio) VM_BUG_ON(cond) 110fa3759ccSSasha Levin #define VM_BUG_ON_VMA(cond, vma) VM_BUG_ON(cond) 11131c9afa6SSasha Levin #define VM_BUG_ON_MM(cond, mm) VM_BUG_ON(cond) 11202a8efedSAndrew Morton #define VM_WARN_ON(cond) BUILD_BUG_ON_INVALID(cond) 11302a8efedSAndrew Morton #define VM_WARN_ON_ONCE(cond) BUILD_BUG_ON_INVALID(cond) 114a4055888SAlex Shi #define VM_WARN_ON_ONCE_PAGE(cond, page) BUILD_BUG_ON_INVALID(cond) 115020bc44aSJeff Layton #define VM_WARN_ON_FOLIO(cond, folio) BUILD_BUG_ON_INVALID(cond) 1169e9edb20SMatthew Wilcox (Oracle) #define VM_WARN_ON_ONCE_FOLIO(cond, folio) BUILD_BUG_ON_INVALID(cond) 117b50e195fSLiam R. Howlett #define VM_WARN_ON_ONCE_MM(cond, mm) BUILD_BUG_ON_INVALID(cond) 118*b0d66d82SLorenzo Stoakes #define VM_WARN_ON_VMG(cond, vmg) BUILD_BUG_ON_INVALID(cond) 119ef6b571fSAndrew Morton #define VM_WARN_ONCE(cond, format...) BUILD_BUG_ON_INVALID(cond) 120a54f9aebSAneesh Kumar K.V #define VM_WARN(cond, format...) BUILD_BUG_ON_INVALID(cond) 121*b0d66d82SLorenzo Stoakes #endif /* CONFIG_DEBUG_VM */ 12259ea7463SJiri Slaby 123a738e9baSThomas Gleixner #ifdef CONFIG_DEBUG_VM_IRQSOFF 124a738e9baSThomas Gleixner #define VM_WARN_ON_IRQS_ENABLED() WARN_ON_ONCE(!irqs_disabled()) 125a738e9baSThomas Gleixner #else 126a738e9baSThomas Gleixner #define VM_WARN_ON_IRQS_ENABLED() do { } while (0) 127a738e9baSThomas Gleixner #endif 128a738e9baSThomas Gleixner 12959ea7463SJiri Slaby #ifdef CONFIG_DEBUG_VIRTUAL 13059ea7463SJiri Slaby #define VIRTUAL_BUG_ON(cond) BUG_ON(cond) 13159ea7463SJiri Slaby #else 13259ea7463SJiri Slaby #define VIRTUAL_BUG_ON(cond) do { } while (0) 13359ea7463SJiri Slaby #endif 13459ea7463SJiri Slaby 13595ad9755SKirill A. Shutemov #ifdef CONFIG_DEBUG_VM_PGFLAGS 13695ad9755SKirill A. Shutemov #define VM_BUG_ON_PGFLAGS(cond, page) VM_BUG_ON_PAGE(cond, page) 13795ad9755SKirill A. Shutemov #else 13895ad9755SKirill A. Shutemov #define VM_BUG_ON_PGFLAGS(cond, page) BUILD_BUG_ON_INVALID(cond) 13995ad9755SKirill A. Shutemov #endif 14095ad9755SKirill A. Shutemov 14159ea7463SJiri Slaby #endif 142