Commit 73349afa authored by Alex Shi's avatar Alex Shi Committed by Andrew Morton
Browse files

mm/zsmalloc: convert reset_page to reset_zpdesc

zpdesc.zspage matches with page.private, zpdesc.next matches with
page.index.  They will be reset in reset_page() which is called prior to
free base pages of a zspage.

Since the fields that need to be initialized are independent of the order
in struct zpdesc, Keep it to use struct page to ensure robustness against
potential rearrangements of struct zpdesc fields in the future.

[42.hyeyoo@gmail.com: reset zpdesc fields in reset_zpdesc()]
  Link: https://lkml.kernel.org/r/Z4Uw136VdG7vlKCL@localhost.localdomain
[42.hyeyoo@gmail.com: keep reset_zpdesc() to use struct page fields]
Link: https://lkml.kernel.org/r/20241216150450.1228021-12-42.hyeyoo@gmail.com


Signed-off-by: default avatarAlex Shi <alexs@kernel.org>
Signed-off-by: default avatarHyeonggon Yoo <42.hyeyoo@gmail.com>
Acked-by: default avatarSergey Senozhatsky <senozhatsky@chromium.org>
Tested-by: default avatarSergey Senozhatsky <senozhatsky@chromium.org>
Cc: Matthew Wilcox (Oracle) <willy@infradead.org>
Cc: Minchan Kim <minchan@kernel.org>
Cc: Vishal Moola (Oracle) <vishal.moola@gmail.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
parent 68721300
Loading
Loading
Loading
Loading
+7 −5
Original line number Diff line number Diff line
@@ -843,12 +843,14 @@ static inline bool obj_allocated(struct zpdesc *zpdesc, void *obj,
	return true;
}

static void reset_page(struct page *page)
static void reset_zpdesc(struct zpdesc *zpdesc)
{
	struct page *page = zpdesc_page(zpdesc);

	__ClearPageMovable(page);
	ClearPagePrivate(page);
	set_page_private(page, 0);
	page->index = 0;
	zpdesc->zspage = NULL;
	zpdesc->next = NULL;
	__ClearPageZsmalloc(page);
}

@@ -887,7 +889,7 @@ static void __free_zspage(struct zs_pool *pool, struct size_class *class,
	do {
		VM_BUG_ON_PAGE(!PageLocked(page), page);
		next = get_next_page(page);
		reset_page(page);
		reset_zpdesc(page_zpdesc(page));
		unlock_page(page);
		dec_zone_page_state(page, NR_ZSPAGES);
		put_page(page);
@@ -1865,7 +1867,7 @@ static int zs_page_migrate(struct page *newpage, struct page *page,
		zpdesc_inc_zone_page_state(newzpdesc);
	}

	reset_page(page);
	reset_zpdesc(zpdesc);
	zpdesc_put(zpdesc);

	return MIGRATEPAGE_SUCCESS;