Hi David, I love your patch! Yet something to improve: [auto build test ERROR on s390/features] [also build test ERROR on next-20200703] [cannot apply to linux/master kvms390/next linus/master v5.8-rc3] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use as documented in https://git-scm.com/docs/git-format-patch] url: https://github.com/0day-ci/linux/commits/David-Hildenbrand/s390-implement-and-optimize-vmemmap_free/20200703-214348 base: https://git.kernel.org/pub/scm/linux/kernel/git/s390/linux.git features config: s390-randconfig-r036-20200701 (attached as .config) compiler: clang version 11.0.0 (https://github.com/llvm/llvm-project ca464639a1c9dd3944eb055ffd2796e8c2e7639f) 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 # install s390 cross compiling tool for clang build # apt-get install binutils-s390x-linux-gnu # save the attached .config to linux build tree COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=s390 If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot All errors (new ones prefixed by >>): #define __le32_to_cpu(x) __swab32((__force __u32)(__le32)(x)) ^ include/uapi/linux/swab.h:119:21: note: expanded from macro '__swab32' ___constant_swab32(x) : \ ^ include/uapi/linux/swab.h:19:12: note: expanded from macro '___constant_swab32' (((__u32)(x) & (__u32)0x000000ffUL) << 24) | \ ^ In file included from arch/s390/mm/vmem.c:7: In file included from include/linux/memblock.h:14: In file included from arch/s390/include/asm/dma.h:5: In file included from arch/s390/include/asm/io.h:72: include/asm-generic/io.h:490:45: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] val = __le32_to_cpu(__raw_readl(PCI_IOBASE + addr)); ~~~~~~~~~~ ^ include/uapi/linux/byteorder/big_endian.h:34:59: note: expanded from macro '__le32_to_cpu' #define __le32_to_cpu(x) __swab32((__force __u32)(__le32)(x)) ^ include/uapi/linux/swab.h:119:21: note: expanded from macro '__swab32' ___constant_swab32(x) : \ ^ include/uapi/linux/swab.h:20:12: note: expanded from macro '___constant_swab32' (((__u32)(x) & (__u32)0x0000ff00UL) << 8) | \ ^ In file included from arch/s390/mm/vmem.c:7: In file included from include/linux/memblock.h:14: In file included from arch/s390/include/asm/dma.h:5: In file included from arch/s390/include/asm/io.h:72: include/asm-generic/io.h:490:45: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] val = __le32_to_cpu(__raw_readl(PCI_IOBASE + addr)); ~~~~~~~~~~ ^ include/uapi/linux/byteorder/big_endian.h:34:59: note: expanded from macro '__le32_to_cpu' #define __le32_to_cpu(x) __swab32((__force __u32)(__le32)(x)) ^ include/uapi/linux/swab.h:119:21: note: expanded from macro '__swab32' ___constant_swab32(x) : \ ^ include/uapi/linux/swab.h:21:12: note: expanded from macro '___constant_swab32' (((__u32)(x) & (__u32)0x00ff0000UL) >> 8) | \ ^ In file included from arch/s390/mm/vmem.c:7: In file included from include/linux/memblock.h:14: In file included from arch/s390/include/asm/dma.h:5: In file included from arch/s390/include/asm/io.h:72: include/asm-generic/io.h:490:45: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] val = __le32_to_cpu(__raw_readl(PCI_IOBASE + addr)); ~~~~~~~~~~ ^ include/uapi/linux/byteorder/big_endian.h:34:59: note: expanded from macro '__le32_to_cpu' #define __le32_to_cpu(x) __swab32((__force __u32)(__le32)(x)) ^ include/uapi/linux/swab.h:119:21: note: expanded from macro '__swab32' ___constant_swab32(x) : \ ^ include/uapi/linux/swab.h:22:12: note: expanded from macro '___constant_swab32' (((__u32)(x) & (__u32)0xff000000UL) >> 24))) ^ In file included from arch/s390/mm/vmem.c:7: In file included from include/linux/memblock.h:14: In file included from arch/s390/include/asm/dma.h:5: In file included from arch/s390/include/asm/io.h:72: include/asm-generic/io.h:490:45: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] val = __le32_to_cpu(__raw_readl(PCI_IOBASE + addr)); ~~~~~~~~~~ ^ include/uapi/linux/byteorder/big_endian.h:34:59: note: expanded from macro '__le32_to_cpu' #define __le32_to_cpu(x) __swab32((__force __u32)(__le32)(x)) ^ include/uapi/linux/swab.h:120:12: note: expanded from macro '__swab32' __fswab32(x)) ^ In file included from arch/s390/mm/vmem.c:7: In file included from include/linux/memblock.h:14: In file included from arch/s390/include/asm/dma.h:5: In file included from arch/s390/include/asm/io.h:72: include/asm-generic/io.h:501:33: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] __raw_writeb(value, PCI_IOBASE + addr); ~~~~~~~~~~ ^ include/asm-generic/io.h:511:46: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] __raw_writew(cpu_to_le16(value), PCI_IOBASE + addr); ~~~~~~~~~~ ^ include/asm-generic/io.h:521:46: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] __raw_writel(cpu_to_le32(value), PCI_IOBASE + addr); ~~~~~~~~~~ ^ include/asm-generic/io.h:609:20: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] readsb(PCI_IOBASE + addr, buffer, count); ~~~~~~~~~~ ^ include/asm-generic/io.h:617:20: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] readsw(PCI_IOBASE + addr, buffer, count); ~~~~~~~~~~ ^ include/asm-generic/io.h:625:20: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] readsl(PCI_IOBASE + addr, buffer, count); ~~~~~~~~~~ ^ include/asm-generic/io.h:634:21: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] writesb(PCI_IOBASE + addr, buffer, count); ~~~~~~~~~~ ^ include/asm-generic/io.h:643:21: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] writesw(PCI_IOBASE + addr, buffer, count); ~~~~~~~~~~ ^ include/asm-generic/io.h:652:21: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] writesl(PCI_IOBASE + addr, buffer, count); ~~~~~~~~~~ ^ >> arch/s390/mm/vmem.c:368:3: error: implicit declaration of function 'vmemmap_free' [-Werror,-Wimplicit-function-declaration] vmemmap_free(start, end, altmap); ^ >> arch/s390/mm/vmem.c:372:6: error: conflicting types for 'vmemmap_free' void vmemmap_free(unsigned long start, unsigned long end, ^ arch/s390/mm/vmem.c:368:3: note: previous implicit declaration is here vmemmap_free(start, end, altmap); ^ 20 warnings and 2 errors generated. vim +/vmemmap_free +368 arch/s390/mm/vmem.c 280 281 /* 282 * Add a backed mem_map array to the virtual mem_map array. 283 */ 284 int __meminit vmemmap_populate(unsigned long start, unsigned long end, int node, 285 struct vmem_altmap *altmap) 286 { 287 unsigned long pgt_prot, sgt_prot; 288 unsigned long address = start; 289 pgd_t *pg_dir; 290 p4d_t *p4_dir; 291 pud_t *pu_dir; 292 pmd_t *pm_dir; 293 pte_t *pt_dir; 294 int ret = -ENOMEM; 295 296 pgt_prot = pgprot_val(PAGE_KERNEL); 297 sgt_prot = pgprot_val(SEGMENT_KERNEL); 298 if (!MACHINE_HAS_NX) { 299 pgt_prot &= ~_PAGE_NOEXEC; 300 sgt_prot &= ~_SEGMENT_ENTRY_NOEXEC; 301 } 302 for (address = start; address < end;) { 303 pg_dir = pgd_offset_k(address); 304 if (pgd_none(*pg_dir)) { 305 p4_dir = vmem_crst_alloc(_REGION2_ENTRY_EMPTY); 306 if (!p4_dir) 307 goto out; 308 pgd_populate(&init_mm, pg_dir, p4_dir); 309 } 310 311 p4_dir = p4d_offset(pg_dir, address); 312 if (p4d_none(*p4_dir)) { 313 pu_dir = vmem_crst_alloc(_REGION3_ENTRY_EMPTY); 314 if (!pu_dir) 315 goto out; 316 p4d_populate(&init_mm, p4_dir, pu_dir); 317 } 318 319 pu_dir = pud_offset(p4_dir, address); 320 if (pud_none(*pu_dir)) { 321 pm_dir = vmem_crst_alloc(_SEGMENT_ENTRY_EMPTY); 322 if (!pm_dir) 323 goto out; 324 pud_populate(&init_mm, pu_dir, pm_dir); 325 } 326 327 pm_dir = pmd_offset(pu_dir, address); 328 if (pmd_none(*pm_dir)) { 329 /* Use 1MB frames for vmemmap if available. We always 330 * use large frames even if they are only partially 331 * used. 332 * Otherwise we would have also page tables since 333 * vmemmap_populate gets called for each section 334 * separately. */ 335 if (MACHINE_HAS_EDAT1) { 336 void *new_page; 337 338 new_page = vmemmap_alloc_block(PMD_SIZE, node); 339 if (!new_page) 340 goto out; 341 pmd_val(*pm_dir) = __pa(new_page) | sgt_prot; 342 address = (address + PMD_SIZE) & PMD_MASK; 343 continue; 344 } 345 pt_dir = vmem_pte_alloc(); 346 if (!pt_dir) 347 goto out; 348 pmd_populate(&init_mm, pm_dir, pt_dir); 349 } else if (pmd_large(*pm_dir)) { 350 address = (address + PMD_SIZE) & PMD_MASK; 351 continue; 352 } 353 354 pt_dir = pte_offset_kernel(pm_dir, address); 355 if (pte_none(*pt_dir)) { 356 void *new_page; 357 358 new_page = vmemmap_alloc_block(PAGE_SIZE, node); 359 if (!new_page) 360 goto out; 361 pte_val(*pt_dir) = __pa(new_page) | pgt_prot; 362 } 363 address += PAGE_SIZE; 364 } 365 ret = 0; 366 out: 367 if (ret) > 368 vmemmap_free(start, end, altmap); 369 return ret; 370 } 371 > 372 void vmemmap_free(unsigned long start, unsigned long end, 373 struct vmem_altmap *altmap) 374 { 375 remove_pagetable(start, end, false); 376 } 377 --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org