Message ID | 20240703040613.681396-2-alexs@kernel.org (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | mm/zsmalloc: add zpdesc memory descriptor for zswap.zpool | expand |
Hi, kernel test robot noticed the following build errors: [auto build test ERROR on akpm-mm/mm-everything] url: https://github.com/intel-lab-lkp/linux/commits/alexs-kernel-org/mm-zsmalloc-add-zpdesc-memory-descriptor-for-zswap-zpool/20240703-182314 base: https://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm.git mm-everything patch link: https://lore.kernel.org/r/20240703040613.681396-2-alexs%40kernel.org patch subject: [PATCH v2 01/20] mm/zsmalloc: add zpdesc memory descriptor for zswap.zpool config: i386-buildonly-randconfig-004-20240705 (https://download.01.org/0day-ci/archive/20240705/202407052121.e5LTYhXc-lkp@intel.com/config) compiler: clang version 18.1.5 (https://github.com/llvm/llvm-project 617a15a9eac96088ae5e9134248d8236e34b91b1) reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240705/202407052121.e5LTYhXc-lkp@intel.com/reproduce) If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Closes: https://lore.kernel.org/oe-kbuild-all/202407052121.e5LTYhXc-lkp@intel.com/ All errors (new ones prefixed by >>): In file included from mm/zsmalloc.c:65: >> mm/zpdesc.h:48:1: error: no member named 'memcg_data' in 'page' 48 | ZPDESC_MATCH(memcg_data, memcg_data); | ^ ~~~~~~~~~~ mm/zpdesc.h:40:16: note: expanded from macro 'ZPDESC_MATCH' 40 | static_assert(offsetof(struct page, pg) == offsetof(struct zpdesc, zp)) | ^ ~~ include/linux/stddef.h:16:32: note: expanded from macro 'offsetof' 16 | #define offsetof(TYPE, MEMBER) __builtin_offsetof(TYPE, MEMBER) | ^ ~~~~~~ include/linux/build_bug.h:77:50: note: expanded from macro 'static_assert' 77 | #define static_assert(expr, ...) __static_assert(expr, ##__VA_ARGS__, #expr) | ^~~~ include/linux/build_bug.h:78:56: note: expanded from macro '__static_assert' 78 | #define __static_assert(expr, msg, ...) _Static_assert(expr, msg) | ^~~~ In file included from mm/zsmalloc.c:65: >> mm/zpdesc.h:48:1: error: no member named 'memcg_data' in 'zpdesc' 48 | ZPDESC_MATCH(memcg_data, memcg_data); | ^ ~~~~~~~~~~ mm/zpdesc.h:40:45: note: expanded from macro 'ZPDESC_MATCH' 40 | static_assert(offsetof(struct page, pg) == offsetof(struct zpdesc, zp)) | ^ ~~ include/linux/stddef.h:16:32: note: expanded from macro 'offsetof' 16 | #define offsetof(TYPE, MEMBER) __builtin_offsetof(TYPE, MEMBER) | ^ ~~~~~~ include/linux/build_bug.h:77:50: note: expanded from macro 'static_assert' 77 | #define static_assert(expr, ...) __static_assert(expr, ##__VA_ARGS__, #expr) | ^~~~ include/linux/build_bug.h:78:56: note: expanded from macro '__static_assert' 78 | #define __static_assert(expr, msg, ...) _Static_assert(expr, msg) | ^~~~ 2 errors generated. vim +48 mm/zpdesc.h 9 10 /* 11 * struct zpdesc - Memory descriptor for zpool memory, now is for zsmalloc 12 * @flags: Page flags, PG_private: identifies the first component page 13 * @lru: Indirectly used by page migration 14 * @mops: Used by page migration 15 * @next: Next zpdesc in a zspage in zsmalloc zpool 16 * @handle: For huge zspage in zsmalloc zpool 17 * @zspage: Pointer to zspage in zsmalloc 18 * @memcg_data: Memory Control Group data. 19 * 20 * This struct overlays struct page for now. Do not modify without a good 21 * understanding of the issues. 22 */ 23 struct zpdesc { 24 unsigned long flags; 25 struct list_head lru; 26 struct movable_operations *mops; 27 union { 28 /* Next zpdescs in a zspage in zsmalloc zpool */ 29 struct zpdesc *next; 30 /* For huge zspage in zsmalloc zpool */ 31 unsigned long handle; 32 }; 33 struct zspage *zspage; 34 unsigned long _zp_pad_1; 35 #ifdef CONFIG_SLAB_OBJ_EXT 36 unsigned long memcg_data; 37 #endif 38 }; 39 #define ZPDESC_MATCH(pg, zp) \ 40 static_assert(offsetof(struct page, pg) == offsetof(struct zpdesc, zp)) 41 42 ZPDESC_MATCH(flags, flags); 43 ZPDESC_MATCH(lru, lru); 44 ZPDESC_MATCH(mapping, mops); 45 ZPDESC_MATCH(index, next); 46 ZPDESC_MATCH(index, handle); 47 ZPDESC_MATCH(private, zspage); > 48 ZPDESC_MATCH(memcg_data, memcg_data); 49 #undef ZPDESC_MATCH 50 static_assert(sizeof(struct zpdesc) <= sizeof(struct page)); 51
Hi, kernel test robot noticed the following build errors: [auto build test ERROR on akpm-mm/mm-everything] url: https://github.com/intel-lab-lkp/linux/commits/alexs-kernel-org/mm-zsmalloc-add-zpdesc-memory-descriptor-for-zswap-zpool/20240703-182314 base: https://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm.git mm-everything patch link: https://lore.kernel.org/r/20240703040613.681396-2-alexs%40kernel.org patch subject: [PATCH v2 01/20] mm/zsmalloc: add zpdesc memory descriptor for zswap.zpool config: i386-buildonly-randconfig-001-20240705 (https://download.01.org/0day-ci/archive/20240705/202407052114.eLXLN20k-lkp@intel.com/config) compiler: gcc-13 (Ubuntu 13.2.0-4ubuntu3) 13.2.0 reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240705/202407052114.eLXLN20k-lkp@intel.com/reproduce) If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Closes: https://lore.kernel.org/oe-kbuild-all/202407052114.eLXLN20k-lkp@intel.com/ All errors (new ones prefixed by >>): In file included from include/linux/container_of.h:5, from include/linux/list.h:5, from include/linux/module.h:12, from mm/zsmalloc.c:40: >> include/linux/stddef.h:16:33: error: 'struct page' has no member named 'memcg_data' 16 | #define offsetof(TYPE, MEMBER) __builtin_offsetof(TYPE, MEMBER) | ^~~~~~~~~~~~~~~~~~ include/linux/build_bug.h:78:56: note: in definition of macro '__static_assert' 78 | #define __static_assert(expr, msg, ...) _Static_assert(expr, msg) | ^~~~ mm/zpdesc.h:40:9: note: in expansion of macro 'static_assert' 40 | static_assert(offsetof(struct page, pg) == offsetof(struct zpdesc, zp)) | ^~~~~~~~~~~~~ mm/zpdesc.h:40:23: note: in expansion of macro 'offsetof' 40 | static_assert(offsetof(struct page, pg) == offsetof(struct zpdesc, zp)) | ^~~~~~~~ mm/zpdesc.h:48:1: note: in expansion of macro 'ZPDESC_MATCH' 48 | ZPDESC_MATCH(memcg_data, memcg_data); | ^~~~~~~~~~~~ >> include/linux/stddef.h:16:33: error: 'struct zpdesc' has no member named 'memcg_data' 16 | #define offsetof(TYPE, MEMBER) __builtin_offsetof(TYPE, MEMBER) | ^~~~~~~~~~~~~~~~~~ include/linux/build_bug.h:78:56: note: in definition of macro '__static_assert' 78 | #define __static_assert(expr, msg, ...) _Static_assert(expr, msg) | ^~~~ mm/zpdesc.h:40:9: note: in expansion of macro 'static_assert' 40 | static_assert(offsetof(struct page, pg) == offsetof(struct zpdesc, zp)) | ^~~~~~~~~~~~~ mm/zpdesc.h:40:52: note: in expansion of macro 'offsetof' 40 | static_assert(offsetof(struct page, pg) == offsetof(struct zpdesc, zp)) | ^~~~~~~~ mm/zpdesc.h:48:1: note: in expansion of macro 'ZPDESC_MATCH' 48 | ZPDESC_MATCH(memcg_data, memcg_data); | ^~~~~~~~~~~~ >> include/linux/stddef.h:16:33: error: expression in static assertion is not an integer 16 | #define offsetof(TYPE, MEMBER) __builtin_offsetof(TYPE, MEMBER) | ^~~~~~~~~~~~~~~~~~ include/linux/build_bug.h:78:56: note: in definition of macro '__static_assert' 78 | #define __static_assert(expr, msg, ...) _Static_assert(expr, msg) | ^~~~ mm/zpdesc.h:40:9: note: in expansion of macro 'static_assert' 40 | static_assert(offsetof(struct page, pg) == offsetof(struct zpdesc, zp)) | ^~~~~~~~~~~~~ mm/zpdesc.h:40:23: note: in expansion of macro 'offsetof' 40 | static_assert(offsetof(struct page, pg) == offsetof(struct zpdesc, zp)) | ^~~~~~~~ mm/zpdesc.h:48:1: note: in expansion of macro 'ZPDESC_MATCH' 48 | ZPDESC_MATCH(memcg_data, memcg_data); | ^~~~~~~~~~~~ vim +16 include/linux/stddef.h 6e2182874324727 Richard Knutsson 2006-09-30 14 ^1da177e4c3f415 Linus Torvalds 2005-04-16 15 #undef offsetof 14e83077d55ff4b Rasmus Villemoes 2022-03-23 @16 #define offsetof(TYPE, MEMBER) __builtin_offsetof(TYPE, MEMBER) 3876488444e7123 Denys Vlasenko 2015-03-09 17
diff --git a/mm/zpdesc.h b/mm/zpdesc.h new file mode 100644 index 000000000000..4455a663ee84 --- /dev/null +++ b/mm/zpdesc.h @@ -0,0 +1,64 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* zpdesc.h: zswap.zpool memory descriptor + * + * Written by Alex Shi <alexs@kernel.org> + * Hyeonggon Yoo <42.hyeyoo@gmail.com> + */ +#ifndef __MM_ZPDESC_H__ +#define __MM_ZPDESC_H__ + +/* + * struct zpdesc - Memory descriptor for zpool memory, now is for zsmalloc + * @flags: Page flags, PG_private: identifies the first component page + * @lru: Indirectly used by page migration + * @mops: Used by page migration + * @next: Next zpdesc in a zspage in zsmalloc zpool + * @handle: For huge zspage in zsmalloc zpool + * @zspage: Pointer to zspage in zsmalloc + * @memcg_data: Memory Control Group data. + * + * This struct overlays struct page for now. Do not modify without a good + * understanding of the issues. + */ +struct zpdesc { + unsigned long flags; + struct list_head lru; + struct movable_operations *mops; + union { + /* Next zpdescs in a zspage in zsmalloc zpool */ + struct zpdesc *next; + /* For huge zspage in zsmalloc zpool */ + unsigned long handle; + }; + struct zspage *zspage; + unsigned long _zp_pad_1; +#ifdef CONFIG_SLAB_OBJ_EXT + unsigned long memcg_data; +#endif +}; +#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, mops); +ZPDESC_MATCH(index, next); +ZPDESC_MATCH(index, handle); +ZPDESC_MATCH(private, zspage); +ZPDESC_MATCH(memcg_data, memcg_data); +#undef ZPDESC_MATCH +static_assert(sizeof(struct zpdesc) <= sizeof(struct page)); + +#define zpdesc_page(zp) (_Generic((zp), \ + const struct zpdesc *: (const struct page *)(zp), \ + struct zpdesc *: (struct page *)(zp))) + +#define zpdesc_folio(zp) (_Generic((zp), \ + const struct zpdesc *: (const struct folio *)(zp), \ + struct zpdesc *: (struct folio *)(zp))) + +#define page_zpdesc(p) (_Generic((p), \ + const struct page *: (const struct zpdesc *)(p), \ + struct page *: (struct zpdesc *)(p))) + +#endif diff --git a/mm/zsmalloc.c b/mm/zsmalloc.c index 5d6581ab7c07..a532851025f9 100644 --- a/mm/zsmalloc.c +++ b/mm/zsmalloc.c @@ -13,20 +13,18 @@ /* * Following is how we use various fields and flags of underlying - * struct page(s) to form a zspage. + * struct zpdesc(page) to form a zspage. * - * Usage of struct page fields: - * page->private: points to zspage - * page->index: links together all component pages of a zspage + * Usage of struct zpdesc fields: + * zpdesc->zspage: points to zspage + * zpdesc->next: 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: PG_zsmalloc, lower 16 bit locate the first object * offset in a subpage of a zspage * - * Usage of struct page flags: + * Usage of struct zpdesc(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 @@ -64,6 +62,7 @@ #include <linux/pagemap.h> #include <linux/fs.h> #include <linux/local_lock.h> +#include "zpdesc.h" #define ZSPAGE_MAGIC 0x58 @@ -253,7 +252,7 @@ struct zspage { }; unsigned int inuse; unsigned int freeobj; - struct page *first_page; + struct zpdesc *first_zpdesc; struct list_head list; /* fullness list */ struct zs_pool *pool; rwlock_t lock; @@ -448,7 +447,7 @@ static inline void mod_zspage_inuse(struct zspage *zspage, int val) static inline struct page *get_first_page(struct zspage *zspage) { - struct page *first_page = zspage->first_page; + struct page *first_page = zpdesc_page(zspage->first_zpdesc); VM_BUG_ON_PAGE(!is_first_page(first_page), first_page); return first_page; @@ -948,7 +947,7 @@ static void create_page_chain(struct size_class *class, struct zspage *zspage, set_page_private(page, (unsigned long)zspage); page->index = 0; if (i == 0) { - zspage->first_page = page; + zspage->first_zpdesc = page_zpdesc(page); SetPagePrivate(page); if (unlikely(class->objs_per_zspage == 1 && class->pages_per_zspage == 1)) @@ -1324,7 +1323,7 @@ static unsigned long obj_malloc(struct zs_pool *pool, link->handle = handle | OBJ_ALLOCATED_TAG; else /* record handle to page->index */ - zspage->first_page->index = handle | OBJ_ALLOCATED_TAG; + zspage->first_zpdesc->handle = handle | OBJ_ALLOCATED_TAG; kunmap_atomic(vaddr); mod_zspage_inuse(zspage, 1);