Commit 5e012bba authored by Kefeng Wang's avatar Kefeng Wang Committed by Andrew Morton
Browse files

mm/damon: introduce damon_get_folio()

Introduce damon_get_folio(), and the temporary wrapper function
damon_get_page(), which help us to convert damon related functions to use
folios, and it will be dropped once the conversion is completed.

Link: https://lkml.kernel.org/r/20221230070849.63358-4-wangkefeng.wang@huawei.com


Signed-off-by: default avatarKefeng Wang <wangkefeng.wang@huawei.com>
Reviewed-by: default avatarSeongJae Park <sj@kernel.org>
Cc: David Hildenbrand <david@redhat.com>
Cc: Matthew Wilcox (Oracle) <willy@infradead.org>
Cc: Vishal Moola (Oracle) <vishal.moola@gmail.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
parent 5acc17fd
Loading
Loading
Loading
Loading
+11 −7
Original line number Diff line number Diff line
@@ -16,21 +16,25 @@
 * Get an online page for a pfn if it's in the LRU list.  Otherwise, returns
 * NULL.
 *
 * The body of this function is stolen from the 'page_idle_get_page()'.  We
 * The body of this function is stolen from the 'page_idle_get_folio()'.  We
 * steal rather than reuse it because the code is quite simple.
 */
struct page *damon_get_page(unsigned long pfn)
struct folio *damon_get_folio(unsigned long pfn)
{
	struct page *page = pfn_to_online_page(pfn);
	struct folio *folio;

	if (!page || !PageLRU(page) || !get_page_unless_zero(page))
	if (!page || PageTail(page))
		return NULL;

	if (unlikely(!PageLRU(page))) {
		put_page(page);
		page = NULL;
	folio = page_folio(page);
	if (!folio_test_lru(folio) || !folio_try_get(folio))
		return NULL;
	if (unlikely(page_folio(page) != folio || !folio_test_lru(folio))) {
		folio_put(folio);
		folio = NULL;
	}
	return page;
	return folio;
}

void damon_ptep_mkold(pte_t *pte, struct mm_struct *mm, unsigned long addr)
+8 −1
Original line number Diff line number Diff line
@@ -7,7 +7,14 @@

#include <linux/damon.h>

struct page *damon_get_page(unsigned long pfn);
struct folio *damon_get_folio(unsigned long pfn);
static inline struct page *damon_get_page(unsigned long pfn)
{
	struct folio *folio = damon_get_folio(pfn);

	/* when folio is NULL, return &(0->page) mean return NULL */
	return &folio->page;
}

void damon_ptep_mkold(pte_t *pte, struct mm_struct *mm, unsigned long addr);
void damon_pmdp_mkold(pmd_t *pmd, struct mm_struct *mm, unsigned long addr);