llvm.lists.linux.dev archive mirror
 help / color / mirror / Atom feed
* [akpm-mm:mm-unstable 288/290] mm/vmalloc.c:3448:8: warning: no previous prototype for function 'zero_iter'
@ 2023-03-23  2:48 kernel test robot
  2023-03-23  9:52 ` Lorenzo Stoakes
  0 siblings, 1 reply; 2+ messages in thread
From: kernel test robot @ 2023-03-23  2:48 UTC (permalink / raw)
  To: Lorenzo Stoakes
  Cc: llvm, oe-kbuild-all, Andrew Morton, Linux Memory Management List

tree:   https://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm.git mm-unstable
head:   39aca4f17e02ee4076b6ab327577c9b1be23775d
commit: d9cab54f77377439e766e1c5916f79ec2ee27a6c [288/290] mm: vmalloc: convert vread() to vread_iter()
config: i386-randconfig-a002 (https://download.01.org/0day-ci/archive/20230323/202303231055.DeninwHS-lkp@intel.com/config)
compiler: clang version 14.0.6 (https://github.com/llvm/llvm-project f28c006a5895fc0e329fe15fead81e37457cb1d1)
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://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm.git/commit/?id=d9cab54f77377439e766e1c5916f79ec2ee27a6c
        git remote add akpm-mm https://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm.git
        git fetch --no-tags akpm-mm mm-unstable
        git checkout d9cab54f77377439e766e1c5916f79ec2ee27a6c
        # save the config file
        mkdir build_dir && cp config build_dir/.config
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=i386 olddefconfig
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=i386 SHELL=/bin/bash

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

All warnings (new ones prefixed by >>):

>> mm/vmalloc.c:3448:8: warning: no previous prototype for function 'zero_iter' [-Wmissing-prototypes]
   size_t zero_iter(struct iov_iter *iter, size_t count)
          ^
   mm/vmalloc.c:3448:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
   size_t zero_iter(struct iov_iter *iter, size_t count)
   ^
   static 
>> mm/vmalloc.c:3543:6: warning: variable 'remains' is used uninitialized whenever 'if' condition is true [-Wsometimes-uninitialized]
           if (bitmap_empty(vb->used_map, VMAP_BBMAP_BITS)) {
               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   mm/vmalloc.c:3587:17: note: uninitialized use occurs here
           return count - remains + zero_iter(iter, remains);
                          ^~~~~~~
   mm/vmalloc.c:3543:2: note: remove the 'if' if its condition is always false
           if (bitmap_empty(vb->used_map, VMAP_BBMAP_BITS)) {
           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   mm/vmalloc.c:3539:6: warning: variable 'remains' is used uninitialized whenever 'if' condition is true [-Wsometimes-uninitialized]
           if (!vb)
               ^~~
   mm/vmalloc.c:3587:17: note: uninitialized use occurs here
           return count - remains + zero_iter(iter, remains);
                          ^~~~~~~
   mm/vmalloc.c:3539:2: note: remove the 'if' if its condition is always false
           if (!vb)
           ^~~~~~~~
   mm/vmalloc.c:3524:16: note: initialize the variable 'remains' to silence this warning
           size_t remains, n;
                         ^
                          = 0
   3 warnings generated.


vim +/zero_iter +3448 mm/vmalloc.c

  3442	
  3443	/*
  3444	 * Atomically zero bytes in the iterator.
  3445	 *
  3446	 * Returns the number of zeroed bytes.
  3447	 */
> 3448	size_t zero_iter(struct iov_iter *iter, size_t count)
  3449	{
  3450		size_t remains = count;
  3451	
  3452		while (remains > 0) {
  3453			size_t num, copied;
  3454	
  3455			num = remains < PAGE_SIZE ? remains : PAGE_SIZE;
  3456			copied = copy_page_to_iter_atomic(ZERO_PAGE(0), 0, num, iter);
  3457			remains -= copied;
  3458	
  3459			if (copied < num)
  3460				break;
  3461		}
  3462	
  3463		return count - remains;
  3464	}
  3465	
  3466	/*
  3467	 * small helper routine, copy contents to iter from addr.
  3468	 * If the page is not present, fill zero.
  3469	 *
  3470	 * Returns the number of copied bytes.
  3471	 */
  3472	static size_t aligned_vread_iter(struct iov_iter *iter,
  3473					 const char *addr, size_t count)
  3474	{
  3475		size_t remains = count;
  3476		struct page *page;
  3477	
  3478		while (remains > 0) {
  3479			unsigned long offset, length;
  3480			size_t copied = 0;
  3481	
  3482			offset = offset_in_page(addr);
  3483			length = PAGE_SIZE - offset;
  3484			if (length > remains)
  3485				length = remains;
  3486			page = vmalloc_to_page(addr);
  3487			/*
  3488			 * To do safe access to this _mapped_ area, we need lock. But
  3489			 * adding lock here means that we need to add overhead of
  3490			 * vmalloc()/vfree() calls for this _debug_ interface, rarely
  3491			 * used. Instead of that, we'll use an local mapping via
  3492			 * copy_page_to_iter_atomic() and accept a small overhead in
  3493			 * this access function.
  3494			 */
  3495			if (page)
  3496				copied = copy_page_to_iter_atomic(page, offset, length,
  3497								  iter);
  3498	
  3499			/* Zero anything we were unable to copy. */
  3500			copied += zero_iter(iter, length - copied);
  3501	
  3502			addr += copied;
  3503			remains -= copied;
  3504	
  3505			if (copied != length)
  3506				break;
  3507		}
  3508	
  3509		return count - remains;
  3510	}
  3511	
  3512	/*
  3513	 * Read from a vm_map_ram region of memory.
  3514	 *
  3515	 * Returns the number of copied bytes.
  3516	 */
  3517	static size_t vmap_ram_vread_iter(struct iov_iter *iter, const char *addr,
  3518					  size_t count, unsigned long flags)
  3519	{
  3520		char *start;
  3521		struct vmap_block *vb;
  3522		unsigned long offset;
  3523		unsigned int rs, re;
  3524		size_t remains, n;
  3525	
  3526		/*
  3527		 * If it's area created by vm_map_ram() interface directly, but
  3528		 * not further subdividing and delegating management to vmap_block,
  3529		 * handle it here.
  3530		 */
  3531		if (!(flags & VMAP_BLOCK))
  3532			return aligned_vread_iter(iter, addr, count);
  3533	
  3534		/*
  3535		 * Area is split into regions and tracked with vmap_block, read out
  3536		 * each region and zero fill the hole between regions.
  3537		 */
  3538		vb = xa_load(&vmap_blocks, addr_to_vb_idx((unsigned long)addr));
  3539		if (!vb)
  3540			goto finished_zero;
  3541	
  3542		spin_lock(&vb->lock);
> 3543		if (bitmap_empty(vb->used_map, VMAP_BBMAP_BITS)) {
  3544			spin_unlock(&vb->lock);
  3545			goto finished_zero;
  3546		}
  3547	
  3548		remains = count;
  3549		for_each_set_bitrange(rs, re, vb->used_map, VMAP_BBMAP_BITS) {
  3550			size_t copied;
  3551	
  3552			if (remains == 0)
  3553				goto finished;
  3554	
  3555			start = vmap_block_vaddr(vb->va->va_start, rs);
  3556	
  3557			if (addr < start) {
  3558				size_t to_zero = min_t(size_t, start - addr, remains);
  3559				size_t zeroed = zero_iter(iter, to_zero);
  3560	
  3561				addr += zeroed;
  3562				remains -= zeroed;
  3563	
  3564				if (remains == 0 || zeroed != to_zero)
  3565					goto finished;
  3566			}
  3567	
  3568			/*it could start reading from the middle of used region*/
  3569			offset = offset_in_page(addr);
  3570			n = ((re - rs + 1) << PAGE_SHIFT) - offset;
  3571			if (n > remains)
  3572				n = remains;
  3573	
  3574			copied = aligned_vread_iter(iter, start + offset, n);
  3575	
  3576			addr += copied;
  3577			remains -= copied;
  3578	
  3579			if (copied != n)
  3580				goto finished;
  3581		}
  3582	
  3583		spin_unlock(&vb->lock);
  3584	
  3585	finished_zero:
  3586		/* zero-fill the left dirty or free regions */
  3587		return count - remains + zero_iter(iter, remains);
  3588	finished:
  3589		/* We couldn't copy/zero everything */
  3590		spin_unlock(&vb->lock);
  3591		return count - remains;
  3592	}
  3593	

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [akpm-mm:mm-unstable 288/290] mm/vmalloc.c:3448:8: warning: no previous prototype for function 'zero_iter'
  2023-03-23  2:48 [akpm-mm:mm-unstable 288/290] mm/vmalloc.c:3448:8: warning: no previous prototype for function 'zero_iter' kernel test robot
@ 2023-03-23  9:52 ` Lorenzo Stoakes
  0 siblings, 0 replies; 2+ messages in thread
From: Lorenzo Stoakes @ 2023-03-23  9:52 UTC (permalink / raw)
  To: kernel test robot
  Cc: llvm, oe-kbuild-all, Andrew Morton, Linux Memory Management List

On Thu, Mar 23, 2023 at 10:48:09AM +0800, kernel test robot wrote:
> tree:   https://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm.git mm-unstable
> head:   39aca4f17e02ee4076b6ab327577c9b1be23775d
> commit: d9cab54f77377439e766e1c5916f79ec2ee27a6c [288/290] mm: vmalloc: convert vread() to vread_iter()
> config: i386-randconfig-a002 (https://download.01.org/0day-ci/archive/20230323/202303231055.DeninwHS-lkp@intel.com/config)
> compiler: clang version 14.0.6 (https://github.com/llvm/llvm-project f28c006a5895fc0e329fe15fead81e37457cb1d1)
> 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://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm.git/commit/?id=d9cab54f77377439e766e1c5916f79ec2ee27a6c
>         git remote add akpm-mm https://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm.git
>         git fetch --no-tags akpm-mm mm-unstable
>         git checkout d9cab54f77377439e766e1c5916f79ec2ee27a6c
>         # save the config file
>         mkdir build_dir && cp config build_dir/.config
>         COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=i386 olddefconfig
>         COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=i386 SHELL=/bin/bash
>
> If you fix the issue, kindly add following tag where applicable
> | Reported-by: kernel test robot <lkp@intel.com>
> | Link: https://lore.kernel.org/oe-kbuild-all/202303231055.DeninwHS-lkp@intel.com/
>
> All warnings (new ones prefixed by >>):
>
> >> mm/vmalloc.c:3448:8: warning: no previous prototype for function 'zero_iter' [-Wmissing-prototypes]
>    size_t zero_iter(struct iov_iter *iter, size_t count)
>           ^
>    mm/vmalloc.c:3448:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
>    size_t zero_iter(struct iov_iter *iter, size_t count)
>    ^
>    static

Ack, will fix + respin.

> >> mm/vmalloc.c:3543:6: warning: variable 'remains' is used uninitialized whenever 'if' condition is true [-Wsometimes-uninitialized]
>            if (bitmap_empty(vb->used_map, VMAP_BBMAP_BITS)) {
>                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>    mm/vmalloc.c:3587:17: note: uninitialized use occurs here
>            return count - remains + zero_iter(iter, remains);
>                           ^~~~~~~
>    mm/vmalloc.c:3543:2: note: remove the 'if' if its condition is always false
>            if (bitmap_empty(vb->used_map, VMAP_BBMAP_BITS)) {
>            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>    mm/vmalloc.c:3539:6: warning: variable 'remains' is used uninitialized whenever 'if' condition is true [-Wsometimes-uninitialized]
>            if (!vb)
>                ^~~
>    mm/vmalloc.c:3587:17: note: uninitialized use occurs here
>            return count - remains + zero_iter(iter, remains);
>                           ^~~~~~~
>    mm/vmalloc.c:3539:2: note: remove the 'if' if its condition is always false
>            if (!vb)
>            ^~~~~~~~
>    mm/vmalloc.c:3524:16: note: initialize the variable 'remains' to silence this warning
>            size_t remains, n;
>                          ^
>                           = 0
>    3 warnings generated.
>

Remaining warnings have all already been fixed in latest version of this patch series.

>
> vim +/zero_iter +3448 mm/vmalloc.c
>
>   3442
>   3443	/*
>   3444	 * Atomically zero bytes in the iterator.
>   3445	 *
>   3446	 * Returns the number of zeroed bytes.
>   3447	 */
> > 3448	size_t zero_iter(struct iov_iter *iter, size_t count)
>   3449	{
>   3450		size_t remains = count;
>   3451
>   3452		while (remains > 0) {
>   3453			size_t num, copied;
>   3454
>   3455			num = remains < PAGE_SIZE ? remains : PAGE_SIZE;
>   3456			copied = copy_page_to_iter_atomic(ZERO_PAGE(0), 0, num, iter);
>   3457			remains -= copied;
>   3458
>   3459			if (copied < num)
>   3460				break;
>   3461		}
>   3462
>   3463		return count - remains;
>   3464	}
>   3465
>   3466	/*
>   3467	 * small helper routine, copy contents to iter from addr.
>   3468	 * If the page is not present, fill zero.
>   3469	 *
>   3470	 * Returns the number of copied bytes.
>   3471	 */
>   3472	static size_t aligned_vread_iter(struct iov_iter *iter,
>   3473					 const char *addr, size_t count)
>   3474	{
>   3475		size_t remains = count;
>   3476		struct page *page;
>   3477
>   3478		while (remains > 0) {
>   3479			unsigned long offset, length;
>   3480			size_t copied = 0;
>   3481
>   3482			offset = offset_in_page(addr);
>   3483			length = PAGE_SIZE - offset;
>   3484			if (length > remains)
>   3485				length = remains;
>   3486			page = vmalloc_to_page(addr);
>   3487			/*
>   3488			 * To do safe access to this _mapped_ area, we need lock. But
>   3489			 * adding lock here means that we need to add overhead of
>   3490			 * vmalloc()/vfree() calls for this _debug_ interface, rarely
>   3491			 * used. Instead of that, we'll use an local mapping via
>   3492			 * copy_page_to_iter_atomic() and accept a small overhead in
>   3493			 * this access function.
>   3494			 */
>   3495			if (page)
>   3496				copied = copy_page_to_iter_atomic(page, offset, length,
>   3497								  iter);
>   3498
>   3499			/* Zero anything we were unable to copy. */
>   3500			copied += zero_iter(iter, length - copied);
>   3501
>   3502			addr += copied;
>   3503			remains -= copied;
>   3504
>   3505			if (copied != length)
>   3506				break;
>   3507		}
>   3508
>   3509		return count - remains;
>   3510	}
>   3511
>   3512	/*
>   3513	 * Read from a vm_map_ram region of memory.
>   3514	 *
>   3515	 * Returns the number of copied bytes.
>   3516	 */
>   3517	static size_t vmap_ram_vread_iter(struct iov_iter *iter, const char *addr,
>   3518					  size_t count, unsigned long flags)
>   3519	{
>   3520		char *start;
>   3521		struct vmap_block *vb;
>   3522		unsigned long offset;
>   3523		unsigned int rs, re;
>   3524		size_t remains, n;
>   3525
>   3526		/*
>   3527		 * If it's area created by vm_map_ram() interface directly, but
>   3528		 * not further subdividing and delegating management to vmap_block,
>   3529		 * handle it here.
>   3530		 */
>   3531		if (!(flags & VMAP_BLOCK))
>   3532			return aligned_vread_iter(iter, addr, count);
>   3533
>   3534		/*
>   3535		 * Area is split into regions and tracked with vmap_block, read out
>   3536		 * each region and zero fill the hole between regions.
>   3537		 */
>   3538		vb = xa_load(&vmap_blocks, addr_to_vb_idx((unsigned long)addr));
>   3539		if (!vb)
>   3540			goto finished_zero;
>   3541
>   3542		spin_lock(&vb->lock);
> > 3543		if (bitmap_empty(vb->used_map, VMAP_BBMAP_BITS)) {
>   3544			spin_unlock(&vb->lock);
>   3545			goto finished_zero;
>   3546		}
>   3547
>   3548		remains = count;
>   3549		for_each_set_bitrange(rs, re, vb->used_map, VMAP_BBMAP_BITS) {
>   3550			size_t copied;
>   3551
>   3552			if (remains == 0)
>   3553				goto finished;
>   3554
>   3555			start = vmap_block_vaddr(vb->va->va_start, rs);
>   3556
>   3557			if (addr < start) {
>   3558				size_t to_zero = min_t(size_t, start - addr, remains);
>   3559				size_t zeroed = zero_iter(iter, to_zero);
>   3560
>   3561				addr += zeroed;
>   3562				remains -= zeroed;
>   3563
>   3564				if (remains == 0 || zeroed != to_zero)
>   3565					goto finished;
>   3566			}
>   3567
>   3568			/*it could start reading from the middle of used region*/
>   3569			offset = offset_in_page(addr);
>   3570			n = ((re - rs + 1) << PAGE_SHIFT) - offset;
>   3571			if (n > remains)
>   3572				n = remains;
>   3573
>   3574			copied = aligned_vread_iter(iter, start + offset, n);
>   3575
>   3576			addr += copied;
>   3577			remains -= copied;
>   3578
>   3579			if (copied != n)
>   3580				goto finished;
>   3581		}
>   3582
>   3583		spin_unlock(&vb->lock);
>   3584
>   3585	finished_zero:
>   3586		/* zero-fill the left dirty or free regions */
>   3587		return count - remains + zero_iter(iter, remains);
>   3588	finished:
>   3589		/* We couldn't copy/zero everything */
>   3590		spin_unlock(&vb->lock);
>   3591		return count - remains;
>   3592	}
>   3593
>
> --
> 0-DAY CI Kernel Test Service
> https://github.com/intel/lkp-tests

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2023-03-23  9:52 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-03-23  2:48 [akpm-mm:mm-unstable 288/290] mm/vmalloc.c:3448:8: warning: no previous prototype for function 'zero_iter' kernel test robot
2023-03-23  9:52 ` Lorenzo Stoakes

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).