+ 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;
+}