]> git.baikalelectronics.ru Git - kernel.git/commitdiff
mm/z3fold: put z3fold page back into unbuddied list when reclaim or migration fails
authorMiaohe Lin <linmiaohe@huawei.com>
Fri, 29 Apr 2022 06:40:43 +0000 (14:40 +0800)
committerakpm <akpm@linux-foundation.org>
Fri, 27 May 2022 16:33:44 +0000 (09:33 -0700)
When doing z3fold page reclaim or migration, the page is removed from
unbuddied list.  If reclaim or migration succeeds, it's fine as page is
released.  But in case it fails, the page is not put back into unbuddied
list now.  The page will be leaked until next compaction work, reclaim or
migration is done.

Link: https://lkml.kernel.org/r/20220429064051.61552-7-linmiaohe@huawei.com
Signed-off-by: Miaohe Lin <linmiaohe@huawei.com>
Reviewed-by: Vitaly Wool <vitaly.wool@konsulko.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
mm/z3fold.c

index 5f5d5f1556be265546cdce21b7ee2015dd39ea3c..a1c150fc8def1910bd24196ca34044b8b0846099 100644 (file)
@@ -1422,6 +1422,8 @@ next:
                        spin_lock(&pool->lock);
                        list_add(&page->lru, &pool->lru);
                        spin_unlock(&pool->lock);
+                       if (list_empty(&zhdr->buddy))
+                               add_to_unbuddied(pool, zhdr);
                        z3fold_page_unlock(zhdr);
                        clear_bit(PAGE_CLAIMED, &page->private);
                }
@@ -1638,6 +1640,8 @@ static void z3fold_page_putback(struct page *page)
        spin_lock(&pool->lock);
        list_add(&page->lru, &pool->lru);
        spin_unlock(&pool->lock);
+       if (list_empty(&zhdr->buddy))
+               add_to_unbuddied(pool, zhdr);
        clear_bit(PAGE_CLAIMED, &page->private);
        z3fold_page_unlock(zhdr);
 }