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: Kefeng Wang <wangkefeng.wang@huawei.com> Reviewed-by: SeongJae 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: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
parent
5acc17fd35
commit
5e012bba01
mm/damon
@ -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)
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user