void put_page(struct page *page) { if (unlikely(PageCompound(page))) put_compound_page(page); else if (put_page_testzero(page)) __page_cache_release(page); }
static void __put_compound_page(struct page *page) { compound_page_dtor *dtor; __page_cache_release(page); dtor = get_compound_page_dtor(page); (*dtor)(page); }
static void __put_compound_page(struct page *page) { compound_page_dtor *dtor; __page_cache_release(page); dtor = get_compound_page_dtor(page); if (!PageHuge(page)) BUG_ON(dtor != free_compound_page); (*dtor)(page); }
static void __put_compound_page(struct page *page) { compound_page_dtor *dtor; /* * __page_cache_release() is supposed to be called for thp, not for * hugetlb. This is because hugetlb page does never have PageLRU set * (it's never listed to any LRU lists) and no memcg routines should * be called for hugetlb (it has a separate hugetlb_cgroup.) */ if (!PageHuge(page)) __page_cache_release(page); dtor = get_compound_page_dtor(page); (*dtor)(page); }
void put_page(struct page *page) { if (unlikely(PageCompound(page))) { page = (struct page *)page_private(page); if (put_page_testzero(page)) { void (*dtor)(struct page *page); dtor = (void (*)(struct page *))page[1].mapping; (*dtor)(page); } return; } if (put_page_testzero(page)) __page_cache_release(page); }
void put_page(struct page *page) { #ifdef CONFIG_OXNAS_FAST_READS_AND_WRITES if (PageIncoherentSendfile(page)) { fast_put(page); } else { #endif // CONFIG_OXNAS_FAST_READS_AND_WRITES if (unlikely(PageCompound(page))) { put_compound_page(page); } else if (put_page_testzero(page)) { __page_cache_release(page); } #ifdef CONFIG_OXNAS_FAST_READS_AND_WRITES } #endif // CONFIG_OXNAS_FAST_READS_AND_WRITES }
static void __put_single_page(struct page *page) { __page_cache_release(page); free_hot_cold_page(page, 0); }
static void __put_single_page(struct page *page) { __page_cache_release(page); free_unref_page(page); }