On Thu, Dec 05, 2024 at 05:49:38PM +0000, Matthew Wilcox (Oracle) wrote: > From: Alex Shi <alexs@xxxxxxxxxx> > > The 1st patch introduces new memory descriptor zpdesc and rename > zspage.first_page to zspage.first_zpdesc, no functional change. > > We removed PG_owner_priv_1 since it was moved to zspage after > commit a41ec880aa7b ("zsmalloc: move huge compressed obj from > page to zspage"). > > Originally-by: Hyeonggon Yoo <42.hyeyoo@xxxxxxxxx> > Signed-off-by: Alex Shi <alexs@xxxxxxxxxx> > --- > mm/zpdesc.h | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++ > mm/zsmalloc.c | 9 ++++--- > 2 files changed, 74 insertions(+), 4 deletions(-) > create mode 100644 mm/zpdesc.h > > diff --git a/mm/zpdesc.h b/mm/zpdesc.h > new file mode 100644 > index 000000000000..9ad232774469 > --- /dev/null > +++ b/mm/zpdesc.h > @@ -0,0 +1,69 @@ > +/* SPDX-License-Identifier: GPL-2.0 */ > +/* zpdesc.h: zswap.zpool memory descriptor > + * > + * Written by Alex Shi <alexs@xxxxxxxxxx> > + * Hyeonggon Yoo <42.hyeyoo@xxxxxxxxx> > + */ > +#ifndef __MM_ZPDESC_H__ > +#define __MM_ZPDESC_H__ > + > +/* > + * struct zpdesc - Memory descriptor for zpool memory > + * @flags: Page flags, mostly unused. > + * @lru: Indirectly used by page migration > + * @movable_ops: Used by page migration > + * @next: Next zpdesc in a zspage in zsmalloc zpool > + * @handle: For huge zspage in zsmalloc zpool > + * @zspage: Points to the zspage this zpdesc is a part of > + * @first_obj_offset: First object offset in zsmalloc zpool > + * @_refcount: Indirectly used by page migration > + * @memcg_data: Memory Control Group data. It seems you forgot to remove the comment about memcg_data? No strong opinion about memcg_data from me, tbh. > + * > + * This struct overlays struct page for now. Do not modify without a good > + * understanding of the issues. In particular, do not expand into > + * the overlap with memcg_data. > + * > + * Page flags used: > + * * PG_private identifies the first component page > + * * PG_locked is used by page migration code > + */ > +struct zpdesc { > + unsigned long flags; > + struct list_head lru; > + unsigned long movable_ops; > + union { > + struct zpdesc *next; > + unsigned long handle; > + }; > + struct zspage *zspage; > + unsigned int first_obj_offset; > + atomic_t _refcount; > +}; > +#define ZPDESC_MATCH(pg, zp) \ > + static_assert(offsetof(struct page, pg) == offsetof(struct zpdesc, zp)) > + > +ZPDESC_MATCH(flags, flags); > +ZPDESC_MATCH(lru, lru); > +ZPDESC_MATCH(mapping, movable_ops); > +ZPDESC_MATCH(index, next); > +ZPDESC_MATCH(index, handle); > +ZPDESC_MATCH(private, zspage); > +ZPDESC_MATCH(page_type, first_obj_offset); > +ZPDESC_MATCH(_refcount, _refcount); > +#undef ZPDESC_MATCH > +static_assert(sizeof(struct zpdesc) <= sizeof(struct page));