Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 #include <linux/node.h>
0003 #include <linux/mmzone.h>
0004 #include <linux/compaction.h>
0005 /*
0006  * The order of these masks is important. Matching masks will be seen
0007  * first and the left over flags will end up showing by themselves.
0008  *
0009  * For example, if we have GFP_KERNEL before GFP_USER we wil get:
0010  *
0011  *  GFP_KERNEL|GFP_HARDWALL
0012  *
0013  * Thus most bits set go first.
0014  */
0015 
0016 #define gfpflag_string(flag) {(__force unsigned long)flag, #flag}
0017 
0018 #define __def_gfpflag_names         \
0019     gfpflag_string(GFP_TRANSHUGE),      \
0020     gfpflag_string(GFP_TRANSHUGE_LIGHT),    \
0021     gfpflag_string(GFP_HIGHUSER_MOVABLE),   \
0022     gfpflag_string(GFP_HIGHUSER),       \
0023     gfpflag_string(GFP_USER),       \
0024     gfpflag_string(GFP_KERNEL_ACCOUNT), \
0025     gfpflag_string(GFP_KERNEL),     \
0026     gfpflag_string(GFP_NOFS),       \
0027     gfpflag_string(GFP_ATOMIC),     \
0028     gfpflag_string(GFP_NOIO),       \
0029     gfpflag_string(GFP_NOWAIT),     \
0030     gfpflag_string(GFP_DMA),        \
0031     gfpflag_string(__GFP_HIGHMEM),      \
0032     gfpflag_string(GFP_DMA32),      \
0033     gfpflag_string(__GFP_HIGH),     \
0034     gfpflag_string(__GFP_ATOMIC),       \
0035     gfpflag_string(__GFP_IO),       \
0036     gfpflag_string(__GFP_FS),       \
0037     gfpflag_string(__GFP_NOWARN),       \
0038     gfpflag_string(__GFP_RETRY_MAYFAIL),    \
0039     gfpflag_string(__GFP_NOFAIL),       \
0040     gfpflag_string(__GFP_NORETRY),      \
0041     gfpflag_string(__GFP_COMP),     \
0042     gfpflag_string(__GFP_ZERO),     \
0043     gfpflag_string(__GFP_NOMEMALLOC),   \
0044     gfpflag_string(__GFP_MEMALLOC),     \
0045     gfpflag_string(__GFP_HARDWALL),     \
0046     gfpflag_string(__GFP_THISNODE),     \
0047     gfpflag_string(__GFP_RECLAIMABLE),  \
0048     gfpflag_string(__GFP_MOVABLE),      \
0049     gfpflag_string(__GFP_ACCOUNT),      \
0050     gfpflag_string(__GFP_WRITE),        \
0051     gfpflag_string(__GFP_RECLAIM),      \
0052     gfpflag_string(__GFP_DIRECT_RECLAIM),   \
0053     gfpflag_string(__GFP_KSWAPD_RECLAIM),   \
0054     gfpflag_string(__GFP_ZEROTAGS)
0055 
0056 #ifdef CONFIG_KASAN_HW_TAGS
0057 #define __def_gfpflag_names_kasan ,         \
0058     gfpflag_string(__GFP_SKIP_ZERO),        \
0059     gfpflag_string(__GFP_SKIP_KASAN_POISON),    \
0060     gfpflag_string(__GFP_SKIP_KASAN_UNPOISON)
0061 #else
0062 #define __def_gfpflag_names_kasan
0063 #endif
0064 
0065 #define show_gfp_flags(flags)                       \
0066     (flags) ? __print_flags(flags, "|",             \
0067     __def_gfpflag_names __def_gfpflag_names_kasan           \
0068     ) : "none"
0069 
0070 #ifdef CONFIG_MMU
0071 #define IF_HAVE_PG_MLOCK(flag,string) ,{1UL << flag, string}
0072 #else
0073 #define IF_HAVE_PG_MLOCK(flag,string)
0074 #endif
0075 
0076 #ifdef CONFIG_ARCH_USES_PG_UNCACHED
0077 #define IF_HAVE_PG_UNCACHED(flag,string) ,{1UL << flag, string}
0078 #else
0079 #define IF_HAVE_PG_UNCACHED(flag,string)
0080 #endif
0081 
0082 #ifdef CONFIG_MEMORY_FAILURE
0083 #define IF_HAVE_PG_HWPOISON(flag,string) ,{1UL << flag, string}
0084 #else
0085 #define IF_HAVE_PG_HWPOISON(flag,string)
0086 #endif
0087 
0088 #if defined(CONFIG_PAGE_IDLE_FLAG) && defined(CONFIG_64BIT)
0089 #define IF_HAVE_PG_IDLE(flag,string) ,{1UL << flag, string}
0090 #else
0091 #define IF_HAVE_PG_IDLE(flag,string)
0092 #endif
0093 
0094 #ifdef CONFIG_64BIT
0095 #define IF_HAVE_PG_ARCH_2(flag,string) ,{1UL << flag, string}
0096 #else
0097 #define IF_HAVE_PG_ARCH_2(flag,string)
0098 #endif
0099 
0100 #ifdef CONFIG_KASAN_HW_TAGS
0101 #define IF_HAVE_PG_SKIP_KASAN_POISON(flag,string) ,{1UL << flag, string}
0102 #else
0103 #define IF_HAVE_PG_SKIP_KASAN_POISON(flag,string)
0104 #endif
0105 
0106 #define __def_pageflag_names                        \
0107     {1UL << PG_locked,      "locked"    },      \
0108     {1UL << PG_waiters,     "waiters"   },      \
0109     {1UL << PG_error,       "error"     },      \
0110     {1UL << PG_referenced,      "referenced"    },      \
0111     {1UL << PG_uptodate,        "uptodate"  },      \
0112     {1UL << PG_dirty,       "dirty"     },      \
0113     {1UL << PG_lru,         "lru"       },      \
0114     {1UL << PG_active,      "active"    },      \
0115     {1UL << PG_workingset,      "workingset"    },      \
0116     {1UL << PG_slab,        "slab"      },      \
0117     {1UL << PG_owner_priv_1,    "owner_priv_1"  },      \
0118     {1UL << PG_arch_1,      "arch_1"    },      \
0119     {1UL << PG_reserved,        "reserved"  },      \
0120     {1UL << PG_private,     "private"   },      \
0121     {1UL << PG_private_2,       "private_2" },      \
0122     {1UL << PG_writeback,       "writeback" },      \
0123     {1UL << PG_head,        "head"      },      \
0124     {1UL << PG_mappedtodisk,    "mappedtodisk"  },      \
0125     {1UL << PG_reclaim,     "reclaim"   },      \
0126     {1UL << PG_swapbacked,      "swapbacked"    },      \
0127     {1UL << PG_unevictable,     "unevictable"   }       \
0128 IF_HAVE_PG_MLOCK(PG_mlocked,        "mlocked"   )       \
0129 IF_HAVE_PG_UNCACHED(PG_uncached,    "uncached"  )       \
0130 IF_HAVE_PG_HWPOISON(PG_hwpoison,    "hwpoison"  )       \
0131 IF_HAVE_PG_IDLE(PG_young,       "young"     )       \
0132 IF_HAVE_PG_IDLE(PG_idle,        "idle"      )       \
0133 IF_HAVE_PG_ARCH_2(PG_arch_2,        "arch_2"    )       \
0134 IF_HAVE_PG_SKIP_KASAN_POISON(PG_skip_kasan_poison, "skip_kasan_poison")
0135 
0136 #define show_page_flags(flags)                      \
0137     (flags) ? __print_flags(flags, "|",             \
0138     __def_pageflag_names                        \
0139     ) : "none"
0140 
0141 #if defined(CONFIG_X86)
0142 #define __VM_ARCH_SPECIFIC_1 {VM_PAT,     "pat"           }
0143 #elif defined(CONFIG_PPC)
0144 #define __VM_ARCH_SPECIFIC_1 {VM_SAO,     "sao"           }
0145 #elif defined(CONFIG_PARISC) || defined(CONFIG_IA64)
0146 #define __VM_ARCH_SPECIFIC_1 {VM_GROWSUP,   "growsup"   }
0147 #elif !defined(CONFIG_MMU)
0148 #define __VM_ARCH_SPECIFIC_1 {VM_MAPPED_COPY,"mappedcopy"   }
0149 #else
0150 #define __VM_ARCH_SPECIFIC_1 {VM_ARCH_1,    "arch_1"    }
0151 #endif
0152 
0153 #ifdef CONFIG_MEM_SOFT_DIRTY
0154 #define IF_HAVE_VM_SOFTDIRTY(flag,name) {flag, name },
0155 #else
0156 #define IF_HAVE_VM_SOFTDIRTY(flag,name)
0157 #endif
0158 
0159 #ifdef CONFIG_HAVE_ARCH_USERFAULTFD_MINOR
0160 # define IF_HAVE_UFFD_MINOR(flag, name) {flag, name},
0161 #else
0162 # define IF_HAVE_UFFD_MINOR(flag, name)
0163 #endif
0164 
0165 #define __def_vmaflag_names                     \
0166     {VM_READ,           "read"      },      \
0167     {VM_WRITE,          "write"     },      \
0168     {VM_EXEC,           "exec"      },      \
0169     {VM_SHARED,         "shared"    },      \
0170     {VM_MAYREAD,            "mayread"   },      \
0171     {VM_MAYWRITE,           "maywrite"  },      \
0172     {VM_MAYEXEC,            "mayexec"   },      \
0173     {VM_MAYSHARE,           "mayshare"  },      \
0174     {VM_GROWSDOWN,          "growsdown" },      \
0175     {VM_UFFD_MISSING,       "uffd_missing"  },      \
0176 IF_HAVE_UFFD_MINOR(VM_UFFD_MINOR,   "uffd_minor"    )       \
0177     {VM_PFNMAP,         "pfnmap"    },      \
0178     {VM_UFFD_WP,            "uffd_wp"   },      \
0179     {VM_LOCKED,         "locked"    },      \
0180     {VM_IO,             "io"        },      \
0181     {VM_SEQ_READ,           "seqread"   },      \
0182     {VM_RAND_READ,          "randread"  },      \
0183     {VM_DONTCOPY,           "dontcopy"  },      \
0184     {VM_DONTEXPAND,         "dontexpand"    },      \
0185     {VM_LOCKONFAULT,        "lockonfault"   },      \
0186     {VM_ACCOUNT,            "account"   },      \
0187     {VM_NORESERVE,          "noreserve" },      \
0188     {VM_HUGETLB,            "hugetlb"   },      \
0189     {VM_SYNC,           "sync"      },      \
0190     __VM_ARCH_SPECIFIC_1                ,       \
0191     {VM_WIPEONFORK,         "wipeonfork"    },      \
0192     {VM_DONTDUMP,           "dontdump"  },      \
0193 IF_HAVE_VM_SOFTDIRTY(VM_SOFTDIRTY,  "softdirty" )       \
0194     {VM_MIXEDMAP,           "mixedmap"  },      \
0195     {VM_HUGEPAGE,           "hugepage"  },      \
0196     {VM_NOHUGEPAGE,         "nohugepage"    },      \
0197     {VM_MERGEABLE,          "mergeable" }       \
0198 
0199 #define show_vma_flags(flags)                       \
0200     (flags) ? __print_flags(flags, "|",             \
0201     __def_vmaflag_names                     \
0202     ) : "none"
0203 
0204 #ifdef CONFIG_COMPACTION
0205 #define COMPACTION_STATUS                   \
0206     EM( COMPACT_SKIPPED,        "skipped")      \
0207     EM( COMPACT_DEFERRED,       "deferred")     \
0208     EM( COMPACT_CONTINUE,       "continue")     \
0209     EM( COMPACT_SUCCESS,        "success")      \
0210     EM( COMPACT_PARTIAL_SKIPPED,    "partial_skipped")  \
0211     EM( COMPACT_COMPLETE,       "complete")     \
0212     EM( COMPACT_NO_SUITABLE_PAGE,   "no_suitable_page") \
0213     EM( COMPACT_NOT_SUITABLE_ZONE,  "not_suitable_zone")    \
0214     EMe(COMPACT_CONTENDED,      "contended")
0215 
0216 /* High-level compaction status feedback */
0217 #define COMPACTION_FAILED   1
0218 #define COMPACTION_WITHDRAWN    2
0219 #define COMPACTION_PROGRESS 3
0220 
0221 #define compact_result_to_feedback(result)  \
0222 ({                      \
0223     enum compact_result __result = result;  \
0224     (compaction_failed(__result)) ? COMPACTION_FAILED : \
0225         (compaction_withdrawn(__result)) ? COMPACTION_WITHDRAWN : COMPACTION_PROGRESS; \
0226 })
0227 
0228 #define COMPACTION_FEEDBACK     \
0229     EM(COMPACTION_FAILED,       "failed")   \
0230     EM(COMPACTION_WITHDRAWN,    "withdrawn")    \
0231     EMe(COMPACTION_PROGRESS,    "progress")
0232 
0233 #define COMPACTION_PRIORITY                     \
0234     EM(COMPACT_PRIO_SYNC_FULL,  "COMPACT_PRIO_SYNC_FULL")   \
0235     EM(COMPACT_PRIO_SYNC_LIGHT, "COMPACT_PRIO_SYNC_LIGHT")  \
0236     EMe(COMPACT_PRIO_ASYNC,     "COMPACT_PRIO_ASYNC")
0237 #else
0238 #define COMPACTION_STATUS
0239 #define COMPACTION_PRIORITY
0240 #define COMPACTION_FEEDBACK
0241 #endif
0242 
0243 #ifdef CONFIG_ZONE_DMA
0244 #define IFDEF_ZONE_DMA(X) X
0245 #else
0246 #define IFDEF_ZONE_DMA(X)
0247 #endif
0248 
0249 #ifdef CONFIG_ZONE_DMA32
0250 #define IFDEF_ZONE_DMA32(X) X
0251 #else
0252 #define IFDEF_ZONE_DMA32(X)
0253 #endif
0254 
0255 #ifdef CONFIG_HIGHMEM
0256 #define IFDEF_ZONE_HIGHMEM(X) X
0257 #else
0258 #define IFDEF_ZONE_HIGHMEM(X)
0259 #endif
0260 
0261 #define ZONE_TYPE                       \
0262     IFDEF_ZONE_DMA(     EM (ZONE_DMA,    "DMA"))    \
0263     IFDEF_ZONE_DMA32(   EM (ZONE_DMA32,  "DMA32"))  \
0264                 EM (ZONE_NORMAL, "Normal")  \
0265     IFDEF_ZONE_HIGHMEM( EM (ZONE_HIGHMEM,"HighMem"))    \
0266                 EMe(ZONE_MOVABLE,"Movable")
0267 
0268 #define LRU_NAMES       \
0269         EM (LRU_INACTIVE_ANON, "inactive_anon") \
0270         EM (LRU_ACTIVE_ANON, "active_anon") \
0271         EM (LRU_INACTIVE_FILE, "inactive_file") \
0272         EM (LRU_ACTIVE_FILE, "active_file") \
0273         EMe(LRU_UNEVICTABLE, "unevictable")
0274 
0275 /*
0276  * First define the enums in the above macros to be exported to userspace
0277  * via TRACE_DEFINE_ENUM().
0278  */
0279 #undef EM
0280 #undef EMe
0281 #define EM(a, b)    TRACE_DEFINE_ENUM(a);
0282 #define EMe(a, b)   TRACE_DEFINE_ENUM(a);
0283 
0284 COMPACTION_STATUS
0285 COMPACTION_PRIORITY
0286 /* COMPACTION_FEEDBACK are defines not enums. Not needed here. */
0287 ZONE_TYPE
0288 LRU_NAMES
0289 
0290 /*
0291  * Now redefine the EM() and EMe() macros to map the enums to the strings
0292  * that will be printed in the output.
0293  */
0294 #undef EM
0295 #undef EMe
0296 #define EM(a, b)    {a, b},
0297 #define EMe(a, b)   {a, b}