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