linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
From: Hyeonggon Yoo <42.hyeyoo@gmail.com>
To: Minchan Kim <minchan@kernel.org>,
	Sergey Senozhatsky <senozhatsky@chromium.org>
Cc: Matthew Wilcox <willy@infradead.org>,
	Mike Rapoport <rppt@kernel.org>,
	Yosry Ahmed <yosryahmed@google.com>,
	linux-mm@kvack.org, Hyeonggon Yoo <42.hyeyoo@gmail.com>
Subject: [RFC PATCH v3 01/21] mm/zsmalloc: create new struct zsdesc
Date: Thu, 30 Nov 2023 19:12:22 +0900	[thread overview]
Message-ID: <20231130101242.2590384-2-42.hyeyoo@gmail.com> (raw)
In-Reply-To: <20231130101242.2590384-1-42.hyeyoo@gmail.com>

Currently zsmalloc reuses fields of struct page. As part of simplifying
struct page, create own type for zsmalloc called zsdesc.

Remove comments about how zsmalloc reuses fields of struct page, because
zsdesc uses more intuitive names.

Note that zsmalloc does not use PG_owner_priv_v1 after commit a41ec880aa7b
("zsmalloc: move huge compressed obj from page to zspage"). Thus only
document how zsmalloc uses PG_private flag.

It is very tempting to rearrange zsdesc, but the three words after flags
field are not available for zsmalloc. Add comments about that.

Signed-off-by: Hyeonggon Yoo <42.hyeyoo@gmail.com>
---
 mm/zsmalloc.c | 67 ++++++++++++++++++++++++++++++++++++++-------------
 1 file changed, 50 insertions(+), 17 deletions(-)

diff --git a/mm/zsmalloc.c b/mm/zsmalloc.c
index b1c0dad7f4cf..60ce2a4dfeeb 100644
--- a/mm/zsmalloc.c
+++ b/mm/zsmalloc.c
@@ -11,23 +11,6 @@
  * Released under the terms of GNU General Public License Version 2.0
  */
 
-/*
- * Following is how we use various fields and flags of underlying
- * struct page(s) to form a zspage.
- *
- * Usage of struct page fields:
- *	page->private: points to zspage
- *	page->index: links together all component pages of a zspage
- *		For the huge page, this is always 0, so we use this field
- *		to store handle.
- *	page->page_type: first object offset in a subpage of zspage
- *
- * Usage of struct page flags:
- *	PG_private: identifies the first component page
- *	PG_owner_priv_1: identifies the huge component page
- *
- */
-
 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 
 /*
@@ -241,6 +224,56 @@ struct zs_pool {
 	atomic_t compaction_in_progress;
 };
 
+/*
+ * struct zsdesc - memory descriptor for zsmalloc memory
+ *
+ * This struct overlays struct page for now. Do not modify without a
+ * good understanding of the issues.
+ *
+ * Usage of struct page flags on zsdesc:
+ *	PG_private: identifies the first component zsdesc
+ */
+struct zsdesc {
+	unsigned long __page_flags;
+
+	/*
+	 * Although not used by zsmalloc, this field is used by
+	 * non-LRU movable page migration code. Leave it unused.
+	 */
+	struct list_head __page_lru;
+
+	/* Always points to zsmalloc_mops with PAGE_MAPPING_MOVABLE set */
+	struct movable_operations *mops;
+
+	union {
+		/* linked list of all zsdescs in a zspage */
+		struct zsdesc *next;
+		/* for huge zspages */
+		unsigned long handle;
+	};
+
+	struct zspage *zspage;
+	unsigned int first_obj_offset;
+	unsigned int __page_refcount;
+#ifdef CONFIG_MEMCG
+	unsigned long __page_memcg_data;
+#endif
+};
+
+#define ZSDESC_MATCH(pg, zs) \
+	static_assert(offsetof(struct page, pg) == offsetof(struct zsdesc, zs))
+
+ZSDESC_MATCH(flags, __page_flags);
+ZSDESC_MATCH(lru, __page_lru);
+ZSDESC_MATCH(mapping, mops);
+ZSDESC_MATCH(index, next);
+ZSDESC_MATCH(index, handle);
+ZSDESC_MATCH(private, zspage);
+ZSDESC_MATCH(page_type, first_obj_offset);
+ZSDESC_MATCH(_refcount, __page_refcount);
+#undef ZSDESC_MATCH
+static_assert(sizeof(struct zsdesc) <= sizeof(struct page));
+
 struct zspage {
 	struct {
 		unsigned int huge:HUGE_BITS;
-- 
2.39.3



  reply	other threads:[~2023-11-30 10:13 UTC|newest]

Thread overview: 32+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-11-30 10:12 [RFC PATCH v3 00/21] mm/zsmalloc: Split zsdesc from struct page Hyeonggon Yoo
2023-11-30 10:12 ` Hyeonggon Yoo [this message]
2023-11-30 10:12 ` [RFC PATCH v3 02/21] mm/zsmalloc: add utility functions for zsdesc Hyeonggon Yoo
2023-11-30 10:12 ` [RFC PATCH v3 03/21] mm/zsmalloc: replace first_page to first_zsdesc in struct zspage Hyeonggon Yoo
2023-12-01 19:23   ` Minchan Kim
2023-12-03  5:22     ` Hyeonggon Yoo
2023-11-30 10:12 ` [RFC PATCH v3 04/21] mm/zsmalloc: add alternatives of frequently used helper functions Hyeonggon Yoo
2023-12-04  3:45   ` Matthew Wilcox
2023-12-05  0:35     ` Hyeonggon Yoo
2023-11-30 10:12 ` [RFC PATCH v3 05/21] mm/zsmalloc: convert {try,}lock_zspage() to use zsdesc Hyeonggon Yoo
2023-11-30 10:12 ` [RFC PATCH v3 06/21] mm/zsmalloc: convert __zs_{map,unmap}_object() " Hyeonggon Yoo
2023-11-30 10:12 ` [RFC PATCH v3 07/21] mm/zsmalloc: convert obj_to_location() and its users " Hyeonggon Yoo
2023-11-30 10:12 ` [RFC PATCH v3 08/21] mm/zsmalloc: convert obj_malloc() " Hyeonggon Yoo
2023-11-30 10:12 ` [RFC PATCH v3 09/21] mm/zsmalloc: convert create_page_chain() and its users " Hyeonggon Yoo
2023-11-30 10:12 ` [RFC PATCH v3 10/21] mm/zsmalloc: convert obj_allocated() and related helpers " Hyeonggon Yoo
2023-11-30 10:12 ` [RFC PATCH v3 11/21] mm/zsmalloc: convert init_zspage() " Hyeonggon Yoo
2023-11-30 10:12 ` [RFC PATCH v3 12/21] mm/zsmalloc: convert obj_to_page() and zs_free() " Hyeonggon Yoo
2023-11-30 10:12 ` [RFC PATCH v3 13/21] mm/zsmalloc: convert reset_page() to reset_zsdesc() Hyeonggon Yoo
2023-11-30 10:12 ` [RFC PATCH v3 14/21] mm/zsmalloc: convert zs_page_{isolate,migrate,putback} to use zsdesc Hyeonggon Yoo
2023-12-04  3:32   ` Sergey Senozhatsky
2023-12-05  0:21     ` Hyeonggon Yoo
2023-11-30 10:12 ` [RFC PATCH v3 15/21] mm/zsmalloc: convert __free_zspage() " Hyeonggon Yoo
2023-11-30 10:12 ` [RFC PATCH v3 16/21] mm/zsmalloc: convert location_to_obj() " Hyeonggon Yoo
2023-11-30 10:12 ` [RFC PATCH v3 17/21] mm/zsmalloc: convert migrate_zspage() " Hyeonggon Yoo
2023-11-30 10:12 ` [RFC PATCH v3 18/21] mm/zsmalloc: convert get_zspage() to take zsdesc Hyeonggon Yoo
2023-11-30 10:12 ` [RFC PATCH v3 19/21] mm/zsmalloc: convert SetZsPageMovable() to use zsdesc Hyeonggon Yoo
2023-11-30 10:12 ` [RFC PATCH v3 20/21] mm/zsmalloc: remove now unused helper functions Hyeonggon Yoo
2023-11-30 10:12 ` [RFC PATCH v3 21/21] mm/zsmalloc: convert {get,set}_first_obj_offset() to use zsdesc Hyeonggon Yoo
2023-12-01 19:28 ` [RFC PATCH v3 00/21] mm/zsmalloc: Split zsdesc from struct page Minchan Kim
2023-12-02  4:36   ` Sergey Senozhatsky
2023-12-02 22:46     ` Matthew Wilcox
2023-12-03  5:21     ` Hyeonggon Yoo

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20231130101242.2590384-2-42.hyeyoo@gmail.com \
    --to=42.hyeyoo@gmail.com \
    --cc=linux-mm@kvack.org \
    --cc=minchan@kernel.org \
    --cc=rppt@kernel.org \
    --cc=senozhatsky@chromium.org \
    --cc=willy@infradead.org \
    --cc=yosryahmed@google.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox