Re: [RESEND PATCH v1 5/5] mm: ptep_deref() conversion

From: Ryan Roberts
Date: Fri May 12 2023 - 06:51:06 EST


On 11/05/2023 18:37, kernel test robot wrote:
> Hi Ryan,
>
> kernel test robot noticed the following build errors:
>
> [auto build test ERROR on akpm-mm/mm-everything]
> [also build test ERROR on sj/damon/next drm-intel/for-linux-next-fixes char-misc/char-misc-testing char-misc/char-misc-next char-misc/char-misc-linus tip/perf/core kvm/queue linus/master v6.4-rc1 next-20230511]
> [cannot apply to drm-intel/for-linux-next awilliam-vfio/next awilliam-vfio/for-linus xen-tip/linux-next acme/perf/core kvm/linux-next]
> [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#_base_tree_information]
>
> url: https://github.com/intel-lab-lkp/linux/commits/Ryan-Roberts/mm-vmalloc-must-set-pte-via-arch-code/20230511-213826
> base: https://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm.git mm-everything
> patch link: https://lore.kernel.org/r/20230511132113.80196-6-ryan.roberts%40arm.com
> patch subject: [RESEND PATCH v1 5/5] mm: ptep_deref() conversion
> config: sh-allmodconfig (https://download.01.org/0day-ci/archive/20230512/202305120142.yXsNEo6H-lkp@xxxxxxxxx/config)
> compiler: sh4-linux-gcc (GCC) 12.1.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/intel-lab-lkp/linux/commit/6cb99aca1b207cdf4f320eec14447bdc654b51df
> git remote add linux-review https://github.com/intel-lab-lkp/linux
> git fetch --no-tags linux-review Ryan-Roberts/mm-vmalloc-must-set-pte-via-arch-code/20230511-213826
> git checkout 6cb99aca1b207cdf4f320eec14447bdc654b51df
> # save the config file
> mkdir build_dir && cp config build_dir/.config
> COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.1.0 make.cross W=1 O=build_dir ARCH=sh olddefconfig
> COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.1.0 make.cross W=1 O=build_dir ARCH=sh SHELL=/bin/bash fs/

FYI This doesn't work on Ubuntu 20.04 or Debian Bullseye due to libc being too
old. So I used an Ubuntu 22.04 VM (x86_64), but with that was getting internal
compiler errors while compiling. Despite that, was able to repro and fix the error.

>
> If you fix the issue, kindly add following tag where applicable
> | Reported-by: kernel test robot <lkp@xxxxxxxxx>
> | Link: https://lore.kernel.org/oe-kbuild-all/202305120142.yXsNEo6H-lkp@xxxxxxxxx/

Will do - thanks!

>
> All errors (new ones prefixed by >>):
>
> In file included from include/linux/migrate.h:8,
> from fs/nfs/write.c:17:
> include/linux/hugetlb.h: In function 'huge_ptep_clear_flush':
>>> include/linux/hugetlb.h:1203:16: error: implicit declaration of function 'ptep_deref' [-Werror=implicit-function-declaration]
> 1203 | return ptep_deref(ptep);
> | ^~~~~~~~~~
>>> include/linux/hugetlb.h:1203:16: error: incompatible types when returning type 'int' but 'pte_t' was expected
> 1203 | return ptep_deref(ptep);
> | ^~~~~~~~~~~~~~~~
> cc1: some warnings being treated as errors
> --
> In file included from fs/proc/meminfo.c:6:
> include/linux/hugetlb.h: In function 'huge_ptep_clear_flush':
>>> include/linux/hugetlb.h:1203:16: error: implicit declaration of function 'ptep_deref' [-Werror=implicit-function-declaration]
> 1203 | return ptep_deref(ptep);
> | ^~~~~~~~~~
>>> include/linux/hugetlb.h:1203:16: error: incompatible types when returning type 'int' but 'pte_t' was expected
> 1203 | return ptep_deref(ptep);
> | ^~~~~~~~~~~~~~~~
> fs/proc/meminfo.c: At top level:
> fs/proc/meminfo.c:23:28: warning: no previous prototype for 'arch_report_meminfo' [-Wmissing-prototypes]
> 23 | void __attribute__((weak)) arch_report_meminfo(struct seq_file *m)
> | ^~~~~~~~~~~~~~~~~~~
> cc1: some warnings being treated as errors
>
>
> vim +/ptep_deref +1203 include/linux/hugetlb.h
>
> 1199
> 1200 static inline pte_t huge_ptep_clear_flush(struct vm_area_struct *vma,
> 1201 unsigned long addr, pte_t *ptep)
> 1202 {
>> 1203 return ptep_deref(ptep);
> 1204 }
> 1205
>

Root cause is due to this being MMU=n build, where the ptep helpers (including
ptep_deref()) are not defined. A huge_ptep_clear_flush() default is still
defined for linking reasons, which derefrences the ptep, so changing that to the
new helper blows up in this config.

Fixed with:

static inline pte_t huge_ptep_clear_flush(struct vm_area_struct *vma,
unsigned long addr, pte_t *ptep)
{
+#ifdef CONFIG_MMU
return ptep_deref(ptep);
+#else
+ return *ptep;
+#endif
}

Will include with v2.

Thanks,
Ryan