diff mbox series

[6/9] mm/z3fold: put z3fold page back into unbuddied list when reclaim or migration fails

Message ID 20220429064051.61552-7-linmiaohe@huawei.com (mailing list archive)
State New
Headers show
Series A few fixup patches for z3fold | expand

Commit Message

Miaohe Lin April 29, 2022, 6:40 a.m. UTC
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.

Signed-off-by: Miaohe Lin <linmiaohe@huawei.com>
---
 mm/z3fold.c | 4 ++++
 1 file changed, 4 insertions(+)

Comments

Vitaly Wool May 19, 2022, 7:13 a.m. UTC | #1
On Fri, Apr 29, 2022 at 8:40 AM Miaohe Lin <linmiaohe@huawei.com> wrote:
>
> 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.
>
> Signed-off-by: Miaohe Lin <linmiaohe@huawei.com>
> ---
>  mm/z3fold.c | 4 ++++
>  1 file changed, 4 insertions(+)
>
> 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 @@ static int z3fold_reclaim_page(struct z3fold_pool *pool, unsigned int retries)
>                         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);
>  }

Reviewed-by: Vitaly Wool <vitaly.wool@konsulko.com>
> --
> 2.23.0
>
diff mbox series

Patch

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 @@  static int z3fold_reclaim_page(struct z3fold_pool *pool, unsigned int retries)
 			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);
 }