lkml.org 
[lkml]   [2020]   [Jul]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [PATCH v1 4/9] s390/vmemmap: cleanup when vmemmap_populate() fails
    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 <lkp@intel.com>

    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
    [unhandled content-type:application/gzip]
    \
     
     \ /
      Last update: 2020-07-04 13:54    [W:3.454 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site