Commit 08a8dae4 authored by Matthew Wilcox (Oracle)'s avatar Matthew Wilcox (Oracle) Committed by Liu Shixin
Browse files

mm: combine __folio_put_small, __folio_put_large and __folio_put

mainline inclusion
from mainline-v6.10-rc1
commit 79a48287515848c18a49d75c1fdf176c82bb13cf
category: feature
bugzilla: https://gitee.com/openeuler/kernel/issues/I9R3AY
CVE: NA

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=79a48287515848c18a49d75c1fdf176c82bb13cf

--------------------------------

It's now obvious that __folio_put_small() and __folio_put_large() do
almost exactly the same thing.  Inline them both into __folio_put().

Link: https://lkml.kernel.org/r/20240405153228.2563754-5-willy@infradead.org


Signed-off-by: default avatarMatthew Wilcox (Oracle) <willy@infradead.org>
Reviewed-by: default avatarZi Yan <ziy@nvidia.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLiu Shixin <liushixin2@huawei.com>
parent dc6b4c72
Loading
Loading
Loading
Loading
+6 −26
Original line number Diff line number Diff line
@@ -112,42 +112,22 @@ static void page_cache_release(struct folio *folio)
		unlock_page_lruvec_irqrestore(lruvec, flags);
}

static void __folio_put_small(struct folio *folio)
{
	page_cache_release(folio);
	mem_cgroup_uncharge(folio);
	free_unref_page(&folio->page, 0);
}

static void __folio_put_large(struct folio *folio)
void __folio_put(struct folio *folio)
{
	/*
	 * __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 (folio_test_hugetlb(folio)) {
	if (unlikely(folio_is_zone_device(folio))) {
		free_zone_device_page(&folio->page);
		return;
	} else if (folio_test_hugetlb(folio)) {
		free_huge_folio(folio);
		return;
	}

	page_cache_release(folio);
	if (folio_test_large_rmappable(folio))
	if (folio_test_large(folio) && folio_test_large_rmappable(folio))
		folio_undo_large_rmappable(folio);
	mem_cgroup_uncharge(folio);
	free_unref_page(&folio->page, folio_order(folio));
}

void __folio_put(struct folio *folio)
{
	if (unlikely(folio_is_zone_device(folio)))
		free_zone_device_page(&folio->page);
	else if (unlikely(folio_test_large(folio)))
		__folio_put_large(folio);
	else
		__folio_put_small(folio);
}
EXPORT_SYMBOL(__folio_put);

/**