struct page *homecache_alloc_pages_node(int nid, gfp_t gfp_mask, unsigned int order, int home) { struct page *page; BUG_ON(gfp_mask & __GFP_HIGHMEM); /* must be lowmem */ page = alloc_pages_node(nid, gfp_mask, order); if (page) homecache_change_page_home(page, order, home); return page; }
void __homecache_free_pages(struct page *page, unsigned int order) { if (put_page_testzero(page)) { homecache_change_page_home(page, order, PAGE_HOME_HASH); if (order == 0) { free_hot_cold_page(page, false); } else { init_page_count(page); __free_pages(page, order); } } }
void homecache_free_pages(unsigned long addr, unsigned int order) { struct page *page; if (addr == 0) return; VM_BUG_ON(!virt_addr_valid((void *)addr)); page = virt_to_page((void *)addr); if (put_page_testzero(page)) { int pages = (1 << order); homecache_change_page_home(page, order, initial_page_home()); while (pages--) __free_page(page++); } }