All of lore.kernel.org
 help / color / mirror / Atom feed
* [dhowells-fs:netfs-next-3 21/26] fs/netfs/iterator.c:138:26-35: WARNING: Unsigned expression compared with zero: max_pages > 0
@ 2026-09-27 11:31 kernel test robot
  0 siblings, 0 replies; only message in thread
From: kernel test robot @ 2026-09-27 11:31 UTC (permalink / raw)
  To: oe-kbuild; +Cc: lkp, Julia Lawall

BCC: lkp@intel.com
CC: oe-kbuild-all@lists.linux.dev
TO: David Howells <dhowells@redhat.com>
CC: Paulo Alcantara <pc@manguebit.org>

tree:   https://git.kernel.org/pub/scm/linux/kernel/git/dhowells/linux-fs.git netfs-next-3
head:   65d1ffcb408ea16b3a4a497269da871c62b7faa3
commit: eba2ce39522a73cddc7bbf0f5a6e7ecd2cf8a05c [21/26] netfs: Add a function to extract from an iter into a bvecq
:::::: branch date: 2 days ago
:::::: commit date: 2 days ago
config: sparc-randconfig-r2105-20260927 (https://download.01.org/0day-ci/archive/20260927/202609271323.ddF8olh0-lkp@intel.com/config)
compiler: sparc-linux-gcc (GCC) 14.3.0

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Reported-by: Julia Lawall <julia.lawall@inria.fr>
| Closes: https://lore.kernel.org/r/202609271323.ddF8olh0-lkp@intel.com/

cocci warnings: (new ones prefixed by >>)
>> fs/netfs/iterator.c:138:26-35: WARNING: Unsigned expression compared with zero: max_pages > 0

vim +138 fs/netfs/iterator.c

85dd2c8ff368b1 David Howells 2022-10-20   15  
eba2ce39522a73 David Howells 2026-01-07   16  /**
eba2ce39522a73 David Howells 2026-01-07   17   * netfs_extract_iter - Extract virtually contiguous pages from an iterator into a bvecq
eba2ce39522a73 David Howells 2026-01-07   18   * @orig: The original iterator
eba2ce39522a73 David Howells 2026-01-07   19   * @max_len: Maximum number of bytes to extract
eba2ce39522a73 David Howells 2026-01-07   20   * @max_pages: Maximum number of pages to extract
eba2ce39522a73 David Howells 2026-01-07   21   * @_bvecq_head: Where to cache the bvec queue
eba2ce39522a73 David Howells 2026-01-07   22   * @extraction_flags: Flags to qualify the request
eba2ce39522a73 David Howells 2026-01-07   23   * @gfp: Allocation mode for bvecq structs.
eba2ce39522a73 David Howells 2026-01-07   24   *
eba2ce39522a73 David Howells 2026-01-07   25   * Extract virtually contiguous page fragments from the source iterator up to
eba2ce39522a73 David Howells 2026-01-07   26   * the given maxima and build bvec queue that refers to all of those bits.
eba2ce39522a73 David Howells 2026-01-07   27   * This allows the original iterator to disposed of.
eba2ce39522a73 David Howells 2026-01-07   28   *
eba2ce39522a73 David Howells 2026-01-07   29   * @extraction_flags can have ITER_ALLOW_P2PDMA set to request peer-to-peer DMA
eba2ce39522a73 David Howells 2026-01-07   30   * be allowed on the pages extracted.
eba2ce39522a73 David Howells 2026-01-07   31   *
eba2ce39522a73 David Howells 2026-01-07   32   * On success or partial success, the amount of data in the bvec is returned,
eba2ce39522a73 David Howells 2026-01-07   33   * the original iterator will have been advanced by the amount extracted.
eba2ce39522a73 David Howells 2026-01-07   34   *
eba2ce39522a73 David Howells 2026-01-07   35   * If an error occurs and no pages are extracted, an error will be returned and
eba2ce39522a73 David Howells 2026-01-07   36   * any allocated bvecq will be freed.  If there is no data to be extracted (or
eba2ce39522a73 David Howells 2026-01-07   37   * @max_len or @max_pages are zero), a single empty bvecq will be returned.
eba2ce39522a73 David Howells 2026-01-07   38   *
eba2ce39522a73 David Howells 2026-01-07   39   * The bvecq segments are marked with indications on how to get clean up the
eba2ce39522a73 David Howells 2026-01-07   40   * extracted fragments.
eba2ce39522a73 David Howells 2026-01-07   41   */
eba2ce39522a73 David Howells 2026-01-07   42  ssize_t netfs_extract_iter(struct iov_iter *orig, size_t max_len, size_t max_pages,
eba2ce39522a73 David Howells 2026-01-07   43  			   struct bvecq **_bvecq_head,
eba2ce39522a73 David Howells 2026-01-07   44  			   iov_iter_extraction_t extraction_flags, gfp_t gfp)
eba2ce39522a73 David Howells 2026-01-07   45  {
eba2ce39522a73 David Howells 2026-01-07   46  	struct bvecq *bq_tail = NULL, *bq;
eba2ce39522a73 David Howells 2026-01-07   47  	ssize_t ret = 0;
eba2ce39522a73 David Howells 2026-01-07   48  	size_t extracted = 0;
eba2ce39522a73 David Howells 2026-01-07   49  
eba2ce39522a73 David Howells 2026-01-07   50  	_enter("{%u,%zx},%zx", orig->iter_type, orig->count, max_len);
eba2ce39522a73 David Howells 2026-01-07   51  
eba2ce39522a73 David Howells 2026-01-07   52  	*_bvecq_head = NULL;
eba2ce39522a73 David Howells 2026-01-07   53  	if (max_len > orig->count)
eba2ce39522a73 David Howells 2026-01-07   54  		max_len = orig->count;
eba2ce39522a73 David Howells 2026-01-07   55  	if (!max_len || !max_pages)
eba2ce39522a73 David Howells 2026-01-07   56  		goto alloc_empty;
eba2ce39522a73 David Howells 2026-01-07   57  	if (WARN_ON_ONCE(max_pages > INT_MAX))
eba2ce39522a73 David Howells 2026-01-07   58  		max_pages = INT_MAX; /* Protect iov_iter_npages(). */
eba2ce39522a73 David Howells 2026-01-07   59  
eba2ce39522a73 David Howells 2026-01-07   60  	max_pages = iov_iter_npages(orig, max_pages);
eba2ce39522a73 David Howells 2026-01-07   61  	if (!max_pages)
eba2ce39522a73 David Howells 2026-01-07   62  		goto alloc_empty;
eba2ce39522a73 David Howells 2026-01-07   63  
eba2ce39522a73 David Howells 2026-01-07   64  	do {
eba2ce39522a73 David Howells 2026-01-07   65  		bq = bvecq_alloc_one(max_pages, gfp, false);
eba2ce39522a73 David Howells 2026-01-07   66  		if (!bq) {
eba2ce39522a73 David Howells 2026-01-07   67  			ret = -ENOMEM;
eba2ce39522a73 David Howells 2026-01-07   68  			break;
eba2ce39522a73 David Howells 2026-01-07   69  		}
eba2ce39522a73 David Howells 2026-01-07   70  		if (user_backed_iter(orig))
eba2ce39522a73 David Howells 2026-01-07   71  			bq->mem_type = iov_iter_extract_will_pin(orig) ?
eba2ce39522a73 David Howells 2026-01-07   72  				BVECQ_MEM_GUP : BVECQ_MEM_PAGECACHE;
eba2ce39522a73 David Howells 2026-01-07   73  
eba2ce39522a73 David Howells 2026-01-07   74  		if (bq_tail)
eba2ce39522a73 David Howells 2026-01-07   75  			bvecq_append(bq_tail, bq);
eba2ce39522a73 David Howells 2026-01-07   76  		else
eba2ce39522a73 David Howells 2026-01-07   77  			*_bvecq_head = bq;
eba2ce39522a73 David Howells 2026-01-07   78  		bq_tail = bq;
eba2ce39522a73 David Howells 2026-01-07   79  
eba2ce39522a73 David Howells 2026-01-07   80  		if (max_len == 0)
eba2ce39522a73 David Howells 2026-01-07   81  			break;
eba2ce39522a73 David Howells 2026-01-07   82  
eba2ce39522a73 David Howells 2026-01-07   83  		struct bio_vec *bv = bq->bv;
eba2ce39522a73 David Howells 2026-01-07   84  		unsigned int slot = 0;
eba2ce39522a73 David Howells 2026-01-07   85  		do {
eba2ce39522a73 David Howells 2026-01-07   86  			struct page **pages;
eba2ce39522a73 David Howells 2026-01-07   87  			ssize_t got;
eba2ce39522a73 David Howells 2026-01-07   88  			size_t offset;
eba2ce39522a73 David Howells 2026-01-07   89  			size_t space = bq->max_slots - slot;
eba2ce39522a73 David Howells 2026-01-07   90  			size_t bv_size = array_size(bq->max_slots, sizeof(*bv));
eba2ce39522a73 David Howells 2026-01-07   91  			size_t pg_size = array_size(space, sizeof(*pages));
eba2ce39522a73 David Howells 2026-01-07   92  
eba2ce39522a73 David Howells 2026-01-07   93  			/* Put the page list at the end of the bvec list
eba2ce39522a73 David Howells 2026-01-07   94  			 * storage.  bvec elements are larger than page
eba2ce39522a73 David Howells 2026-01-07   95  			 * pointers, so as long as we work 0->last, we should
eba2ce39522a73 David Howells 2026-01-07   96  			 * be fine.
eba2ce39522a73 David Howells 2026-01-07   97  			 */
eba2ce39522a73 David Howells 2026-01-07   98  			pages = (void *)bv + bv_size - pg_size;
eba2ce39522a73 David Howells 2026-01-07   99  
eba2ce39522a73 David Howells 2026-01-07  100  			got = iov_iter_extract_pages(orig, &pages, max_len,
eba2ce39522a73 David Howells 2026-01-07  101  						     min(space, max_pages),
eba2ce39522a73 David Howells 2026-01-07  102  						     extraction_flags, &offset);
eba2ce39522a73 David Howells 2026-01-07  103  			if (got < 0) {
eba2ce39522a73 David Howells 2026-01-07  104  				ret = got;
eba2ce39522a73 David Howells 2026-01-07  105  				goto out;
eba2ce39522a73 David Howells 2026-01-07  106  			}
eba2ce39522a73 David Howells 2026-01-07  107  
eba2ce39522a73 David Howells 2026-01-07  108  			if (got == 0) {
eba2ce39522a73 David Howells 2026-01-07  109  				pr_err("extract_pages gave nothing from %zx, %zx\n",
eba2ce39522a73 David Howells 2026-01-07  110  				       extracted, max_len);
eba2ce39522a73 David Howells 2026-01-07  111  				ret = -EIO;
eba2ce39522a73 David Howells 2026-01-07  112  				goto out;
eba2ce39522a73 David Howells 2026-01-07  113  			}
eba2ce39522a73 David Howells 2026-01-07  114  
eba2ce39522a73 David Howells 2026-01-07  115  			if (WARN(got > max_len,
eba2ce39522a73 David Howells 2026-01-07  116  				 "%s: extract_pages overrun %zx > %zx bytes\n",
eba2ce39522a73 David Howells 2026-01-07  117  				 __func__, got, max_len)) {
eba2ce39522a73 David Howells 2026-01-07  118  				ret = -EIO;
eba2ce39522a73 David Howells 2026-01-07  119  				goto out;
eba2ce39522a73 David Howells 2026-01-07  120  			}
eba2ce39522a73 David Howells 2026-01-07  121  
eba2ce39522a73 David Howells 2026-01-07  122  			extracted += got;
eba2ce39522a73 David Howells 2026-01-07  123  			max_len -= got;
eba2ce39522a73 David Howells 2026-01-07  124  
eba2ce39522a73 David Howells 2026-01-07  125  			do {
eba2ce39522a73 David Howells 2026-01-07  126  				size_t len = umin(got, PAGE_SIZE - offset);
eba2ce39522a73 David Howells 2026-01-07  127  
eba2ce39522a73 David Howells 2026-01-07  128  				BUG_ON(slot >= bq->max_slots);
eba2ce39522a73 David Howells 2026-01-07  129  
eba2ce39522a73 David Howells 2026-01-07  130  				bvec_set_page(&bq->bv[slot], *pages++, len, offset);
eba2ce39522a73 David Howells 2026-01-07  131  				slot++;
eba2ce39522a73 David Howells 2026-01-07  132  				max_pages--;
eba2ce39522a73 David Howells 2026-01-07  133  				got -= len;
eba2ce39522a73 David Howells 2026-01-07  134  				offset = 0;
eba2ce39522a73 David Howells 2026-01-07  135  			} while (got > 0);
eba2ce39522a73 David Howells 2026-01-07  136  
eba2ce39522a73 David Howells 2026-01-07  137  			bvecq_filled_to(bq, slot);
eba2ce39522a73 David Howells 2026-01-07 @138  		} while (max_len > 0 && max_pages > 0 && !bvecq_is_full(bq));
eba2ce39522a73 David Howells 2026-01-07  139  
eba2ce39522a73 David Howells 2026-01-07  140  	} while (max_len > 0 && max_pages > 0);
eba2ce39522a73 David Howells 2026-01-07  141  
eba2ce39522a73 David Howells 2026-01-07  142  out:
eba2ce39522a73 David Howells 2026-01-07  143  	if (extracted || ret == 0)
eba2ce39522a73 David Howells 2026-01-07  144  		return extracted;
eba2ce39522a73 David Howells 2026-01-07  145  	bvecq_put(*_bvecq_head);
eba2ce39522a73 David Howells 2026-01-07  146  	*_bvecq_head = NULL;
eba2ce39522a73 David Howells 2026-01-07  147  	return ret;
eba2ce39522a73 David Howells 2026-01-07  148  
eba2ce39522a73 David Howells 2026-01-07  149  alloc_empty:
eba2ce39522a73 David Howells 2026-01-07  150  	bq = bvecq_alloc_one(1, gfp, false);
eba2ce39522a73 David Howells 2026-01-07  151  	if (!bq)
eba2ce39522a73 David Howells 2026-01-07  152  		return -ENOMEM;
eba2ce39522a73 David Howells 2026-01-07  153  	*_bvecq_head = bq;
eba2ce39522a73 David Howells 2026-01-07  154  	return 0;
eba2ce39522a73 David Howells 2026-01-07  155  

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

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

only message in thread, other threads:[~2026-09-27 11:31 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-09-27 11:31 [dhowells-fs:netfs-next-3 21/26] fs/netfs/iterator.c:138:26-35: WARNING: Unsigned expression compared with zero: max_pages > 0 kernel test robot

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.