1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */ 2aff28015SMichal Hocko #include <linux/node.h> 3aff28015SMichal Hocko #include <linux/mmzone.h> 4aff28015SMichal Hocko #include <linux/compaction.h> 5420adbe9SVlastimil Babka /* 6420adbe9SVlastimil Babka * The order of these masks is important. Matching masks will be seen 7420adbe9SVlastimil Babka * first and the left over flags will end up showing by themselves. 8420adbe9SVlastimil Babka * 9420adbe9SVlastimil Babka * For example, if we have GFP_KERNEL before GFP_USER we wil get: 10420adbe9SVlastimil Babka * 11420adbe9SVlastimil Babka * GFP_KERNEL|GFP_HARDWALL 12420adbe9SVlastimil Babka * 13420adbe9SVlastimil Babka * Thus most bits set go first. 14420adbe9SVlastimil Babka */ 15420adbe9SVlastimil Babka 16185194f1SVasily Averin #define gfpflag_string(flag) {(__force unsigned long)flag, #flag} 17185194f1SVasily Averin 18420adbe9SVlastimil Babka #define __def_gfpflag_names \ 19185194f1SVasily Averin gfpflag_string(GFP_TRANSHUGE), \ 20185194f1SVasily Averin gfpflag_string(GFP_TRANSHUGE_LIGHT), \ 21185194f1SVasily Averin gfpflag_string(GFP_HIGHUSER_MOVABLE), \ 22185194f1SVasily Averin gfpflag_string(GFP_HIGHUSER), \ 23185194f1SVasily Averin gfpflag_string(GFP_USER), \ 24185194f1SVasily Averin gfpflag_string(GFP_KERNEL_ACCOUNT), \ 25185194f1SVasily Averin gfpflag_string(GFP_KERNEL), \ 26185194f1SVasily Averin gfpflag_string(GFP_NOFS), \ 27185194f1SVasily Averin gfpflag_string(GFP_ATOMIC), \ 28185194f1SVasily Averin gfpflag_string(GFP_NOIO), \ 29185194f1SVasily Averin gfpflag_string(GFP_NOWAIT), \ 30185194f1SVasily Averin gfpflag_string(GFP_DMA), \ 31185194f1SVasily Averin gfpflag_string(__GFP_HIGHMEM), \ 32185194f1SVasily Averin gfpflag_string(GFP_DMA32), \ 33185194f1SVasily Averin gfpflag_string(__GFP_HIGH), \ 34185194f1SVasily Averin gfpflag_string(__GFP_IO), \ 35185194f1SVasily Averin gfpflag_string(__GFP_FS), \ 36185194f1SVasily Averin gfpflag_string(__GFP_NOWARN), \ 37185194f1SVasily Averin gfpflag_string(__GFP_RETRY_MAYFAIL), \ 38185194f1SVasily Averin gfpflag_string(__GFP_NOFAIL), \ 39185194f1SVasily Averin gfpflag_string(__GFP_NORETRY), \ 40185194f1SVasily Averin gfpflag_string(__GFP_COMP), \ 41185194f1SVasily Averin gfpflag_string(__GFP_ZERO), \ 42185194f1SVasily Averin gfpflag_string(__GFP_NOMEMALLOC), \ 43185194f1SVasily Averin gfpflag_string(__GFP_MEMALLOC), \ 44185194f1SVasily Averin gfpflag_string(__GFP_HARDWALL), \ 45185194f1SVasily Averin gfpflag_string(__GFP_THISNODE), \ 46185194f1SVasily Averin gfpflag_string(__GFP_RECLAIMABLE), \ 47185194f1SVasily Averin gfpflag_string(__GFP_MOVABLE), \ 48185194f1SVasily Averin gfpflag_string(__GFP_ACCOUNT), \ 49185194f1SVasily Averin gfpflag_string(__GFP_WRITE), \ 50185194f1SVasily Averin gfpflag_string(__GFP_RECLAIM), \ 51185194f1SVasily Averin gfpflag_string(__GFP_DIRECT_RECLAIM), \ 52185194f1SVasily Averin gfpflag_string(__GFP_KSWAPD_RECLAIM), \ 53185194f1SVasily Averin gfpflag_string(__GFP_ZEROTAGS) 54f49d9c5bSAndrey Konovalov 55f49d9c5bSAndrey Konovalov #ifdef CONFIG_KASAN_HW_TAGS 5653ae233cSAndrey Konovalov #define __def_gfpflag_names_kasan , \ 57185194f1SVasily Averin gfpflag_string(__GFP_SKIP_ZERO), \ 580a54864fSPeter Collingbourne gfpflag_string(__GFP_SKIP_KASAN) 59f49d9c5bSAndrey Konovalov #else 60f49d9c5bSAndrey Konovalov #define __def_gfpflag_names_kasan 61f49d9c5bSAndrey Konovalov #endif 62420adbe9SVlastimil Babka 63420adbe9SVlastimil Babka #define show_gfp_flags(flags) \ 64420adbe9SVlastimil Babka (flags) ? __print_flags(flags, "|", \ 65f49d9c5bSAndrey Konovalov __def_gfpflag_names __def_gfpflag_names_kasan \ 66420adbe9SVlastimil Babka ) : "none" 67420adbe9SVlastimil Babka 68420adbe9SVlastimil Babka #ifdef CONFIG_MMU 69e26fcc02SHyeonggon Yoo #define IF_HAVE_PG_MLOCK(_name) ,{1UL << PG_##_name, __stringify(_name)} 70420adbe9SVlastimil Babka #else 71e26fcc02SHyeonggon Yoo #define IF_HAVE_PG_MLOCK(_name) 72420adbe9SVlastimil Babka #endif 73420adbe9SVlastimil Babka 74420adbe9SVlastimil Babka #ifdef CONFIG_ARCH_USES_PG_UNCACHED 75e26fcc02SHyeonggon Yoo #define IF_HAVE_PG_UNCACHED(_name) ,{1UL << PG_##_name, __stringify(_name)} 76420adbe9SVlastimil Babka #else 77e26fcc02SHyeonggon Yoo #define IF_HAVE_PG_UNCACHED(_name) 78420adbe9SVlastimil Babka #endif 79420adbe9SVlastimil Babka 80420adbe9SVlastimil Babka #ifdef CONFIG_MEMORY_FAILURE 81e26fcc02SHyeonggon Yoo #define IF_HAVE_PG_HWPOISON(_name) ,{1UL << PG_##_name, __stringify(_name)} 82420adbe9SVlastimil Babka #else 83e26fcc02SHyeonggon Yoo #define IF_HAVE_PG_HWPOISON(_name) 84420adbe9SVlastimil Babka #endif 85420adbe9SVlastimil Babka 861c676e0dSSeongJae Park #if defined(CONFIG_PAGE_IDLE_FLAG) && defined(CONFIG_64BIT) 87e26fcc02SHyeonggon Yoo #define IF_HAVE_PG_IDLE(_name) ,{1UL << PG_##_name, __stringify(_name)} 88420adbe9SVlastimil Babka #else 89e26fcc02SHyeonggon Yoo #define IF_HAVE_PG_IDLE(_name) 90420adbe9SVlastimil Babka #endif 91420adbe9SVlastimil Babka 92b0284cd2SCatalin Marinas #ifdef CONFIG_ARCH_USES_PG_ARCH_X 93e26fcc02SHyeonggon Yoo #define IF_HAVE_PG_ARCH_X(_name) ,{1UL << PG_##_name, __stringify(_name)} 944beba948SSteven Price #else 95e26fcc02SHyeonggon Yoo #define IF_HAVE_PG_ARCH_X(_name) 964beba948SSteven Price #endif 974beba948SSteven Price 98e26fcc02SHyeonggon Yoo #define DEF_PAGEFLAG_NAME(_name) { 1UL << PG_##_name, __stringify(_name) } 99e26fcc02SHyeonggon Yoo 100420adbe9SVlastimil Babka #define __def_pageflag_names \ 101e26fcc02SHyeonggon Yoo DEF_PAGEFLAG_NAME(locked), \ 102e26fcc02SHyeonggon Yoo DEF_PAGEFLAG_NAME(waiters), \ 103e26fcc02SHyeonggon Yoo DEF_PAGEFLAG_NAME(error), \ 104e26fcc02SHyeonggon Yoo DEF_PAGEFLAG_NAME(referenced), \ 105e26fcc02SHyeonggon Yoo DEF_PAGEFLAG_NAME(uptodate), \ 106e26fcc02SHyeonggon Yoo DEF_PAGEFLAG_NAME(dirty), \ 107e26fcc02SHyeonggon Yoo DEF_PAGEFLAG_NAME(lru), \ 108e26fcc02SHyeonggon Yoo DEF_PAGEFLAG_NAME(active), \ 109e26fcc02SHyeonggon Yoo DEF_PAGEFLAG_NAME(workingset), \ 110e26fcc02SHyeonggon Yoo DEF_PAGEFLAG_NAME(slab), \ 111e26fcc02SHyeonggon Yoo DEF_PAGEFLAG_NAME(owner_priv_1), \ 112e26fcc02SHyeonggon Yoo DEF_PAGEFLAG_NAME(arch_1), \ 113e26fcc02SHyeonggon Yoo DEF_PAGEFLAG_NAME(reserved), \ 114e26fcc02SHyeonggon Yoo DEF_PAGEFLAG_NAME(private), \ 115e26fcc02SHyeonggon Yoo DEF_PAGEFLAG_NAME(private_2), \ 116e26fcc02SHyeonggon Yoo DEF_PAGEFLAG_NAME(writeback), \ 117e26fcc02SHyeonggon Yoo DEF_PAGEFLAG_NAME(head), \ 118e26fcc02SHyeonggon Yoo DEF_PAGEFLAG_NAME(mappedtodisk), \ 119e26fcc02SHyeonggon Yoo DEF_PAGEFLAG_NAME(reclaim), \ 120e26fcc02SHyeonggon Yoo DEF_PAGEFLAG_NAME(swapbacked), \ 121e26fcc02SHyeonggon Yoo DEF_PAGEFLAG_NAME(unevictable) \ 122e26fcc02SHyeonggon Yoo IF_HAVE_PG_MLOCK(mlocked) \ 123e26fcc02SHyeonggon Yoo IF_HAVE_PG_UNCACHED(uncached) \ 124e26fcc02SHyeonggon Yoo IF_HAVE_PG_HWPOISON(hwpoison) \ 125e26fcc02SHyeonggon Yoo IF_HAVE_PG_IDLE(idle) \ 126e26fcc02SHyeonggon Yoo IF_HAVE_PG_IDLE(young) \ 127e26fcc02SHyeonggon Yoo IF_HAVE_PG_ARCH_X(arch_2) \ 1280a54864fSPeter Collingbourne IF_HAVE_PG_ARCH_X(arch_3) 129420adbe9SVlastimil Babka 130420adbe9SVlastimil Babka #define show_page_flags(flags) \ 131420adbe9SVlastimil Babka (flags) ? __print_flags(flags, "|", \ 132420adbe9SVlastimil Babka __def_pageflag_names \ 133420adbe9SVlastimil Babka ) : "none" 134420adbe9SVlastimil Babka 1354c85c0beSHyeonggon Yoo #define DEF_PAGETYPE_NAME(_name) { PG_##_name, __stringify(_name) } 1364c85c0beSHyeonggon Yoo 1374c85c0beSHyeonggon Yoo #define __def_pagetype_names \ 138*2431b5f2SMatthew Wilcox (Oracle) DEF_PAGETYPE_NAME(hugetlb), \ 1394c85c0beSHyeonggon Yoo DEF_PAGETYPE_NAME(offline), \ 1404c85c0beSHyeonggon Yoo DEF_PAGETYPE_NAME(guard), \ 1414c85c0beSHyeonggon Yoo DEF_PAGETYPE_NAME(table), \ 1424c85c0beSHyeonggon Yoo DEF_PAGETYPE_NAME(buddy) 1434c85c0beSHyeonggon Yoo 144420adbe9SVlastimil Babka #if defined(CONFIG_X86) 145bcf66917SKirill A. Shutemov #define __VM_ARCH_SPECIFIC_1 {VM_PAT, "pat" } 14612564485SShawn Anastasio #elif defined(CONFIG_PPC) 14712564485SShawn Anastasio #define __VM_ARCH_SPECIFIC_1 {VM_SAO, "sao" } 1485f171577SJames Hogan #elif defined(CONFIG_PARISC) || defined(CONFIG_IA64) 149bcf66917SKirill A. Shutemov #define __VM_ARCH_SPECIFIC_1 {VM_GROWSUP, "growsup" } 150420adbe9SVlastimil Babka #elif !defined(CONFIG_MMU) 151bcf66917SKirill A. Shutemov #define __VM_ARCH_SPECIFIC_1 {VM_MAPPED_COPY,"mappedcopy" } 152420adbe9SVlastimil Babka #else 153bcf66917SKirill A. Shutemov #define __VM_ARCH_SPECIFIC_1 {VM_ARCH_1, "arch_1" } 154bcf66917SKirill A. Shutemov #endif 155bcf66917SKirill A. Shutemov 156420adbe9SVlastimil Babka #ifdef CONFIG_MEM_SOFT_DIRTY 157420adbe9SVlastimil Babka #define IF_HAVE_VM_SOFTDIRTY(flag,name) {flag, name }, 158420adbe9SVlastimil Babka #else 159420adbe9SVlastimil Babka #define IF_HAVE_VM_SOFTDIRTY(flag,name) 160420adbe9SVlastimil Babka #endif 161420adbe9SVlastimil Babka 1627677f7fdSAxel Rasmussen #ifdef CONFIG_HAVE_ARCH_USERFAULTFD_MINOR 1637677f7fdSAxel Rasmussen # define IF_HAVE_UFFD_MINOR(flag, name) {flag, name}, 1647677f7fdSAxel Rasmussen #else 1657677f7fdSAxel Rasmussen # define IF_HAVE_UFFD_MINOR(flag, name) 1667677f7fdSAxel Rasmussen #endif 1677677f7fdSAxel Rasmussen 168420adbe9SVlastimil Babka #define __def_vmaflag_names \ 169420adbe9SVlastimil Babka {VM_READ, "read" }, \ 170420adbe9SVlastimil Babka {VM_WRITE, "write" }, \ 171420adbe9SVlastimil Babka {VM_EXEC, "exec" }, \ 172420adbe9SVlastimil Babka {VM_SHARED, "shared" }, \ 173420adbe9SVlastimil Babka {VM_MAYREAD, "mayread" }, \ 174420adbe9SVlastimil Babka {VM_MAYWRITE, "maywrite" }, \ 175420adbe9SVlastimil Babka {VM_MAYEXEC, "mayexec" }, \ 176420adbe9SVlastimil Babka {VM_MAYSHARE, "mayshare" }, \ 177420adbe9SVlastimil Babka {VM_GROWSDOWN, "growsdown" }, \ 178bcf66917SKirill A. Shutemov {VM_UFFD_MISSING, "uffd_missing" }, \ 1797677f7fdSAxel Rasmussen IF_HAVE_UFFD_MINOR(VM_UFFD_MINOR, "uffd_minor" ) \ 180420adbe9SVlastimil Babka {VM_PFNMAP, "pfnmap" }, \ 181bcf66917SKirill A. Shutemov {VM_UFFD_WP, "uffd_wp" }, \ 182420adbe9SVlastimil Babka {VM_LOCKED, "locked" }, \ 183420adbe9SVlastimil Babka {VM_IO, "io" }, \ 184420adbe9SVlastimil Babka {VM_SEQ_READ, "seqread" }, \ 185420adbe9SVlastimil Babka {VM_RAND_READ, "randread" }, \ 186420adbe9SVlastimil Babka {VM_DONTCOPY, "dontcopy" }, \ 187420adbe9SVlastimil Babka {VM_DONTEXPAND, "dontexpand" }, \ 188bcf66917SKirill A. Shutemov {VM_LOCKONFAULT, "lockonfault" }, \ 189420adbe9SVlastimil Babka {VM_ACCOUNT, "account" }, \ 190420adbe9SVlastimil Babka {VM_NORESERVE, "noreserve" }, \ 191420adbe9SVlastimil Babka {VM_HUGETLB, "hugetlb" }, \ 1927e96fb57SAnshuman Khandual {VM_SYNC, "sync" }, \ 193bcf66917SKirill A. Shutemov __VM_ARCH_SPECIFIC_1 , \ 194d2cd9edeSRik van Riel {VM_WIPEONFORK, "wipeonfork" }, \ 195420adbe9SVlastimil Babka {VM_DONTDUMP, "dontdump" }, \ 196420adbe9SVlastimil Babka IF_HAVE_VM_SOFTDIRTY(VM_SOFTDIRTY, "softdirty" ) \ 197420adbe9SVlastimil Babka {VM_MIXEDMAP, "mixedmap" }, \ 198420adbe9SVlastimil Babka {VM_HUGEPAGE, "hugepage" }, \ 199420adbe9SVlastimil Babka {VM_NOHUGEPAGE, "nohugepage" }, \ 200420adbe9SVlastimil Babka {VM_MERGEABLE, "mergeable" } \ 201420adbe9SVlastimil Babka 202420adbe9SVlastimil Babka #define show_vma_flags(flags) \ 203420adbe9SVlastimil Babka (flags) ? __print_flags(flags, "|", \ 204420adbe9SVlastimil Babka __def_vmaflag_names \ 205420adbe9SVlastimil Babka ) : "none" 206aff28015SMichal Hocko 207aff28015SMichal Hocko #ifdef CONFIG_COMPACTION 208aff28015SMichal Hocko #define COMPACTION_STATUS \ 209aff28015SMichal Hocko EM( COMPACT_SKIPPED, "skipped") \ 210aff28015SMichal Hocko EM( COMPACT_DEFERRED, "deferred") \ 211aff28015SMichal Hocko EM( COMPACT_CONTINUE, "continue") \ 212aff28015SMichal Hocko EM( COMPACT_SUCCESS, "success") \ 213aff28015SMichal Hocko EM( COMPACT_PARTIAL_SKIPPED, "partial_skipped") \ 214aff28015SMichal Hocko EM( COMPACT_COMPLETE, "complete") \ 215aff28015SMichal Hocko EM( COMPACT_NO_SUITABLE_PAGE, "no_suitable_page") \ 216aff28015SMichal Hocko EM( COMPACT_NOT_SUITABLE_ZONE, "not_suitable_zone") \ 217aff28015SMichal Hocko EMe(COMPACT_CONTENDED, "contended") 21865190cffSMichal Hocko 21965190cffSMichal Hocko /* High-level compaction status feedback */ 22065190cffSMichal Hocko #define COMPACTION_FAILED 1 22165190cffSMichal Hocko #define COMPACTION_WITHDRAWN 2 22265190cffSMichal Hocko #define COMPACTION_PROGRESS 3 22365190cffSMichal Hocko 22465190cffSMichal Hocko #define compact_result_to_feedback(result) \ 22565190cffSMichal Hocko ({ \ 22665190cffSMichal Hocko enum compact_result __result = result; \ 227ecd8b292SJohannes Weiner (__result == COMPACT_COMPLETE) ? COMPACTION_FAILED : \ 228ecd8b292SJohannes Weiner (__result == COMPACT_SUCCESS) ? COMPACTION_PROGRESS : COMPACTION_WITHDRAWN; \ 22965190cffSMichal Hocko }) 23065190cffSMichal Hocko 23165190cffSMichal Hocko #define COMPACTION_FEEDBACK \ 23265190cffSMichal Hocko EM(COMPACTION_FAILED, "failed") \ 23365190cffSMichal Hocko EM(COMPACTION_WITHDRAWN, "withdrawn") \ 23465190cffSMichal Hocko EMe(COMPACTION_PROGRESS, "progress") 23565190cffSMichal Hocko 23665190cffSMichal Hocko #define COMPACTION_PRIORITY \ 23765190cffSMichal Hocko EM(COMPACT_PRIO_SYNC_FULL, "COMPACT_PRIO_SYNC_FULL") \ 23865190cffSMichal Hocko EM(COMPACT_PRIO_SYNC_LIGHT, "COMPACT_PRIO_SYNC_LIGHT") \ 23965190cffSMichal Hocko EMe(COMPACT_PRIO_ASYNC, "COMPACT_PRIO_ASYNC") 240aff28015SMichal Hocko #else 241aff28015SMichal Hocko #define COMPACTION_STATUS 24265190cffSMichal Hocko #define COMPACTION_PRIORITY 24365190cffSMichal Hocko #define COMPACTION_FEEDBACK 244aff28015SMichal Hocko #endif 245aff28015SMichal Hocko 246aff28015SMichal Hocko #ifdef CONFIG_ZONE_DMA 247aff28015SMichal Hocko #define IFDEF_ZONE_DMA(X) X 248aff28015SMichal Hocko #else 249aff28015SMichal Hocko #define IFDEF_ZONE_DMA(X) 250aff28015SMichal Hocko #endif 251aff28015SMichal Hocko 252aff28015SMichal Hocko #ifdef CONFIG_ZONE_DMA32 253aff28015SMichal Hocko #define IFDEF_ZONE_DMA32(X) X 254aff28015SMichal Hocko #else 255aff28015SMichal Hocko #define IFDEF_ZONE_DMA32(X) 256aff28015SMichal Hocko #endif 257aff28015SMichal Hocko 258aff28015SMichal Hocko #ifdef CONFIG_HIGHMEM 259aff28015SMichal Hocko #define IFDEF_ZONE_HIGHMEM(X) X 260aff28015SMichal Hocko #else 261aff28015SMichal Hocko #define IFDEF_ZONE_HIGHMEM(X) 262aff28015SMichal Hocko #endif 263aff28015SMichal Hocko 264aff28015SMichal Hocko #define ZONE_TYPE \ 265aff28015SMichal Hocko IFDEF_ZONE_DMA( EM (ZONE_DMA, "DMA")) \ 266aff28015SMichal Hocko IFDEF_ZONE_DMA32( EM (ZONE_DMA32, "DMA32")) \ 267aff28015SMichal Hocko EM (ZONE_NORMAL, "Normal") \ 268aff28015SMichal Hocko IFDEF_ZONE_HIGHMEM( EM (ZONE_HIGHMEM,"HighMem")) \ 269aff28015SMichal Hocko EMe(ZONE_MOVABLE,"Movable") 270aff28015SMichal Hocko 27132b3f297SMichal Hocko #define LRU_NAMES \ 27232b3f297SMichal Hocko EM (LRU_INACTIVE_ANON, "inactive_anon") \ 27332b3f297SMichal Hocko EM (LRU_ACTIVE_ANON, "active_anon") \ 27432b3f297SMichal Hocko EM (LRU_INACTIVE_FILE, "inactive_file") \ 27532b3f297SMichal Hocko EM (LRU_ACTIVE_FILE, "active_file") \ 27632b3f297SMichal Hocko EMe(LRU_UNEVICTABLE, "unevictable") 27732b3f297SMichal Hocko 278aff28015SMichal Hocko /* 279aff28015SMichal Hocko * First define the enums in the above macros to be exported to userspace 280aff28015SMichal Hocko * via TRACE_DEFINE_ENUM(). 281aff28015SMichal Hocko */ 282aff28015SMichal Hocko #undef EM 283aff28015SMichal Hocko #undef EMe 284aff28015SMichal Hocko #define EM(a, b) TRACE_DEFINE_ENUM(a); 285aff28015SMichal Hocko #define EMe(a, b) TRACE_DEFINE_ENUM(a); 286aff28015SMichal Hocko 287aff28015SMichal Hocko COMPACTION_STATUS 28865190cffSMichal Hocko COMPACTION_PRIORITY 2897ab0e50aSSteven Rostedt (VMware) /* COMPACTION_FEEDBACK are defines not enums. Not needed here. */ 290aff28015SMichal Hocko ZONE_TYPE 29132b3f297SMichal Hocko LRU_NAMES 292aff28015SMichal Hocko 293aff28015SMichal Hocko /* 294aff28015SMichal Hocko * Now redefine the EM() and EMe() macros to map the enums to the strings 295aff28015SMichal Hocko * that will be printed in the output. 296aff28015SMichal Hocko */ 297aff28015SMichal Hocko #undef EM 298aff28015SMichal Hocko #undef EMe 299aff28015SMichal Hocko #define EM(a, b) {a, b}, 300aff28015SMichal Hocko #define EMe(a, b) {a, b} 301