mm/damon: introduce damon_get_folio()
authorKefeng Wang <wangkefeng.wang@huawei.com>
Fri, 30 Dec 2022 07:08:44 +0000 (15:08 +0800)
committerAndrew Morton <akpm@linux-foundation.org>
Thu, 19 Jan 2023 01:12:52 +0000 (17:12 -0800)
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>
mm/damon/ops-common.c
mm/damon/ops-common.h

index 7540960..1294a25 100644 (file)
  * 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)
index 8d82d37..65f290f 100644 (file)
@@ -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);