Message ID | 20210712194551.91920-7-willy@infradead.org (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | Convert memcg to folios | expand |
Hi "Matthew, Thank you for the patch! Yet something to improve: [auto build test ERROR on linus/master] [also build test ERROR on v5.14-rc1 next-20210712] [cannot apply to hnaz-linux-mm/master tip/perf/core linux/master] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch] url: https://github.com/0day-ci/linux/commits/Matthew-Wilcox-Oracle/Convert-memcg-to-folios/20210713-035650 base: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git e73f0f0ee7541171d89f2e2491130c7771ba58d3 config: i386-randconfig-p002-20210712 (attached as .config) compiler: gcc-9 (Debian 9.3.0-22) 9.3.0 reproduce (this is a W=1 build): # https://github.com/0day-ci/linux/commit/90cfa1fbae827b338bee737e073ffab84823bfed git remote add linux-review https://github.com/0day-ci/linux git fetch --no-tags linux-review Matthew-Wilcox-Oracle/Convert-memcg-to-folios/20210713-035650 git checkout 90cfa1fbae827b338bee737e073ffab84823bfed # save the attached .config to linux build tree make W=1 ARCH=i386 If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot <lkp@intel.com> All errors (new ones prefixed by >>): In file included from include/linux/kallsyms.h:13, from include/linux/bpf.h:20, from include/linux/bpf-cgroup.h:5, from include/linux/cgroup-defs.h:22, from include/linux/cgroup.h:28, from include/linux/memcontrol.h:13, from include/linux/swap.h:9, from include/linux/suspend.h:5, from arch/x86/kernel/asm-offsets.c:13: include/linux/mm.h:1380:42: warning: 'struct folio' declared inside parameter list will not be visible outside of this definition or declaration 1380 | static inline int folio_nid(const struct folio *folio) | ^~~~~ include/linux/mm.h: In function 'folio_nid': >> include/linux/mm.h:1382:27: error: dereferencing pointer to incomplete type 'const struct folio' 1382 | return page_to_nid(&folio->page); | ^~ In file included from include/linux/swap.h:9, from include/linux/suspend.h:5, from arch/x86/kernel/asm-offsets.c:13: include/linux/memcontrol.h: At top level: include/linux/memcontrol.h:375:44: warning: 'struct folio' declared inside parameter list will not be visible outside of this definition or declaration 375 | static inline bool folio_memcg_kmem(struct folio *folio); | ^~~~~ include/linux/memcontrol.h:399:55: warning: 'struct folio' declared inside parameter list will not be visible outside of this definition or declaration 399 | static inline struct mem_cgroup *__folio_memcg(struct folio *folio) | ^~~~~ include/linux/memcontrol.h: In function '__folio_memcg': include/linux/memcontrol.h:401:34: error: dereferencing pointer to incomplete type 'struct folio' 401 | unsigned long memcg_data = folio->memcg_data; | ^~ >> include/linux/memcontrol.h:403:2: error: implicit declaration of function 'VM_BUG_ON_FOLIO'; did you mean 'VM_BUG_ON_MM'? [-Werror=implicit-function-declaration] 403 | VM_BUG_ON_FOLIO(folio_slab(folio), folio); | ^~~~~~~~~~~~~~~ | VM_BUG_ON_MM >> include/linux/memcontrol.h:403:18: error: implicit declaration of function 'folio_slab' [-Werror=implicit-function-declaration] 403 | VM_BUG_ON_FOLIO(folio_slab(folio), folio); | ^~~~~~~~~~ include/linux/memcontrol.h: At top level: include/linux/memcontrol.h:420:55: warning: 'struct folio' declared inside parameter list will not be visible outside of this definition or declaration 420 | static inline struct obj_cgroup *__folio_objcg(struct folio *folio) | ^~~~~ include/linux/memcontrol.h: In function '__folio_objcg': include/linux/memcontrol.h:422:34: error: dereferencing pointer to incomplete type 'struct folio' 422 | unsigned long memcg_data = folio->memcg_data; | ^~ include/linux/memcontrol.h: At top level: include/linux/memcontrol.h:451:53: warning: 'struct folio' declared inside parameter list will not be visible outside of this definition or declaration 451 | static inline struct mem_cgroup *folio_memcg(struct folio *folio) | ^~~~~ include/linux/memcontrol.h: In function 'folio_memcg': >> include/linux/memcontrol.h:453:23: error: passing argument 1 of 'folio_memcg_kmem' from incompatible pointer type [-Werror=incompatible-pointer-types] 453 | if (folio_memcg_kmem(folio)) | ^~~~~ | | | struct folio * include/linux/memcontrol.h:375:51: note: expected 'struct folio *' but argument is of type 'struct folio *' 375 | static inline bool folio_memcg_kmem(struct folio *folio); | ~~~~~~~~~~~~~~^~~~~ >> include/linux/memcontrol.h:454:41: error: passing argument 1 of '__folio_objcg' from incompatible pointer type [-Werror=incompatible-pointer-types] 454 | return obj_cgroup_memcg(__folio_objcg(folio)); | ^~~~~ | | | struct folio * include/linux/memcontrol.h:420:62: note: expected 'struct folio *' but argument is of type 'struct folio *' 420 | static inline struct obj_cgroup *__folio_objcg(struct folio *folio) | ~~~~~~~~~~~~~~^~~~~ >> include/linux/memcontrol.h:455:23: error: passing argument 1 of '__folio_memcg' from incompatible pointer type [-Werror=incompatible-pointer-types] 455 | return __folio_memcg(folio); | ^~~~~ | | | struct folio * include/linux/memcontrol.h:399:62: note: expected 'struct folio *' but argument is of type 'struct folio *' 399 | static inline struct mem_cgroup *__folio_memcg(struct folio *folio) | ~~~~~~~~~~~~~~^~~~~ include/linux/memcontrol.h: In function 'page_memcg': >> include/linux/memcontrol.h:460:21: error: implicit declaration of function 'page_folio' [-Werror=implicit-function-declaration] 460 | return folio_memcg(page_folio(page)); | ^~~~~~~~~~ include/linux/memcontrol.h:460:21: warning: passing argument 1 of 'folio_memcg' makes pointer from integer without a cast [-Wint-conversion] 460 | return folio_memcg(page_folio(page)); | ^~~~~~~~~~~~~~~~ | | | int include/linux/memcontrol.h:451:60: note: expected 'struct folio *' but argument is of type 'int' 451 | static inline struct mem_cgroup *folio_memcg(struct folio *folio) | ~~~~~~~~~~~~~~^~~~~ include/linux/memcontrol.h: At top level: include/linux/memcontrol.h:540:44: warning: 'struct folio' declared inside parameter list will not be visible outside of this definition or declaration 540 | static inline bool folio_memcg_kmem(struct folio *folio) | ^~~~~ >> include/linux/memcontrol.h:540:20: error: conflicting types for 'folio_memcg_kmem' 540 | static inline bool folio_memcg_kmem(struct folio *folio) | ^~~~~~~~~~~~~~~~ include/linux/memcontrol.h:375:20: note: previous declaration of 'folio_memcg_kmem' was here 375 | static inline bool folio_memcg_kmem(struct folio *folio); | ^~~~~~~~~~~~~~~~ In file included from include/asm-generic/atomic-instrumented.h:20, from include/linux/atomic.h:81, from include/linux/crypto.h:15, from arch/x86/kernel/asm-offsets.c:9: include/linux/memcontrol.h: In function 'folio_memcg_kmem': include/linux/memcontrol.h:542:35: error: dereferencing pointer to incomplete type 'struct folio' 542 | VM_BUG_ON_PGFLAGS(PageTail(&folio->page), &folio->page); | ^~ include/linux/build_bug.h:30:63: note: in definition of macro 'BUILD_BUG_ON_INVALID' 30 | #define BUILD_BUG_ON_INVALID(e) ((void)(sizeof((__force long)(e)))) | ^ include/linux/memcontrol.h:542:2: note: in expansion of macro 'VM_BUG_ON_PGFLAGS' 542 | VM_BUG_ON_PGFLAGS(PageTail(&folio->page), &folio->page); | ^~~~~~~~~~~~~~~~~ In file included from include/linux/swap.h:9, from include/linux/suspend.h:5, from arch/x86/kernel/asm-offsets.c:13: include/linux/memcontrol.h: In function 'PageMemcgKmem': include/linux/memcontrol.h:606:26: warning: passing argument 1 of 'folio_memcg_kmem' makes pointer from integer without a cast [-Wint-conversion] 606 | return folio_memcg_kmem(page_folio(page)); | ^~~~~~~~~~~~~~~~ | | | int include/linux/memcontrol.h:540:51: note: expected 'struct folio *' but argument is of type 'int' 540 | static inline bool folio_memcg_kmem(struct folio *folio) | ~~~~~~~~~~~~~~^~~~~ arch/x86/kernel/asm-offsets.c: At top level: include/linux/memcontrol.h:375:20: warning: 'folio_memcg_kmem' used but never defined 375 | static inline bool folio_memcg_kmem(struct folio *folio); | ^~~~~~~~~~~~~~~~ cc1: some warnings being treated as errors -- In file included from include/linux/kallsyms.h:13, from include/linux/bpf.h:20, from include/linux/bpf-cgroup.h:5, from include/linux/cgroup-defs.h:22, from include/linux/cgroup.h:28, from include/linux/memcontrol.h:13, from include/linux/swap.h:9, from include/linux/suspend.h:5, from arch/x86/kernel/asm-offsets.c:13: include/linux/mm.h:1380:42: warning: 'struct folio' declared inside parameter list will not be visible outside of this definition or declaration 1380 | static inline int folio_nid(const struct folio *folio) | ^~~~~ include/linux/mm.h: In function 'folio_nid': >> include/linux/mm.h:1382:27: error: dereferencing pointer to incomplete type 'const struct folio' 1382 | return page_to_nid(&folio->page); | ^~ In file included from include/linux/swap.h:9, from include/linux/suspend.h:5, from arch/x86/kernel/asm-offsets.c:13: include/linux/memcontrol.h: At top level: include/linux/memcontrol.h:375:44: warning: 'struct folio' declared inside parameter list will not be visible outside of this definition or declaration 375 | static inline bool folio_memcg_kmem(struct folio *folio); | ^~~~~ include/linux/memcontrol.h:399:55: warning: 'struct folio' declared inside parameter list will not be visible outside of this definition or declaration 399 | static inline struct mem_cgroup *__folio_memcg(struct folio *folio) | ^~~~~ include/linux/memcontrol.h: In function '__folio_memcg': include/linux/memcontrol.h:401:34: error: dereferencing pointer to incomplete type 'struct folio' 401 | unsigned long memcg_data = folio->memcg_data; | ^~ >> include/linux/memcontrol.h:403:2: error: implicit declaration of function 'VM_BUG_ON_FOLIO'; did you mean 'VM_BUG_ON_MM'? [-Werror=implicit-function-declaration] 403 | VM_BUG_ON_FOLIO(folio_slab(folio), folio); | ^~~~~~~~~~~~~~~ | VM_BUG_ON_MM >> include/linux/memcontrol.h:403:18: error: implicit declaration of function 'folio_slab' [-Werror=implicit-function-declaration] 403 | VM_BUG_ON_FOLIO(folio_slab(folio), folio); | ^~~~~~~~~~ include/linux/memcontrol.h: At top level: include/linux/memcontrol.h:420:55: warning: 'struct folio' declared inside parameter list will not be visible outside of this definition or declaration 420 | static inline struct obj_cgroup *__folio_objcg(struct folio *folio) | ^~~~~ include/linux/memcontrol.h: In function '__folio_objcg': include/linux/memcontrol.h:422:34: error: dereferencing pointer to incomplete type 'struct folio' 422 | unsigned long memcg_data = folio->memcg_data; | ^~ include/linux/memcontrol.h: At top level: include/linux/memcontrol.h:451:53: warning: 'struct folio' declared inside parameter list will not be visible outside of this definition or declaration 451 | static inline struct mem_cgroup *folio_memcg(struct folio *folio) | ^~~~~ include/linux/memcontrol.h: In function 'folio_memcg': >> include/linux/memcontrol.h:453:23: error: passing argument 1 of 'folio_memcg_kmem' from incompatible pointer type [-Werror=incompatible-pointer-types] 453 | if (folio_memcg_kmem(folio)) | ^~~~~ | | | struct folio * include/linux/memcontrol.h:375:51: note: expected 'struct folio *' but argument is of type 'struct folio *' 375 | static inline bool folio_memcg_kmem(struct folio *folio); | ~~~~~~~~~~~~~~^~~~~ >> include/linux/memcontrol.h:454:41: error: passing argument 1 of '__folio_objcg' from incompatible pointer type [-Werror=incompatible-pointer-types] 454 | return obj_cgroup_memcg(__folio_objcg(folio)); | ^~~~~ | | | struct folio * include/linux/memcontrol.h:420:62: note: expected 'struct folio *' but argument is of type 'struct folio *' 420 | static inline struct obj_cgroup *__folio_objcg(struct folio *folio) | ~~~~~~~~~~~~~~^~~~~ >> include/linux/memcontrol.h:455:23: error: passing argument 1 of '__folio_memcg' from incompatible pointer type [-Werror=incompatible-pointer-types] 455 | return __folio_memcg(folio); | ^~~~~ | | | struct folio * include/linux/memcontrol.h:399:62: note: expected 'struct folio *' but argument is of type 'struct folio *' 399 | static inline struct mem_cgroup *__folio_memcg(struct folio *folio) | ~~~~~~~~~~~~~~^~~~~ include/linux/memcontrol.h: In function 'page_memcg': >> include/linux/memcontrol.h:460:21: error: implicit declaration of function 'page_folio' [-Werror=implicit-function-declaration] 460 | return folio_memcg(page_folio(page)); | ^~~~~~~~~~ include/linux/memcontrol.h:460:21: warning: passing argument 1 of 'folio_memcg' makes pointer from integer without a cast [-Wint-conversion] 460 | return folio_memcg(page_folio(page)); | ^~~~~~~~~~~~~~~~ | | | int include/linux/memcontrol.h:451:60: note: expected 'struct folio *' but argument is of type 'int' 451 | static inline struct mem_cgroup *folio_memcg(struct folio *folio) | ~~~~~~~~~~~~~~^~~~~ include/linux/memcontrol.h: At top level: include/linux/memcontrol.h:540:44: warning: 'struct folio' declared inside parameter list will not be visible outside of this definition or declaration 540 | static inline bool folio_memcg_kmem(struct folio *folio) | ^~~~~ >> include/linux/memcontrol.h:540:20: error: conflicting types for 'folio_memcg_kmem' 540 | static inline bool folio_memcg_kmem(struct folio *folio) | ^~~~~~~~~~~~~~~~ include/linux/memcontrol.h:375:20: note: previous declaration of 'folio_memcg_kmem' was here 375 | static inline bool folio_memcg_kmem(struct folio *folio); | ^~~~~~~~~~~~~~~~ In file included from include/asm-generic/atomic-instrumented.h:20, from include/linux/atomic.h:81, from include/linux/crypto.h:15, from arch/x86/kernel/asm-offsets.c:9: include/linux/memcontrol.h: In function 'folio_memcg_kmem': include/linux/memcontrol.h:542:35: error: dereferencing pointer to incomplete type 'struct folio' 542 | VM_BUG_ON_PGFLAGS(PageTail(&folio->page), &folio->page); | ^~ include/linux/build_bug.h:30:63: note: in definition of macro 'BUILD_BUG_ON_INVALID' 30 | #define BUILD_BUG_ON_INVALID(e) ((void)(sizeof((__force long)(e)))) | ^ include/linux/memcontrol.h:542:2: note: in expansion of macro 'VM_BUG_ON_PGFLAGS' 542 | VM_BUG_ON_PGFLAGS(PageTail(&folio->page), &folio->page); | ^~~~~~~~~~~~~~~~~ In file included from include/linux/swap.h:9, from include/linux/suspend.h:5, from arch/x86/kernel/asm-offsets.c:13: include/linux/memcontrol.h: In function 'PageMemcgKmem': include/linux/memcontrol.h:606:26: warning: passing argument 1 of 'folio_memcg_kmem' makes pointer from integer without a cast [-Wint-conversion] 606 | return folio_memcg_kmem(page_folio(page)); | ^~~~~~~~~~~~~~~~ | | | int include/linux/memcontrol.h:540:51: note: expected 'struct folio *' but argument is of type 'int' 540 | static inline bool folio_memcg_kmem(struct folio *folio) | ~~~~~~~~~~~~~~^~~~~ arch/x86/kernel/asm-offsets.c: At top level: include/linux/memcontrol.h:375:20: warning: 'folio_memcg_kmem' used but never defined 375 | static inline bool folio_memcg_kmem(struct folio *folio); | ^~~~~~~~~~~~~~~~ cc1: some warnings being treated as errors make[2]: *** [scripts/Makefile.build:117: arch/x86/kernel/asm-offsets.s] Error 1 make[2]: Target '__build' not remade because of errors. make[1]: *** [Makefile:1212: prepare0] Error 2 make[1]: Target 'modules_prepare' not remade because of errors. make: *** [Makefile:220: __sub-make] Error 2 make: Target 'modules_prepare' not remade because of errors. -- In file included from include/linux/kallsyms.h:13, from include/linux/bpf.h:20, from include/linux/bpf-cgroup.h:5, from include/linux/cgroup-defs.h:22, from include/linux/cgroup.h:28, from include/linux/memcontrol.h:13, from include/linux/swap.h:9, from include/linux/suspend.h:5, from arch/x86/kernel/asm-offsets.c:13: include/linux/mm.h:1380:42: warning: 'struct folio' declared inside parameter list will not be visible outside of this definition or declaration 1380 | static inline int folio_nid(const struct folio *folio) | ^~~~~ include/linux/mm.h: In function 'folio_nid': >> include/linux/mm.h:1382:27: error: dereferencing pointer to incomplete type 'const struct folio' 1382 | return page_to_nid(&folio->page); | ^~ In file included from include/linux/swap.h:9, from include/linux/suspend.h:5, from arch/x86/kernel/asm-offsets.c:13: include/linux/memcontrol.h: At top level: include/linux/memcontrol.h:375:44: warning: 'struct folio' declared inside parameter list will not be visible outside of this definition or declaration 375 | static inline bool folio_memcg_kmem(struct folio *folio); | ^~~~~ include/linux/memcontrol.h:399:55: warning: 'struct folio' declared inside parameter list will not be visible outside of this definition or declaration 399 | static inline struct mem_cgroup *__folio_memcg(struct folio *folio) | ^~~~~ include/linux/memcontrol.h: In function '__folio_memcg': include/linux/memcontrol.h:401:34: error: dereferencing pointer to incomplete type 'struct folio' 401 | unsigned long memcg_data = folio->memcg_data; | ^~ >> include/linux/memcontrol.h:403:2: error: implicit declaration of function 'VM_BUG_ON_FOLIO'; did you mean 'VM_BUG_ON_MM'? [-Werror=implicit-function-declaration] 403 | VM_BUG_ON_FOLIO(folio_slab(folio), folio); | ^~~~~~~~~~~~~~~ | VM_BUG_ON_MM >> include/linux/memcontrol.h:403:18: error: implicit declaration of function 'folio_slab' [-Werror=implicit-function-declaration] 403 | VM_BUG_ON_FOLIO(folio_slab(folio), folio); | ^~~~~~~~~~ include/linux/memcontrol.h: At top level: include/linux/memcontrol.h:420:55: warning: 'struct folio' declared inside parameter list will not be visible outside of this definition or declaration 420 | static inline struct obj_cgroup *__folio_objcg(struct folio *folio) | ^~~~~ include/linux/memcontrol.h: In function '__folio_objcg': include/linux/memcontrol.h:422:34: error: dereferencing pointer to incomplete type 'struct folio' 422 | unsigned long memcg_data = folio->memcg_data; | ^~ include/linux/memcontrol.h: At top level: include/linux/memcontrol.h:451:53: warning: 'struct folio' declared inside parameter list will not be visible outside of this definition or declaration 451 | static inline struct mem_cgroup *folio_memcg(struct folio *folio) | ^~~~~ include/linux/memcontrol.h: In function 'folio_memcg': >> include/linux/memcontrol.h:453:23: error: passing argument 1 of 'folio_memcg_kmem' from incompatible pointer type [-Werror=incompatible-pointer-types] 453 | if (folio_memcg_kmem(folio)) | ^~~~~ | | | struct folio * include/linux/memcontrol.h:375:51: note: expected 'struct folio *' but argument is of type 'struct folio *' 375 | static inline bool folio_memcg_kmem(struct folio *folio); | ~~~~~~~~~~~~~~^~~~~ >> include/linux/memcontrol.h:454:41: error: passing argument 1 of '__folio_objcg' from incompatible pointer type [-Werror=incompatible-pointer-types] 454 | return obj_cgroup_memcg(__folio_objcg(folio)); | ^~~~~ | | | struct folio * include/linux/memcontrol.h:420:62: note: expected 'struct folio *' but argument is of type 'struct folio *' 420 | static inline struct obj_cgroup *__folio_objcg(struct folio *folio) | ~~~~~~~~~~~~~~^~~~~ >> include/linux/memcontrol.h:455:23: error: passing argument 1 of '__folio_memcg' from incompatible pointer type [-Werror=incompatible-pointer-types] 455 | return __folio_memcg(folio); | ^~~~~ | | | struct folio * include/linux/memcontrol.h:399:62: note: expected 'struct folio *' but argument is of type 'struct folio *' 399 | static inline struct mem_cgroup *__folio_memcg(struct folio *folio) | ~~~~~~~~~~~~~~^~~~~ include/linux/memcontrol.h: In function 'page_memcg': >> include/linux/memcontrol.h:460:21: error: implicit declaration of function 'page_folio' [-Werror=implicit-function-declaration] 460 | return folio_memcg(page_folio(page)); | ^~~~~~~~~~ include/linux/memcontrol.h:460:21: warning: passing argument 1 of 'folio_memcg' makes pointer from integer without a cast [-Wint-conversion] 460 | return folio_memcg(page_folio(page)); | ^~~~~~~~~~~~~~~~ | | | int include/linux/memcontrol.h:451:60: note: expected 'struct folio *' but argument is of type 'int' 451 | static inline struct mem_cgroup *folio_memcg(struct folio *folio) | ~~~~~~~~~~~~~~^~~~~ include/linux/memcontrol.h: At top level: include/linux/memcontrol.h:540:44: warning: 'struct folio' declared inside parameter list will not be visible outside of this definition or declaration 540 | static inline bool folio_memcg_kmem(struct folio *folio) | ^~~~~ >> include/linux/memcontrol.h:540:20: error: conflicting types for 'folio_memcg_kmem' 540 | static inline bool folio_memcg_kmem(struct folio *folio) | ^~~~~~~~~~~~~~~~ include/linux/memcontrol.h:375:20: note: previous declaration of 'folio_memcg_kmem' was here 375 | static inline bool folio_memcg_kmem(struct folio *folio); | ^~~~~~~~~~~~~~~~ In file included from include/asm-generic/atomic-instrumented.h:20, from include/linux/atomic.h:81, from include/linux/crypto.h:15, from arch/x86/kernel/asm-offsets.c:9: include/linux/memcontrol.h: In function 'folio_memcg_kmem': include/linux/memcontrol.h:542:35: error: dereferencing pointer to incomplete type 'struct folio' 542 | VM_BUG_ON_PGFLAGS(PageTail(&folio->page), &folio->page); | ^~ include/linux/build_bug.h:30:63: note: in definition of macro 'BUILD_BUG_ON_INVALID' 30 | #define BUILD_BUG_ON_INVALID(e) ((void)(sizeof((__force long)(e)))) | ^ include/linux/memcontrol.h:542:2: note: in expansion of macro 'VM_BUG_ON_PGFLAGS' 542 | VM_BUG_ON_PGFLAGS(PageTail(&folio->page), &folio->page); | ^~~~~~~~~~~~~~~~~ In file included from include/linux/swap.h:9, from include/linux/suspend.h:5, from arch/x86/kernel/asm-offsets.c:13: include/linux/memcontrol.h: In function 'PageMemcgKmem': include/linux/memcontrol.h:606:26: warning: passing argument 1 of 'folio_memcg_kmem' makes pointer from integer without a cast [-Wint-conversion] 606 | return folio_memcg_kmem(page_folio(page)); | ^~~~~~~~~~~~~~~~ | | | int include/linux/memcontrol.h:540:51: note: expected 'struct folio *' but argument is of type 'int' 540 | static inline bool folio_memcg_kmem(struct folio *folio) | ~~~~~~~~~~~~~~^~~~~ arch/x86/kernel/asm-offsets.c: At top level: include/linux/memcontrol.h:375:20: warning: 'folio_memcg_kmem' used but never defined 375 | static inline bool folio_memcg_kmem(struct folio *folio); | ^~~~~~~~~~~~~~~~ cc1: some warnings being treated as errors make[2]: *** [scripts/Makefile.build:117: arch/x86/kernel/asm-offsets.s] Error 1 make[2]: Target '__build' not remade because of errors. make[1]: *** [Makefile:1212: prepare0] Error 2 make[1]: Target 'prepare' not remade because of errors. make: *** [Makefile:220: __sub-make] Error 2 make: Target 'prepare' not remade because of errors. vim +403 include/linux/memcontrol.h 388 389 /* 390 * __folio_memcg - Get the memory cgroup associated with a non-kmem folio 391 * @folio: Pointer to the folio. 392 * 393 * Returns a pointer to the memory cgroup associated with the folio, 394 * or NULL. This function assumes that the folio is known to have a 395 * proper memory cgroup pointer. It's not safe to call this function 396 * against some type of folios, e.g. slab folios or ex-slab folios or 397 * kmem folios. 398 */ 399 static inline struct mem_cgroup *__folio_memcg(struct folio *folio) 400 { 401 unsigned long memcg_data = folio->memcg_data; 402 > 403 VM_BUG_ON_FOLIO(folio_slab(folio), folio); 404 VM_BUG_ON_FOLIO(memcg_data & MEMCG_DATA_OBJCGS, folio); 405 VM_BUG_ON_FOLIO(memcg_data & MEMCG_DATA_KMEM, folio); 406 407 return (struct mem_cgroup *)(memcg_data & ~MEMCG_DATA_FLAGS_MASK); 408 } 409 410 /* 411 * __folio_objcg - get the object cgroup associated with a kmem folio. 412 * @folio: Pointer to the folio. 413 * 414 * Returns a pointer to the object cgroup associated with the folio, 415 * or NULL. This function assumes that the folio is known to have a 416 * proper object cgroup pointer. It's not safe to call this function 417 * against some type of folios, e.g. slab folios or ex-slab folios or 418 * LRU folios. 419 */ 420 static inline struct obj_cgroup *__folio_objcg(struct folio *folio) 421 { 422 unsigned long memcg_data = folio->memcg_data; 423 424 VM_BUG_ON_FOLIO(folio_slab(folio), folio); 425 VM_BUG_ON_FOLIO(memcg_data & MEMCG_DATA_OBJCGS, folio); 426 VM_BUG_ON_FOLIO(!(memcg_data & MEMCG_DATA_KMEM), folio); 427 428 return (struct obj_cgroup *)(memcg_data & ~MEMCG_DATA_FLAGS_MASK); 429 } 430 431 /* 432 * folio_memcg - Get the memory cgroup associated with a folio. 433 * @folio: Pointer to the folio. 434 * 435 * Returns a pointer to the memory cgroup associated with the folio, 436 * or NULL. This function assumes that the folio is known to have a 437 * proper memory cgroup pointer. It's not safe to call this function 438 * against some type of folios, e.g. slab folios or ex-slab folios. 439 * 440 * For a non-kmem folio any of the following ensures folio and memcg binding 441 * stability: 442 * 443 * - the folio lock 444 * - LRU isolation 445 * - lock_page_memcg() 446 * - exclusive reference 447 * 448 * For a kmem folio a caller should hold an rcu read lock to protect memcg 449 * associated with a kmem folio from being released. 450 */ 451 static inline struct mem_cgroup *folio_memcg(struct folio *folio) 452 { > 453 if (folio_memcg_kmem(folio)) > 454 return obj_cgroup_memcg(__folio_objcg(folio)); > 455 return __folio_memcg(folio); 456 } 457 458 static inline struct mem_cgroup *page_memcg(struct page *page) 459 { > 460 return folio_memcg(page_folio(page)); 461 } 462 463 /* 464 * page_memcg_rcu - locklessly get the memory cgroup associated with a page 465 * @page: a pointer to the page struct 466 * 467 * Returns a pointer to the memory cgroup associated with the page, 468 * or NULL. This function assumes that the page is known to have a 469 * proper memory cgroup pointer. It's not safe to call this function 470 * against some type of pages, e.g. slab pages or ex-slab pages. 471 */ 472 static inline struct mem_cgroup *page_memcg_rcu(struct page *page) 473 { 474 unsigned long memcg_data = READ_ONCE(page->memcg_data); 475 476 VM_BUG_ON_PAGE(PageSlab(page), page); 477 WARN_ON_ONCE(!rcu_read_lock_held()); 478 479 if (memcg_data & MEMCG_DATA_KMEM) { 480 struct obj_cgroup *objcg; 481 482 objcg = (void *)(memcg_data & ~MEMCG_DATA_FLAGS_MASK); 483 return obj_cgroup_memcg(objcg); 484 } 485 486 return (struct mem_cgroup *)(memcg_data & ~MEMCG_DATA_FLAGS_MASK); 487 } 488 489 /* 490 * page_memcg_check - get the memory cgroup associated with a page 491 * @page: a pointer to the page struct 492 * 493 * Returns a pointer to the memory cgroup associated with the page, 494 * or NULL. This function unlike page_memcg() can take any page 495 * as an argument. It has to be used in cases when it's not known if a page 496 * has an associated memory cgroup pointer or an object cgroups vector or 497 * an object cgroup. 498 * 499 * For a non-kmem page any of the following ensures page and memcg binding 500 * stability: 501 * 502 * - the page lock 503 * - LRU isolation 504 * - lock_page_memcg() 505 * - exclusive reference 506 * 507 * For a kmem page a caller should hold an rcu read lock to protect memcg 508 * associated with a kmem page from being released. 509 */ 510 static inline struct mem_cgroup *page_memcg_check(struct page *page) 511 { 512 /* 513 * Because page->memcg_data might be changed asynchronously 514 * for slab pages, READ_ONCE() should be used here. 515 */ 516 unsigned long memcg_data = READ_ONCE(page->memcg_data); 517 518 if (memcg_data & MEMCG_DATA_OBJCGS) 519 return NULL; 520 521 if (memcg_data & MEMCG_DATA_KMEM) { 522 struct obj_cgroup *objcg; 523 524 objcg = (void *)(memcg_data & ~MEMCG_DATA_FLAGS_MASK); 525 return obj_cgroup_memcg(objcg); 526 } 527 528 return (struct mem_cgroup *)(memcg_data & ~MEMCG_DATA_FLAGS_MASK); 529 } 530 531 #ifdef CONFIG_MEMCG_KMEM 532 /* 533 * folio_memcg_kmem - Check if the folio has the memcg_kmem flag set. 534 * @folio: Pointer to the folio. 535 * 536 * Checks if the folio has MemcgKmem flag set. The caller must ensure 537 * that the folio has an associated memory cgroup. It's not safe to call 538 * this function against some types of folios, e.g. slab folios. 539 */ > 540 static inline bool folio_memcg_kmem(struct folio *folio) 541 { 542 VM_BUG_ON_PGFLAGS(PageTail(&folio->page), &folio->page); 543 VM_BUG_ON_FOLIO(folio->memcg_data & MEMCG_DATA_OBJCGS, folio); 544 return folio->memcg_data & MEMCG_DATA_KMEM; 545 } 546 --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h index bfe5c486f4ad..f40c4e0b0431 100644 --- a/include/linux/memcontrol.h +++ b/include/linux/memcontrol.h @@ -372,6 +372,7 @@ enum page_memcg_data_flags { #define MEMCG_DATA_FLAGS_MASK (__NR_MEMCG_DATA_FLAGS - 1) static inline bool PageMemcgKmem(struct page *page); +static inline bool folio_memcg_kmem(struct folio *folio); /* * After the initialization objcg->memcg is always pointing at @@ -386,73 +387,77 @@ static inline struct mem_cgroup *obj_cgroup_memcg(struct obj_cgroup *objcg) } /* - * __page_memcg - get the memory cgroup associated with a non-kmem page - * @page: a pointer to the page struct + * __folio_memcg - Get the memory cgroup associated with a non-kmem folio + * @folio: Pointer to the folio. * - * Returns a pointer to the memory cgroup associated with the page, - * or NULL. This function assumes that the page is known to have a + * Returns a pointer to the memory cgroup associated with the folio, + * or NULL. This function assumes that the folio is known to have a * proper memory cgroup pointer. It's not safe to call this function - * against some type of pages, e.g. slab pages or ex-slab pages or - * kmem pages. + * against some type of folios, e.g. slab folios or ex-slab folios or + * kmem folios. */ -static inline struct mem_cgroup *__page_memcg(struct page *page) +static inline struct mem_cgroup *__folio_memcg(struct folio *folio) { - unsigned long memcg_data = page->memcg_data; + unsigned long memcg_data = folio->memcg_data; - VM_BUG_ON_PAGE(PageSlab(page), page); - VM_BUG_ON_PAGE(memcg_data & MEMCG_DATA_OBJCGS, page); - VM_BUG_ON_PAGE(memcg_data & MEMCG_DATA_KMEM, page); + VM_BUG_ON_FOLIO(folio_slab(folio), folio); + VM_BUG_ON_FOLIO(memcg_data & MEMCG_DATA_OBJCGS, folio); + VM_BUG_ON_FOLIO(memcg_data & MEMCG_DATA_KMEM, folio); return (struct mem_cgroup *)(memcg_data & ~MEMCG_DATA_FLAGS_MASK); } /* - * __page_objcg - get the object cgroup associated with a kmem page - * @page: a pointer to the page struct + * __folio_objcg - get the object cgroup associated with a kmem folio. + * @folio: Pointer to the folio. * - * Returns a pointer to the object cgroup associated with the page, - * or NULL. This function assumes that the page is known to have a + * Returns a pointer to the object cgroup associated with the folio, + * or NULL. This function assumes that the folio is known to have a * proper object cgroup pointer. It's not safe to call this function - * against some type of pages, e.g. slab pages or ex-slab pages or - * LRU pages. + * against some type of folios, e.g. slab folios or ex-slab folios or + * LRU folios. */ -static inline struct obj_cgroup *__page_objcg(struct page *page) +static inline struct obj_cgroup *__folio_objcg(struct folio *folio) { - unsigned long memcg_data = page->memcg_data; + unsigned long memcg_data = folio->memcg_data; - VM_BUG_ON_PAGE(PageSlab(page), page); - VM_BUG_ON_PAGE(memcg_data & MEMCG_DATA_OBJCGS, page); - VM_BUG_ON_PAGE(!(memcg_data & MEMCG_DATA_KMEM), page); + VM_BUG_ON_FOLIO(folio_slab(folio), folio); + VM_BUG_ON_FOLIO(memcg_data & MEMCG_DATA_OBJCGS, folio); + VM_BUG_ON_FOLIO(!(memcg_data & MEMCG_DATA_KMEM), folio); return (struct obj_cgroup *)(memcg_data & ~MEMCG_DATA_FLAGS_MASK); } /* - * page_memcg - get the memory cgroup associated with a page - * @page: a pointer to the page struct + * folio_memcg - Get the memory cgroup associated with a folio. + * @folio: Pointer to the folio. * - * Returns a pointer to the memory cgroup associated with the page, - * or NULL. This function assumes that the page is known to have a + * Returns a pointer to the memory cgroup associated with the folio, + * or NULL. This function assumes that the folio is known to have a * proper memory cgroup pointer. It's not safe to call this function - * against some type of pages, e.g. slab pages or ex-slab pages. + * against some type of folios, e.g. slab folios or ex-slab folios. * - * For a non-kmem page any of the following ensures page and memcg binding + * For a non-kmem folio any of the following ensures folio and memcg binding * stability: * - * - the page lock + * - the folio lock * - LRU isolation * - lock_page_memcg() * - exclusive reference * - * For a kmem page a caller should hold an rcu read lock to protect memcg - * associated with a kmem page from being released. + * For a kmem folio a caller should hold an rcu read lock to protect memcg + * associated with a kmem folio from being released. */ +static inline struct mem_cgroup *folio_memcg(struct folio *folio) +{ + if (folio_memcg_kmem(folio)) + return obj_cgroup_memcg(__folio_objcg(folio)); + return __folio_memcg(folio); +} + static inline struct mem_cgroup *page_memcg(struct page *page) { - if (PageMemcgKmem(page)) - return obj_cgroup_memcg(__page_objcg(page)); - else - return __page_memcg(page); + return folio_memcg(page_folio(page)); } /* @@ -525,17 +530,18 @@ static inline struct mem_cgroup *page_memcg_check(struct page *page) #ifdef CONFIG_MEMCG_KMEM /* - * PageMemcgKmem - check if the page has MemcgKmem flag set - * @page: a pointer to the page struct + * folio_memcg_kmem - Check if the folio has the memcg_kmem flag set. + * @folio: Pointer to the folio. * - * Checks if the page has MemcgKmem flag set. The caller must ensure that - * the page has an associated memory cgroup. It's not safe to call this function - * against some types of pages, e.g. slab pages. + * Checks if the folio has MemcgKmem flag set. The caller must ensure + * that the folio has an associated memory cgroup. It's not safe to call + * this function against some types of folios, e.g. slab folios. */ -static inline bool PageMemcgKmem(struct page *page) +static inline bool folio_memcg_kmem(struct folio *folio) { - VM_BUG_ON_PAGE(page->memcg_data & MEMCG_DATA_OBJCGS, page); - return page->memcg_data & MEMCG_DATA_KMEM; + VM_BUG_ON_PGFLAGS(PageTail(&folio->page), &folio->page); + VM_BUG_ON_FOLIO(folio->memcg_data & MEMCG_DATA_OBJCGS, folio); + return folio->memcg_data & MEMCG_DATA_KMEM; } /* @@ -579,7 +585,7 @@ static inline struct obj_cgroup **page_objcgs_check(struct page *page) } #else -static inline bool PageMemcgKmem(struct page *page) +static inline bool folio_memcg_kmem(struct folio *folio) { return false; } @@ -595,6 +601,11 @@ static inline struct obj_cgroup **page_objcgs_check(struct page *page) } #endif +static inline bool PageMemcgKmem(struct page *page) +{ + return folio_memcg_kmem(page_folio(page)); +} + static __always_inline bool memcg_stat_item_in_bytes(int idx) { if (idx == MEMCG_PERCPU_B) @@ -1106,6 +1117,11 @@ unsigned long mem_cgroup_soft_limit_reclaim(pg_data_t *pgdat, int order, #define MEM_CGROUP_ID_SHIFT 0 #define MEM_CGROUP_ID_MAX 0 +static inline struct mem_cgroup *folio_memcg(struct folio *folio) +{ + return NULL; +} + static inline struct mem_cgroup *page_memcg(struct page *page) { return NULL; @@ -1122,6 +1138,11 @@ static inline struct mem_cgroup *page_memcg_check(struct page *page) return NULL; } +static inline bool folio_memcg_kmem(struct folio *folio) +{ + return false; +} + static inline bool PageMemcgKmem(struct page *page) { return false; diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 1a049bfa0e0a..f0f781dde37a 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -3050,15 +3050,16 @@ int __memcg_kmem_charge_page(struct page *page, gfp_t gfp, int order) */ void __memcg_kmem_uncharge_page(struct page *page, int order) { + struct folio *folio = page_folio(page); struct obj_cgroup *objcg; unsigned int nr_pages = 1 << order; - if (!PageMemcgKmem(page)) + if (!folio_memcg_kmem(folio)) return; - objcg = __page_objcg(page); + objcg = __folio_objcg(folio); obj_cgroup_uncharge_pages(objcg, nr_pages); - page->memcg_data = 0; + folio->memcg_data = 0; obj_cgroup_put(objcg); } @@ -3290,17 +3291,18 @@ void obj_cgroup_uncharge(struct obj_cgroup *objcg, size_t size) */ void split_page_memcg(struct page *head, unsigned int nr) { - struct mem_cgroup *memcg = page_memcg(head); + struct folio *folio = page_folio(head); + struct mem_cgroup *memcg = folio_memcg(folio); int i; if (mem_cgroup_disabled() || !memcg) return; for (i = 1; i < nr; i++) - head[i].memcg_data = head->memcg_data; + folio_page(folio, i)->memcg_data = folio->memcg_data; - if (PageMemcgKmem(head)) - obj_cgroup_get_many(__page_objcg(head), nr - 1); + if (folio_memcg_kmem(folio)) + obj_cgroup_get_many(__folio_objcg(folio), nr - 1); else css_get_many(&memcg->css, nr - 1); } @@ -6835,6 +6837,7 @@ static void uncharge_batch(const struct uncharge_gather *ug) static void uncharge_page(struct page *page, struct uncharge_gather *ug) { + struct folio *folio = page_folio(page); unsigned long nr_pages; struct mem_cgroup *memcg; struct obj_cgroup *objcg; @@ -6848,14 +6851,14 @@ static void uncharge_page(struct page *page, struct uncharge_gather *ug) * exclusive access to the page. */ if (use_objcg) { - objcg = __page_objcg(page); + objcg = __folio_objcg(folio); /* * This get matches the put at the end of the function and * kmem pages do not hold memcg references anymore. */ memcg = get_mem_cgroup_from_objcg(objcg); } else { - memcg = __page_memcg(page); + memcg = __folio_memcg(folio); } if (!memcg)