Re: [PATCH v3 08/18] mm/memcg: Convert mem_cgroup_charge() to take a folio
From: kernel test robot <hidden>
Date: 2021-06-30 07:18:29
Also in:
linux-mm, oe-kbuild-all
Hi "Matthew, Thank you for the patch! Perhaps something to improve: [auto build test WARNING on linus/master] [also build test WARNING on next-20210629] [cannot apply to hnaz-linux-mm/master tip/perf/core cgroup/for-next v5.13] [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/Folio-conversion-of-memcg/20210630-121408 base: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 007b350a58754a93ca9fe50c498cc27780171153 config: sparc64-randconfig-r002-20210628 (attached as .config) compiler: sparc64-linux-gcc (GCC) 9.3.0 reproduce (this is a W=1 build): wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # https://github.com/0day-ci/linux/commit/014d3a00c94acec84ed571a521e10b9fe77a95cc git remote add linux-review https://github.com/0day-ci/linux git fetch --no-tags linux-review Matthew-Wilcox-Oracle/Folio-conversion-of-memcg/20210630-121408 git checkout 014d3a00c94acec84ed571a521e10b9fe77a95cc # save the attached .config to linux build tree COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross ARCH=sparc64 If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot <redacted> All warnings (new ones prefixed by >>): include/linux/mm.h:1382:42: warning: 'struct folio' declared inside parameter list will not be visible outside of this definition or declaration 1382 | static inline int folio_nid(const struct folio *folio) | ^~~~~ include/linux/mm.h: In function 'folio_nid': include/linux/mm.h:1384:27: error: dereferencing pointer to incomplete type 'const struct folio' 1384 | return page_to_nid(&folio->page); | ^~ In file included from include/linux/rmap.h:12, from mm/huge_memory.c:16: 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:456:24: error: passing argument 1 of '__folio_memcg' from incompatible pointer type [-Werror=incompatible-pointer-types] 456 | 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:461:21: error: implicit declaration of function 'page_folio' [-Werror=implicit-function-declaration] 461 | return folio_memcg(page_folio(page)); | ^~~~~~~~~~ include/linux/memcontrol.h:461:21: warning: passing argument 1 of 'folio_memcg' makes pointer from integer without a cast [-Wint-conversion] 461 | 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:589:44: warning: 'struct folio' declared inside parameter list will not be visible outside of this definition or declaration 589 | static inline bool folio_memcg_kmem(struct folio *folio) | ^~~~~ include/linux/memcontrol.h:589:20: error: conflicting types for 'folio_memcg_kmem' 589 | 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); | ^~~~~~~~~~~~~~~~ include/linux/memcontrol.h: In function 'PageMemcgKmem': include/linux/memcontrol.h:607:26: warning: passing argument 1 of 'folio_memcg_kmem' makes pointer from integer without a cast [-Wint-conversion] 607 | return folio_memcg_kmem(page_folio(page)); | ^~~~~~~~~~~~~~~~ | | | int include/linux/memcontrol.h:589:51: note: expected 'struct folio *' but argument is of type 'int' 589 | static inline bool folio_memcg_kmem(struct folio *folio) | ~~~~~~~~~~~~~~^~~~~ include/linux/memcontrol.h: At top level: include/linux/memcontrol.h:708:30: warning: 'struct folio' declared inside parameter list will not be visible outside of this definition or declaration 708 | int mem_cgroup_charge(struct folio *, struct mm_struct *, gfp_t); | ^~~~~ mm/huge_memory.c: In function '__do_huge_pmd_anonymous_page':
quoted
mm/huge_memory.c:597:24: warning: passing argument 1 of 'mem_cgroup_charge' makes pointer from integer without a cast [-Wint-conversion]
597 | if (mem_cgroup_charge(page_folio(page), vma->vm_mm, gfp)) {
| ^~~~~~~~~~~~~~~~
| |
| int
In file included from include/linux/rmap.h:12,
from mm/huge_memory.c:16:
include/linux/memcontrol.h:708:23: note: expected 'struct folio *' but argument is of type 'int'
708 | int mem_cgroup_charge(struct folio *, struct mm_struct *, gfp_t);
| ^~~~~~~~~~~~~~
mm/huge_memory.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
--
1384 | return page_to_nid(&folio->page);
| ^~
In file included from include/linux/rmap.h:12,
from mm/khugepaged.c:9:
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:456:24: error: passing argument 1 of '__folio_memcg' from incompatible pointer type [-Werror=incompatible-pointer-types]
456 | 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:461:21: error: implicit declaration of function 'page_folio' [-Werror=implicit-function-declaration]
461 | return folio_memcg(page_folio(page));
| ^~~~~~~~~~
include/linux/memcontrol.h:461:21: warning: passing argument 1 of 'folio_memcg' makes pointer from integer without a cast [-Wint-conversion]
461 | 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:589:44: warning: 'struct folio' declared inside parameter list will not be visible outside of this definition or declaration
589 | static inline bool folio_memcg_kmem(struct folio *folio)
| ^~~~~
include/linux/memcontrol.h:589:20: error: conflicting types for 'folio_memcg_kmem'
589 | 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);
| ^~~~~~~~~~~~~~~~
include/linux/memcontrol.h: In function 'PageMemcgKmem':
include/linux/memcontrol.h:607:26: warning: passing argument 1 of 'folio_memcg_kmem' makes pointer from integer without a cast [-Wint-conversion]
607 | return folio_memcg_kmem(page_folio(page));
| ^~~~~~~~~~~~~~~~
| |
| int
include/linux/memcontrol.h:589:51: note: expected 'struct folio *' but argument is of type 'int'
589 | static inline bool folio_memcg_kmem(struct folio *folio)
| ~~~~~~~~~~~~~~^~~~~
include/linux/memcontrol.h: At top level:
include/linux/memcontrol.h:708:30: warning: 'struct folio' declared inside parameter list will not be visible outside of this definition or declaration
708 | int mem_cgroup_charge(struct folio *, struct mm_struct *, gfp_t);
| ^~~~~
In file included from arch/sparc/include/asm/bug.h:6,
from include/linux/bug.h:5,
from include/linux/mmdebug.h:5,
from include/linux/mm.h:9,
from mm/khugepaged.c:4:
mm/khugepaged.c: In function 'collapse_huge_page':quoted
mm/khugepaged.c:1091:33: warning: passing argument 1 of 'mem_cgroup_charge' makes pointer from integer without a cast [-Wint-conversion]
1091 | if (unlikely(mem_cgroup_charge(page_folio(new_page), mm, gfp))) {
| ^~~~~~~~~~~~~~~~~~~~
| |
| int
include/linux/compiler.h:78:42: note: in definition of macro 'unlikely'
78 | # define unlikely(x) __builtin_expect(!!(x), 0)
| ^
In file included from include/linux/rmap.h:12,
from mm/khugepaged.c:9:
include/linux/memcontrol.h:708:23: note: expected 'struct folio *' but argument is of type 'int'
708 | int mem_cgroup_charge(struct folio *, struct mm_struct *, gfp_t);
| ^~~~~~~~~~~~~~
mm/khugepaged.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
vim +/mem_cgroup_charge +597 mm/huge_memory.c
586
587 static vm_fault_t __do_huge_pmd_anonymous_page(struct vm_fault *vmf,
588 struct page *page, gfp_t gfp)
589 {
590 struct vm_area_struct *vma = vmf->vma;
591 pgtable_t pgtable;
592 unsigned long haddr = vmf->address & HPAGE_PMD_MASK;
593 vm_fault_t ret = 0;
594
595 VM_BUG_ON_PAGE(!PageCompound(page), page);
596
> 597 if (mem_cgroup_charge(page_folio(page), vma->vm_mm, gfp)) {
598 put_page(page);
599 count_vm_event(THP_FAULT_FALLBACK);
600 count_vm_event(THP_FAULT_FALLBACK_CHARGE);
601 return VM_FAULT_FALLBACK;
602 }
603 cgroup_throttle_swaprate(page, gfp);
604
605 pgtable = pte_alloc_one(vma->vm_mm);
606 if (unlikely(!pgtable)) {
607 ret = VM_FAULT_OOM;
608 goto release;
609 }
610
611 clear_huge_page(page, vmf->address, HPAGE_PMD_NR);
612 /*
613 * The memory barrier inside __SetPageUptodate makes sure that
614 * clear_huge_page writes become visible before the set_pmd_at()
615 * write.
616 */
617 __SetPageUptodate(page);
618
619 vmf->ptl = pmd_lock(vma->vm_mm, vmf->pmd);
620 if (unlikely(!pmd_none(*vmf->pmd))) {
621 goto unlock_release;
622 } else {
623 pmd_t entry;
624
625 ret = check_stable_address_space(vma->vm_mm);
626 if (ret)
627 goto unlock_release;
628
629 /* Deliver the page fault to userland */
630 if (userfaultfd_missing(vma)) {
631 spin_unlock(vmf->ptl);
632 put_page(page);
633 pte_free(vma->vm_mm, pgtable);
634 ret = handle_userfault(vmf, VM_UFFD_MISSING);
635 VM_BUG_ON(ret & VM_FAULT_FALLBACK);
636 return ret;
637 }
638
639 entry = mk_huge_pmd(page, vma->vm_page_prot);
640 entry = maybe_pmd_mkwrite(pmd_mkdirty(entry), vma);
641 page_add_new_anon_rmap(page, vma, haddr, true);
642 lru_cache_add_inactive_or_unevictable(page, vma);
643 pgtable_trans_huge_deposit(vma->vm_mm, vmf->pmd, pgtable);
644 set_pmd_at(vma->vm_mm, haddr, vmf->pmd, entry);
645 update_mmu_cache_pmd(vma, vmf->address, vmf->pmd);
646 add_mm_counter(vma->vm_mm, MM_ANONPAGES, HPAGE_PMD_NR);
647 mm_inc_nr_ptes(vma->vm_mm);
648 spin_unlock(vmf->ptl);
649 count_vm_event(THP_FAULT_ALLOC);
650 count_memcg_event_mm(vma->vm_mm, THP_FAULT_ALLOC);
651 }
652
653 return 0;
654 unlock_release:
655 spin_unlock(vmf->ptl);
656 release:
657 if (pgtable)
658 pte_free(vma->vm_mm, pgtable);
659 put_page(page);
660 return ret;
661
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all-hn68Rpc1hR1g9hUCZPvPmw@public.gmane.org Attachments
- .config.gz [application/gzip] 26865 bytes