From: Miaohe Lin Date: Fri, 29 Apr 2022 06:40:43 +0000 (+0800) Subject: mm/z3fold: put z3fold page back into unbuddied list when reclaim or migration fails X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=6cf9a34967ed544ca4c0949e9928dc78fca57ef3;p=linux.git mm/z3fold: put z3fold page back into unbuddied list when reclaim or migration fails 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 Reviewed-by: Vitaly Wool Signed-off-by: Andrew Morton --- diff --git a/mm/z3fold.c b/mm/z3fold.c index 5f5d5f1556be..a1c150fc8def 100644 --- a/mm/z3fold.c +++ b/mm/z3fold.c @@ -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); }