+struct pmem_pool
+{
+ int type;
+ struct ppage* pool_start;
+ struct ppage* pool_end;
+
+#if defined(CONFIG_PMALLOC_METHOD_NCONTIG)
+
+ struct llist_header idle_page;
+ struct llist_header busy_page;
+
+#elif defined(CONFIG_PMALLOC_METHOD_BUDDY)
+
+ struct llist_header idle_order[MAX_PAGE_ORDERS];
+
+#elif defined(CONFIG_PMALLOC_METHOD_SIMPLE)
+
+ struct llist_header idle_order[MAX_PAGE_ORDERS];
+ int count[MAX_PAGE_ORDERS];
+
+#endif
+};
+
+struct pmem
+{
+ struct pmem_pool pool[POOL_COUNT];
+
+ pfn_t list_len;
+ struct ppage* pplist;
+ struct llist_header reserved;
+};
+
+static inline struct ppage*
+ppage(pfn_t pfn)
+{
+ return (struct ppage*)(PPLIST_STARTVM) + pfn;
+}
+
+static inline struct ppage*
+leading_page(struct ppage* page) {
+ return page - page->companion;
+}
+
+static inline struct ppage*
+ppage_of(struct pmem_pool* pool, pfn_t pfn)
+{
+ return pool->pool_start + pfn;
+}
+
+static inline pfn_t
+ppfn(struct ppage* page)
+{
+ return (pfn_t)((ptr_t)page - PPLIST_STARTVM) / sizeof(struct ppage);
+}
+
+static inline pfn_t
+ppfn_of(struct pmem_pool* pool, struct ppage* page)
+{
+ return (pfn_t)((ptr_t)page - (ptr_t)pool->pool_start) / sizeof(struct ppage);
+}
+
+static inline ptr_t
+ppage_addr(struct ppage* page) {
+ return ppfn(page) * PAGE_SIZE;
+}
+
+static inline unsigned int
+count_order(size_t page_count) {
+ unsigned int po = ilog2(page_count);
+ assert(!(page_count % (1 << po)));
+ return po;
+}
+
+static inline unsigned int
+ppage_order(struct ppage* page) {
+ return page->order;
+}
+
+
+static inline bool
+reserved_page(struct ppage* page)
+{
+ return page->refs == RESERVE_MARKER && page->type == PP_RESERVED;
+}