linux-xfs.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [xfs-linux:xfs-5.4-fixes 4/7] fs/xfs/xfs_buf.c:354:29: sparse: sparse: invalid assignment: |=
@ 2019-10-08 22:10 kbuild test robot
  0 siblings, 0 replies; only message in thread
From: kbuild test robot @ 2019-10-08 22:10 UTC (permalink / raw)
  To: Bill O'Donnell; +Cc: kbuild-all, linux-xfs, Darrick J. Wong

tree:   https://git.kernel.org/pub/scm/fs/xfs/xfs-linux.git xfs-5.4-fixes
head:   6350744c66a41ac4d044bd083852a5cc20bd5b93
commit: b4d5a0a3dc269e8127f89060cb690a19221fd433 [4/7] xfs: assure zeroed memory buffers for certain kmem allocations
reproduce:
        # apt-get install sparse
        # sparse version: v0.6.1-rc1-42-g38eda53-dirty
        git checkout b4d5a0a3dc269e8127f89060cb690a19221fd433
        make ARCH=x86_64 allmodconfig
        make C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__'

If you fix the issue, kindly add following tag
Reported-by: kbuild test robot <lkp@intel.com>


sparse warnings: (new ones prefixed by >>)

>> fs/xfs/xfs_buf.c:354:29: sparse: sparse: invalid assignment: |=
>> fs/xfs/xfs_buf.c:354:29: sparse:    left side has type unsigned int
>> fs/xfs/xfs_buf.c:354:29: sparse:    right side has type restricted xfs_km_flags_t
>> fs/xfs/xfs_buf.c:367:44: sparse: sparse: restricted xfs_km_flags_t degrades to integer
>> fs/xfs/xfs_buf.c:367:52: sparse: sparse: incorrect type in argument 3 (different base types) @@    expected restricted xfs_km_flags_t [usertype] flags @@    got  [usertype] flags @@
>> fs/xfs/xfs_buf.c:367:52: sparse:    expected restricted xfs_km_flags_t [usertype] flags
>> fs/xfs/xfs_buf.c:367:52: sparse:    got unsigned int

vim +354 fs/xfs/xfs_buf.c

   333	
   334	/*
   335	 * Allocates all the pages for buffer in question and builds it's page list.
   336	 */
   337	STATIC int
   338	xfs_buf_allocate_memory(
   339		xfs_buf_t		*bp,
   340		uint			flags)
   341	{
   342		size_t			size;
   343		size_t			nbytes, offset;
   344		gfp_t			gfp_mask = xb_to_gfp(flags);
   345		unsigned short		page_count, i;
   346		xfs_off_t		start, end;
   347		int			error;
   348		uint			kmflag_mask = 0;
   349	
   350		/*
   351		 * assure zeroed buffer for non-read cases.
   352		 */
   353		if (!(flags & XBF_READ)) {
 > 354			kmflag_mask |= KM_ZERO;
   355			gfp_mask |= __GFP_ZERO;
   356		}
   357	
   358		/*
   359		 * for buffers that are contained within a single page, just allocate
   360		 * the memory from the heap - there's no need for the complexity of
   361		 * page arrays to keep allocation down to order 0.
   362		 */
   363		size = BBTOB(bp->b_length);
   364		if (size < PAGE_SIZE) {
   365			int align_mask = xfs_buftarg_dma_alignment(bp->b_target);
   366			bp->b_addr = kmem_alloc_io(size, align_mask,
 > 367						   KM_NOFS | kmflag_mask);
   368			if (!bp->b_addr) {
   369				/* low memory - use alloc_page loop instead */
   370				goto use_alloc_page;
   371			}
   372	
   373			if (((unsigned long)(bp->b_addr + size - 1) & PAGE_MASK) !=
   374			    ((unsigned long)bp->b_addr & PAGE_MASK)) {
   375				/* b_addr spans two pages - use alloc_page instead */
   376				kmem_free(bp->b_addr);
   377				bp->b_addr = NULL;
   378				goto use_alloc_page;
   379			}
   380			bp->b_offset = offset_in_page(bp->b_addr);
   381			bp->b_pages = bp->b_page_array;
   382			bp->b_pages[0] = kmem_to_page(bp->b_addr);
   383			bp->b_page_count = 1;
   384			bp->b_flags |= _XBF_KMEM;
   385			return 0;
   386		}
   387	
   388	use_alloc_page:
   389		start = BBTOB(bp->b_maps[0].bm_bn) >> PAGE_SHIFT;
   390		end = (BBTOB(bp->b_maps[0].bm_bn + bp->b_length) + PAGE_SIZE - 1)
   391									>> PAGE_SHIFT;
   392		page_count = end - start;
   393		error = _xfs_buf_get_pages(bp, page_count);
   394		if (unlikely(error))
   395			return error;
   396	
   397		offset = bp->b_offset;
   398		bp->b_flags |= _XBF_PAGES;
   399	
   400		for (i = 0; i < bp->b_page_count; i++) {
   401			struct page	*page;
   402			uint		retries = 0;
   403	retry:
   404			page = alloc_page(gfp_mask);
   405			if (unlikely(page == NULL)) {
   406				if (flags & XBF_READ_AHEAD) {
   407					bp->b_page_count = i;
   408					error = -ENOMEM;
   409					goto out_free_pages;
   410				}
   411	
   412				/*
   413				 * This could deadlock.
   414				 *
   415				 * But until all the XFS lowlevel code is revamped to
   416				 * handle buffer allocation failures we can't do much.
   417				 */
   418				if (!(++retries % 100))
   419					xfs_err(NULL,
   420			"%s(%u) possible memory allocation deadlock in %s (mode:0x%x)",
   421						current->comm, current->pid,
   422						__func__, gfp_mask);
   423	
   424				XFS_STATS_INC(bp->b_mount, xb_page_retries);
   425				congestion_wait(BLK_RW_ASYNC, HZ/50);
   426				goto retry;
   427			}
   428	
   429			XFS_STATS_INC(bp->b_mount, xb_page_found);
   430	
   431			nbytes = min_t(size_t, size, PAGE_SIZE - offset);
   432			size -= nbytes;
   433			bp->b_pages[i] = page;
   434			offset = 0;
   435		}
   436		return 0;
   437	
   438	out_free_pages:
   439		for (i = 0; i < bp->b_page_count; i++)
   440			__free_page(bp->b_pages[i]);
   441		bp->b_flags &= ~_XBF_PAGES;
   442		return error;
   443	}
   444	

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2019-10-08 22:11 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-10-08 22:10 [xfs-linux:xfs-5.4-fixes 4/7] fs/xfs/xfs_buf.c:354:29: sparse: sparse: invalid assignment: |= kbuild test robot

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).