#include "utils.h"
#include "bintree.h"
+struct kpageflag_str kpageflag_str[] = {
+ { .flag = LOCKED, .str = "locked", },
+ { .flag = ERROR, .str = "error", },
+ { .flag = REFERENCED, .str = "referenced", },
+ { .flag = UPTODATE, .str = "uptodate", },
+ { .flag = DIRTY, .str = "dirty", },
+ { .flag = LRU, .str = "lru", },
+ { .flag = ACTIVE, .str = "active", },
+ { .flag = SLAB, .str = "slab", },
+ { .flag = WRITEBACK, .str = "writeback", },
+ { .flag = RECLAIM, .str = "reclaim", },
+ { .flag = BUDDY, .str = "buddy", },
+ { .flag = MMAP, .str = "mmap", },
+ { .flag = ANON, .str = "anon", },
+ { .flag = SWAPCACHE, .str = "swapcache", },
+ { .flag = SWAPBACKED, .str = "swapbacked", },
+ { .flag = COMPOUND_HEAD, .str = "compound_head", },
+ { .flag = COMPOUND_TAIL, .str = "compound_tail", },
+ { .flag = HUGE, .str = "huge", },
+ { .flag = UNEVICTABLE, .str = "unevictable", },
+ { .flag = HWPOISON, .str = "hwpoison", },
+ { .flag = NOPAGE, .str = "nopage", },
+ { .flag = KSM, .str = "ksm", },
+};
+
#define SI_k 1024ll
#define SI_M (SI_k * SI_k)
#define SI_G (SI_M * SI_k)
return (BITRANGE(5, 54) & p->pf) >> 5;
}
+#define KPAGEFLAGS_NUM 22
+
+enum kpageflags {
+ LOCKED,
+ ERROR,
+ REFERENCED,
+ UPTODATE,
+ DIRTY,
+ LRU,
+ ACTIVE,
+ SLAB,
+ WRITEBACK,
+ RECLAIM,
+ BUDDY,
+ MMAP,
+ ANON,
+ SWAPCACHE,
+ SWAPBACKED,
+ COMPOUND_HEAD,
+ COMPOUND_TAIL,
+ HUGE,
+ UNEVICTABLE,
+ HWPOISON,
+ NOPAGE,
+ KSM,
+};
+
+struct kpageflag_str {
+ int flag;
+ char *str;
+};
+
+extern struct kpageflag_str kpageflag_str[];
+
+static inline int kpageflag_is_set(struct pageframe *p, int flag)
+{
+ return !!(BITRANGE(flag, flag) & p->kpageflags);
+}
+
+static inline char *kpageflag_to_str(int flag)
+{
+ int i;
+
+ for (i = 0; i < KPAGEFLAGS_NUM; i++)
+ if (kpageflag_str[i].flag == flag)
+ return kpageflag_str[i].str;
+
+ return NULL;
+}
+
struct maps {
struct list_head list;