lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [day] [month] [year] [list]
Message-ID: <202107281404.92mJzKla-lkp@intel.com>
Date:   Wed, 28 Jul 2021 14:27:13 +0800
From:   kernel test robot <lkp@...el.com>
To:     Ojaswin Mujoo <ojaswin98@...il.com>
Cc:     clang-built-linux@...glegroups.com, kbuild-all@...ts.01.org,
        devel@...verdev.osuosl.org, linux-kernel@...r.kernel.org,
        Greg Kroah-Hartman <gregkh@...uxfoundation.org>,
        Stefan Wahren <stefan.wahren@...e.com>
Subject: [staging:staging-testing 108/110]
 drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c:185:16:
 warning: result of comparison of constant 419244183493398898 with expression
 of type 'unsigned int' is always false

tree:   https://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging.git staging-testing
head:   39f9137268ee3df0047706df4e9b7357a40ffc98
commit: 7b9148dcb74a004a4df10df3af9239a46dfc2b2f [108/110] staging: vchiq: Combine vchiq platform code into single file
config: powerpc64-randconfig-r011-20210728 (attached as .config)
compiler: clang version 13.0.0 (https://github.com/llvm/llvm-project c49df15c278857adecd12db6bb1cdc96885f7079)
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 powerpc64 cross compiling tool for clang build
        # apt-get install binutils-powerpc64-linux-gnu
        # https://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging.git/commit/?id=7b9148dcb74a004a4df10df3af9239a46dfc2b2f
        git remote add staging https://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging.git
        git fetch --no-tags staging staging-testing
        git checkout 7b9148dcb74a004a4df10df3af9239a46dfc2b2f
        # save the attached .config to linux build tree
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=powerpc64 

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@...el.com>

All warnings (new ones prefixed by >>):

   __do_insb
   ^
   arch/powerpc/include/asm/io.h:556:56: note: expanded from macro '__do_insb'
   #define __do_insb(p, b, n)      readsb((PCI_IO_ADDR)_IO_BASE+(p), (b), (n))
                                          ~~~~~~~~~~~~~~~~~~~~~^
   In file included from drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c:16:
   In file included from include/linux/highmem.h:10:
   In file included from include/linux/hardirq.h:11:
   In file included from arch/powerpc/include/asm/hardirq.h:6:
   In file included from include/linux/irq.h:20:
   In file included from include/linux/io.h:13:
   In file included from arch/powerpc/include/asm/io.h:619:
   arch/powerpc/include/asm/io-defs.h:45:1: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
   DEF_PCI_AC_NORET(insw, (unsigned long p, void *b, unsigned long c),
   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   arch/powerpc/include/asm/io.h:616:3: note: expanded from macro 'DEF_PCI_AC_NORET'
                   __do_##name al;                                 \
                   ^~~~~~~~~~~~~~
   <scratch space>:225:1: note: expanded from here
   __do_insw
   ^
   arch/powerpc/include/asm/io.h:557:56: note: expanded from macro '__do_insw'
   #define __do_insw(p, b, n)      readsw((PCI_IO_ADDR)_IO_BASE+(p), (b), (n))
                                          ~~~~~~~~~~~~~~~~~~~~~^
   In file included from drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c:16:
   In file included from include/linux/highmem.h:10:
   In file included from include/linux/hardirq.h:11:
   In file included from arch/powerpc/include/asm/hardirq.h:6:
   In file included from include/linux/irq.h:20:
   In file included from include/linux/io.h:13:
   In file included from arch/powerpc/include/asm/io.h:619:
   arch/powerpc/include/asm/io-defs.h:47:1: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
   DEF_PCI_AC_NORET(insl, (unsigned long p, void *b, unsigned long c),
   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   arch/powerpc/include/asm/io.h:616:3: note: expanded from macro 'DEF_PCI_AC_NORET'
                   __do_##name al;                                 \
                   ^~~~~~~~~~~~~~
   <scratch space>:229:1: note: expanded from here
   __do_insl
   ^
   arch/powerpc/include/asm/io.h:558:56: note: expanded from macro '__do_insl'
   #define __do_insl(p, b, n)      readsl((PCI_IO_ADDR)_IO_BASE+(p), (b), (n))
                                          ~~~~~~~~~~~~~~~~~~~~~^
   In file included from drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c:16:
   In file included from include/linux/highmem.h:10:
   In file included from include/linux/hardirq.h:11:
   In file included from arch/powerpc/include/asm/hardirq.h:6:
   In file included from include/linux/irq.h:20:
   In file included from include/linux/io.h:13:
   In file included from arch/powerpc/include/asm/io.h:619:
   arch/powerpc/include/asm/io-defs.h:49:1: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
   DEF_PCI_AC_NORET(outsb, (unsigned long p, const void *b, unsigned long c),
   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   arch/powerpc/include/asm/io.h:616:3: note: expanded from macro 'DEF_PCI_AC_NORET'
                   __do_##name al;                                 \
                   ^~~~~~~~~~~~~~
   <scratch space>:233:1: note: expanded from here
   __do_outsb
   ^
   arch/powerpc/include/asm/io.h:559:58: note: expanded from macro '__do_outsb'
   #define __do_outsb(p, b, n)     writesb((PCI_IO_ADDR)_IO_BASE+(p),(b),(n))
                                           ~~~~~~~~~~~~~~~~~~~~~^
   In file included from drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c:16:
   In file included from include/linux/highmem.h:10:
   In file included from include/linux/hardirq.h:11:
   In file included from arch/powerpc/include/asm/hardirq.h:6:
   In file included from include/linux/irq.h:20:
   In file included from include/linux/io.h:13:
   In file included from arch/powerpc/include/asm/io.h:619:
   arch/powerpc/include/asm/io-defs.h:51:1: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
   DEF_PCI_AC_NORET(outsw, (unsigned long p, const void *b, unsigned long c),
   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   arch/powerpc/include/asm/io.h:616:3: note: expanded from macro 'DEF_PCI_AC_NORET'
                   __do_##name al;                                 \
                   ^~~~~~~~~~~~~~
   <scratch space>:237:1: note: expanded from here
   __do_outsw
   ^
   arch/powerpc/include/asm/io.h:560:58: note: expanded from macro '__do_outsw'
   #define __do_outsw(p, b, n)     writesw((PCI_IO_ADDR)_IO_BASE+(p),(b),(n))
                                           ~~~~~~~~~~~~~~~~~~~~~^
   In file included from drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c:16:
   In file included from include/linux/highmem.h:10:
   In file included from include/linux/hardirq.h:11:
   In file included from arch/powerpc/include/asm/hardirq.h:6:
   In file included from include/linux/irq.h:20:
   In file included from include/linux/io.h:13:
   In file included from arch/powerpc/include/asm/io.h:619:
   arch/powerpc/include/asm/io-defs.h:53:1: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
   DEF_PCI_AC_NORET(outsl, (unsigned long p, const void *b, unsigned long c),
   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   arch/powerpc/include/asm/io.h:616:3: note: expanded from macro 'DEF_PCI_AC_NORET'
                   __do_##name al;                                 \
                   ^~~~~~~~~~~~~~
   <scratch space>:241:1: note: expanded from here
   __do_outsl
   ^
   arch/powerpc/include/asm/io.h:561:58: note: expanded from macro '__do_outsl'
   #define __do_outsl(p, b, n)     writesl((PCI_IO_ADDR)_IO_BASE+(p),(b),(n))
                                           ~~~~~~~~~~~~~~~~~~~~~^
>> drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c:185:16: warning: result of comparison of constant 419244183493398898 with expression of type 'unsigned int' is always false [-Wtautological-constant-out-of-range-compare]
           if (num_pages > (SIZE_MAX - sizeof(struct pagelist) -
           ~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/compiler.h:56:47: note: expanded from macro 'if'
   #define if(cond, ...) if ( __trace_if_var( !!(cond , ## __VA_ARGS__) ) )
                              ~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/compiler.h:58:86: note: expanded from macro '__trace_if_var'
   #define __trace_if_var(cond) (__builtin_constant_p(cond) ? (cond) : __trace_if_value(cond))
                                                                       ~~~~~~~~~~~~~~~~~^~~~~
   include/linux/compiler.h:69:3: note: expanded from macro '__trace_if_value'
           (cond) ?                                        \
            ^~~~
>> drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c:185:16: warning: result of comparison of constant 419244183493398898 with expression of type 'unsigned int' is always false [-Wtautological-constant-out-of-range-compare]
           if (num_pages > (SIZE_MAX - sizeof(struct pagelist) -
           ~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/compiler.h:56:47: note: expanded from macro 'if'
   #define if(cond, ...) if ( __trace_if_var( !!(cond , ## __VA_ARGS__) ) )
                              ~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/compiler.h:58:52: note: expanded from macro '__trace_if_var'
   #define __trace_if_var(cond) (__builtin_constant_p(cond) ? (cond) : __trace_if_value(cond))
                                                      ^~~~
>> drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c:185:16: warning: result of comparison of constant 419244183493398898 with expression of type 'unsigned int' is always false [-Wtautological-constant-out-of-range-compare]
           if (num_pages > (SIZE_MAX - sizeof(struct pagelist) -
           ~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/compiler.h:56:47: note: expanded from macro 'if'
   #define if(cond, ...) if ( __trace_if_var( !!(cond , ## __VA_ARGS__) ) )
                              ~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/compiler.h:58:61: note: expanded from macro '__trace_if_var'
   #define __trace_if_var(cond) (__builtin_constant_p(cond) ? (cond) : __trace_if_value(cond))
                                                               ^~~~
   15 warnings generated.


vim +185 drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c

   152	
   153	/* There is a potential problem with partial cache lines (pages?)
   154	 * at the ends of the block when reading. If the CPU accessed anything in
   155	 * the same line (page?) then it may have pulled old data into the cache,
   156	 * obscuring the new data underneath. We can solve this by transferring the
   157	 * partial cache lines separately, and allowing the ARM to copy into the
   158	 * cached area.
   159	 */
   160	
   161	static struct vchiq_pagelist_info *
   162	create_pagelist(char *buf, char __user *ubuf,
   163			size_t count, unsigned short type)
   164	{
   165		struct pagelist *pagelist;
   166		struct vchiq_pagelist_info *pagelistinfo;
   167		struct page **pages;
   168		u32 *addrs;
   169		unsigned int num_pages, offset, i, k;
   170		int actual_pages;
   171		size_t pagelist_size;
   172		struct scatterlist *scatterlist, *sg;
   173		int dma_buffers;
   174		dma_addr_t dma_addr;
   175	
   176		if (count >= INT_MAX - PAGE_SIZE)
   177			return NULL;
   178	
   179		if (buf)
   180			offset = (uintptr_t)buf & (PAGE_SIZE - 1);
   181		else
   182			offset = (uintptr_t)ubuf & (PAGE_SIZE - 1);
   183		num_pages = DIV_ROUND_UP(count + offset, PAGE_SIZE);
   184	
 > 185		if (num_pages > (SIZE_MAX - sizeof(struct pagelist) -
   186				 sizeof(struct vchiq_pagelist_info)) /
   187				(sizeof(u32) + sizeof(pages[0]) +
   188				 sizeof(struct scatterlist)))
   189			return NULL;
   190	
   191		pagelist_size = sizeof(struct pagelist) +
   192				(num_pages * sizeof(u32)) +
   193				(num_pages * sizeof(pages[0]) +
   194				(num_pages * sizeof(struct scatterlist))) +
   195				sizeof(struct vchiq_pagelist_info);
   196	
   197		/* Allocate enough storage to hold the page pointers and the page
   198		 * list
   199		 */
   200		pagelist = dma_alloc_coherent(g_dev, pagelist_size, &dma_addr,
   201					      GFP_KERNEL);
   202	
   203		vchiq_log_trace(vchiq_arm_log_level, "%s - %pK", __func__, pagelist);
   204	
   205		if (!pagelist)
   206			return NULL;
   207	
   208		addrs		= pagelist->addrs;
   209		pages		= (struct page **)(addrs + num_pages);
   210		scatterlist	= (struct scatterlist *)(pages + num_pages);
   211		pagelistinfo	= (struct vchiq_pagelist_info *)
   212				  (scatterlist + num_pages);
   213	
   214		pagelist->length = count;
   215		pagelist->type = type;
   216		pagelist->offset = offset;
   217	
   218		/* Populate the fields of the pagelistinfo structure */
   219		pagelistinfo->pagelist = pagelist;
   220		pagelistinfo->pagelist_buffer_size = pagelist_size;
   221		pagelistinfo->dma_addr = dma_addr;
   222		pagelistinfo->dma_dir =  (type == PAGELIST_WRITE) ?
   223					  DMA_TO_DEVICE : DMA_FROM_DEVICE;
   224		pagelistinfo->num_pages = num_pages;
   225		pagelistinfo->pages_need_release = 0;
   226		pagelistinfo->pages = pages;
   227		pagelistinfo->scatterlist = scatterlist;
   228		pagelistinfo->scatterlist_mapped = 0;
   229	
   230		if (buf) {
   231			unsigned long length = count;
   232			unsigned int off = offset;
   233	
   234			for (actual_pages = 0; actual_pages < num_pages;
   235			     actual_pages++) {
   236				struct page *pg =
   237					vmalloc_to_page((buf +
   238							 (actual_pages * PAGE_SIZE)));
   239				size_t bytes = PAGE_SIZE - off;
   240	
   241				if (!pg) {
   242					cleanup_pagelistinfo(pagelistinfo);
   243					return NULL;
   244				}
   245	
   246				if (bytes > length)
   247					bytes = length;
   248				pages[actual_pages] = pg;
   249				length -= bytes;
   250				off = 0;
   251			}
   252			/* do not try and release vmalloc pages */
   253		} else {
   254			actual_pages = pin_user_pages_fast(
   255						  (unsigned long)ubuf & PAGE_MASK,
   256						  num_pages,
   257						  type == PAGELIST_READ,
   258						  pages);
   259	
   260			if (actual_pages != num_pages) {
   261				vchiq_log_info(vchiq_arm_log_level,
   262					       "%s - only %d/%d pages locked",
   263					       __func__, actual_pages, num_pages);
   264	
   265				/* This is probably due to the process being killed */
   266				if (actual_pages > 0)
   267					unpin_user_pages(pages, actual_pages);
   268				cleanup_pagelistinfo(pagelistinfo);
   269				return NULL;
   270			}
   271			 /* release user pages */
   272			pagelistinfo->pages_need_release = 1;
   273		}
   274	
   275		/*
   276		 * Initialize the scatterlist so that the magic cookie
   277		 *  is filled if debugging is enabled
   278		 */
   279		sg_init_table(scatterlist, num_pages);
   280		/* Now set the pages for each scatterlist */
   281		for (i = 0; i < num_pages; i++)	{
   282			unsigned int len = PAGE_SIZE - offset;
   283	
   284			if (len > count)
   285				len = count;
   286			sg_set_page(scatterlist + i, pages[i], len, offset);
   287			offset = 0;
   288			count -= len;
   289		}
   290	
   291		dma_buffers = dma_map_sg(g_dev,
   292					 scatterlist,
   293					 num_pages,
   294					 pagelistinfo->dma_dir);
   295	
   296		if (dma_buffers == 0) {
   297			cleanup_pagelistinfo(pagelistinfo);
   298			return NULL;
   299		}
   300	
   301		pagelistinfo->scatterlist_mapped = 1;
   302	
   303		/* Combine adjacent blocks for performance */
   304		k = 0;
   305		for_each_sg(scatterlist, sg, dma_buffers, i) {
   306			u32 len = sg_dma_len(sg);
   307			u32 addr = sg_dma_address(sg);
   308	
   309			/* Note: addrs is the address + page_count - 1
   310			 * The firmware expects blocks after the first to be page-
   311			 * aligned and a multiple of the page size
   312			 */
   313			WARN_ON(len == 0);
   314			WARN_ON(i && (i != (dma_buffers - 1)) && (len & ~PAGE_MASK));
   315			WARN_ON(i && (addr & ~PAGE_MASK));
   316			if (k > 0 &&
   317			    ((addrs[k - 1] & PAGE_MASK) +
   318			     (((addrs[k - 1] & ~PAGE_MASK) + 1) << PAGE_SHIFT))
   319			    == (addr & PAGE_MASK))
   320				addrs[k - 1] += ((len + PAGE_SIZE - 1) >> PAGE_SHIFT);
   321			else
   322				addrs[k++] = (addr & PAGE_MASK) |
   323					(((len + PAGE_SIZE - 1) >> PAGE_SHIFT) - 1);
   324		}
   325	
   326		/* Partial cache lines (fragments) require special measures */
   327		if ((type == PAGELIST_READ) &&
   328			((pagelist->offset & (g_cache_line_size - 1)) ||
   329			((pagelist->offset + pagelist->length) &
   330			(g_cache_line_size - 1)))) {
   331			char *fragments;
   332	
   333			if (down_interruptible(&g_free_fragments_sema)) {
   334				cleanup_pagelistinfo(pagelistinfo);
   335				return NULL;
   336			}
   337	
   338			WARN_ON(!g_free_fragments);
   339	
   340			down(&g_free_fragments_mutex);
   341			fragments = g_free_fragments;
   342			WARN_ON(!fragments);
   343			g_free_fragments = *(char **) g_free_fragments;
   344			up(&g_free_fragments_mutex);
   345			pagelist->type = PAGELIST_READ_WITH_FRAGMENTS +
   346				(fragments - g_fragments_base) / g_fragments_size;
   347		}
   348	
   349		return pagelistinfo;
   350	}
   351	

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org

Download attachment ".config.gz" of type "application/gzip" (36680 bytes)

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ