From: kernel test robot <lkp@intel.com>
To: ed.tsai@mediatek.com, ming.lei@redhat.com, hch@lst.de,
Jens Axboe <axboe@kernel.dk>,
Matthias Brugger <matthias.bgg@gmail.com>,
AngeloGioacchino Del Regno
<angelogioacchino.delregno@collabora.com>
Cc: oe-kbuild-all@lists.linux.dev, wsd_upstream@mediatek.com,
chun-hung.wu@mediatek.com, casper.li@mediatek.com,
will.shiu@mediatek.com, light.hsieh@mediatek.com,
Ed Tsai <ed.tsai@mediatek.com>,
linux-block@vger.kernel.org, linux-kernel@vger.kernel.org,
linux-arm-kernel@lists.infradead.org,
linux-mediatek@lists.infradead.org
Subject: Re: [PATCH v2] block: limit the extract size to align queue limit
Date: Fri, 10 Nov 2023 18:59:19 +0800 [thread overview]
Message-ID: <202311101853.9N398fyj-lkp@intel.com> (raw)
In-Reply-To: <20231110051950.21972-1-ed.tsai@mediatek.com>
Hi,
kernel test robot noticed the following build warnings:
[auto build test WARNING on axboe-block/for-next]
[also build test WARNING on hch-configfs/for-next linus/master v6.6 next-20231110]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/ed-tsai-mediatek-com/block-limit-the-extract-size-to-align-queue-limit/20231110-142205
base: https://git.kernel.org/pub/scm/linux/kernel/git/axboe/linux-block.git for-next
patch link: https://lore.kernel.org/r/20231110051950.21972-1-ed.tsai%40mediatek.com
patch subject: [PATCH v2] block: limit the extract size to align queue limit
config: arc-randconfig-002-20231110 (https://download.01.org/0day-ci/archive/20231110/202311101853.9N398fyj-lkp@intel.com/config)
compiler: arc-elf-gcc (GCC) 13.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20231110/202311101853.9N398fyj-lkp@intel.com/reproduce)
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>
| Closes: https://lore.kernel.org/oe-kbuild-all/202311101853.9N398fyj-lkp@intel.com/
All warnings (new ones prefixed by >>):
block/bio.c: In function '__bio_iov_iter_get_pages':
>> block/bio.c:1261:29: warning: suggest parentheses around '-' in operand of '&' [-Wparentheses]
1261 | max - bio->bi_iter.bi_size & (max - 1) : max;
| ~~~~^~~~~~~~~~~~~~~~~~~~~~
vim +1261 block/bio.c
1214
1215 /**
1216 * __bio_iov_iter_get_pages - pin user or kernel pages and add them to a bio
1217 * @bio: bio to add pages to
1218 * @iter: iov iterator describing the region to be mapped
1219 *
1220 * Extracts pages from *iter and appends them to @bio's bvec array. The pages
1221 * will have to be cleaned up in the way indicated by the BIO_PAGE_PINNED flag.
1222 * For a multi-segment *iter, this function only adds pages from the next
1223 * non-empty segment of the iov iterator.
1224 */
1225 static int __bio_iov_iter_get_pages(struct bio *bio, struct iov_iter *iter)
1226 {
1227 iov_iter_extraction_t extraction_flags = 0;
1228 unsigned short nr_pages = bio->bi_max_vecs - bio->bi_vcnt;
1229 unsigned short entries_left = bio->bi_max_vecs - bio->bi_vcnt;
1230 struct block_device *bdev = bio->bi_bdev;
1231 struct bio_vec *bv = bio->bi_io_vec + bio->bi_vcnt;
1232 struct page **pages = (struct page **)bv;
1233 ssize_t max_extract = UINT_MAX - bio->bi_iter.bi_size;
1234 ssize_t size, left;
1235 unsigned len, i = 0;
1236 size_t offset;
1237 int ret = 0;
1238
1239 /*
1240 * Move page array up in the allocated memory for the bio vecs as far as
1241 * possible so that we can start filling biovecs from the beginning
1242 * without overwriting the temporary page array.
1243 */
1244 BUILD_BUG_ON(PAGE_PTRS_PER_BVEC < 2);
1245 pages += entries_left * (PAGE_PTRS_PER_BVEC - 1);
1246
1247 if (bdev && blk_queue_pci_p2pdma(bdev->bd_disk->queue))
1248 extraction_flags |= ITER_ALLOW_P2PDMA;
1249
1250 /*
1251 * Each segment in the iov is required to be a block size multiple.
1252 * However, we may not be able to get the entire segment if it spans
1253 * more pages than bi_max_vecs allows, so we have to ALIGN_DOWN the
1254 * result to ensure the bio's total size is correct. The remainder of
1255 * the iov data will be picked up in the next bio iteration.
1256 */
1257 if (bdev && bio_op(bio) != REQ_OP_ZONE_APPEND) {
1258 unsigned int max = queue_max_bytes(bdev_get_queue(bdev));
1259
1260 max_extract = bio->bi_iter.bi_size ?
> 1261 max - bio->bi_iter.bi_size & (max - 1) : max;
1262 }
1263 size = iov_iter_extract_pages(iter, &pages, max_extract,
1264 nr_pages, extraction_flags, &offset);
1265 if (unlikely(size <= 0))
1266 return size ? size : -EFAULT;
1267
1268 nr_pages = DIV_ROUND_UP(offset + size, PAGE_SIZE);
1269
1270 if (bdev) {
1271 size_t trim = size & (bdev_logical_block_size(bdev) - 1);
1272 iov_iter_revert(iter, trim);
1273 size -= trim;
1274 }
1275
1276 if (unlikely(!size)) {
1277 ret = -EFAULT;
1278 goto out;
1279 }
1280
1281 for (left = size, i = 0; left > 0; left -= len, i++) {
1282 struct page *page = pages[i];
1283
1284 len = min_t(size_t, PAGE_SIZE - offset, left);
1285 if (bio_op(bio) == REQ_OP_ZONE_APPEND) {
1286 ret = bio_iov_add_zone_append_page(bio, page, len,
1287 offset);
1288 if (ret)
1289 break;
1290 } else
1291 bio_iov_add_page(bio, page, len, offset);
1292
1293 offset = 0;
1294 }
1295
1296 iov_iter_revert(iter, left);
1297 out:
1298 while (i < nr_pages)
1299 bio_release_page(bio, pages[i++]);
1300
1301 return ret;
1302 }
1303
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
WARNING: multiple messages have this Message-ID (diff)
From: kernel test robot <lkp@intel.com>
To: ed.tsai@mediatek.com, ming.lei@redhat.com, hch@lst.de,
Jens Axboe <axboe@kernel.dk>,
Matthias Brugger <matthias.bgg@gmail.com>,
AngeloGioacchino Del Regno
<angelogioacchino.delregno@collabora.com>
Cc: oe-kbuild-all@lists.linux.dev, wsd_upstream@mediatek.com,
chun-hung.wu@mediatek.com, casper.li@mediatek.com,
will.shiu@mediatek.com, light.hsieh@mediatek.com,
Ed Tsai <ed.tsai@mediatek.com>,
linux-block@vger.kernel.org, linux-kernel@vger.kernel.org,
linux-arm-kernel@lists.infradead.org,
linux-mediatek@lists.infradead.org
Subject: Re: [PATCH v2] block: limit the extract size to align queue limit
Date: Fri, 10 Nov 2023 18:59:19 +0800 [thread overview]
Message-ID: <202311101853.9N398fyj-lkp@intel.com> (raw)
In-Reply-To: <20231110051950.21972-1-ed.tsai@mediatek.com>
Hi,
kernel test robot noticed the following build warnings:
[auto build test WARNING on axboe-block/for-next]
[also build test WARNING on hch-configfs/for-next linus/master v6.6 next-20231110]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/ed-tsai-mediatek-com/block-limit-the-extract-size-to-align-queue-limit/20231110-142205
base: https://git.kernel.org/pub/scm/linux/kernel/git/axboe/linux-block.git for-next
patch link: https://lore.kernel.org/r/20231110051950.21972-1-ed.tsai%40mediatek.com
patch subject: [PATCH v2] block: limit the extract size to align queue limit
config: arc-randconfig-002-20231110 (https://download.01.org/0day-ci/archive/20231110/202311101853.9N398fyj-lkp@intel.com/config)
compiler: arc-elf-gcc (GCC) 13.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20231110/202311101853.9N398fyj-lkp@intel.com/reproduce)
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>
| Closes: https://lore.kernel.org/oe-kbuild-all/202311101853.9N398fyj-lkp@intel.com/
All warnings (new ones prefixed by >>):
block/bio.c: In function '__bio_iov_iter_get_pages':
>> block/bio.c:1261:29: warning: suggest parentheses around '-' in operand of '&' [-Wparentheses]
1261 | max - bio->bi_iter.bi_size & (max - 1) : max;
| ~~~~^~~~~~~~~~~~~~~~~~~~~~
vim +1261 block/bio.c
1214
1215 /**
1216 * __bio_iov_iter_get_pages - pin user or kernel pages and add them to a bio
1217 * @bio: bio to add pages to
1218 * @iter: iov iterator describing the region to be mapped
1219 *
1220 * Extracts pages from *iter and appends them to @bio's bvec array. The pages
1221 * will have to be cleaned up in the way indicated by the BIO_PAGE_PINNED flag.
1222 * For a multi-segment *iter, this function only adds pages from the next
1223 * non-empty segment of the iov iterator.
1224 */
1225 static int __bio_iov_iter_get_pages(struct bio *bio, struct iov_iter *iter)
1226 {
1227 iov_iter_extraction_t extraction_flags = 0;
1228 unsigned short nr_pages = bio->bi_max_vecs - bio->bi_vcnt;
1229 unsigned short entries_left = bio->bi_max_vecs - bio->bi_vcnt;
1230 struct block_device *bdev = bio->bi_bdev;
1231 struct bio_vec *bv = bio->bi_io_vec + bio->bi_vcnt;
1232 struct page **pages = (struct page **)bv;
1233 ssize_t max_extract = UINT_MAX - bio->bi_iter.bi_size;
1234 ssize_t size, left;
1235 unsigned len, i = 0;
1236 size_t offset;
1237 int ret = 0;
1238
1239 /*
1240 * Move page array up in the allocated memory for the bio vecs as far as
1241 * possible so that we can start filling biovecs from the beginning
1242 * without overwriting the temporary page array.
1243 */
1244 BUILD_BUG_ON(PAGE_PTRS_PER_BVEC < 2);
1245 pages += entries_left * (PAGE_PTRS_PER_BVEC - 1);
1246
1247 if (bdev && blk_queue_pci_p2pdma(bdev->bd_disk->queue))
1248 extraction_flags |= ITER_ALLOW_P2PDMA;
1249
1250 /*
1251 * Each segment in the iov is required to be a block size multiple.
1252 * However, we may not be able to get the entire segment if it spans
1253 * more pages than bi_max_vecs allows, so we have to ALIGN_DOWN the
1254 * result to ensure the bio's total size is correct. The remainder of
1255 * the iov data will be picked up in the next bio iteration.
1256 */
1257 if (bdev && bio_op(bio) != REQ_OP_ZONE_APPEND) {
1258 unsigned int max = queue_max_bytes(bdev_get_queue(bdev));
1259
1260 max_extract = bio->bi_iter.bi_size ?
> 1261 max - bio->bi_iter.bi_size & (max - 1) : max;
1262 }
1263 size = iov_iter_extract_pages(iter, &pages, max_extract,
1264 nr_pages, extraction_flags, &offset);
1265 if (unlikely(size <= 0))
1266 return size ? size : -EFAULT;
1267
1268 nr_pages = DIV_ROUND_UP(offset + size, PAGE_SIZE);
1269
1270 if (bdev) {
1271 size_t trim = size & (bdev_logical_block_size(bdev) - 1);
1272 iov_iter_revert(iter, trim);
1273 size -= trim;
1274 }
1275
1276 if (unlikely(!size)) {
1277 ret = -EFAULT;
1278 goto out;
1279 }
1280
1281 for (left = size, i = 0; left > 0; left -= len, i++) {
1282 struct page *page = pages[i];
1283
1284 len = min_t(size_t, PAGE_SIZE - offset, left);
1285 if (bio_op(bio) == REQ_OP_ZONE_APPEND) {
1286 ret = bio_iov_add_zone_append_page(bio, page, len,
1287 offset);
1288 if (ret)
1289 break;
1290 } else
1291 bio_iov_add_page(bio, page, len, offset);
1292
1293 offset = 0;
1294 }
1295
1296 iov_iter_revert(iter, left);
1297 out:
1298 while (i < nr_pages)
1299 bio_release_page(bio, pages[i++]);
1300
1301 return ret;
1302 }
1303
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
next prev parent reply other threads:[~2023-11-10 11:00 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-11-10 5:19 [PATCH v2] block: limit the extract size to align queue limit ed.tsai
2023-11-10 5:19 ` ed.tsai
2023-11-10 6:36 ` Christoph Hellwig
2023-11-10 6:36 ` Christoph Hellwig
2023-11-10 10:59 ` kernel test robot [this message]
2023-11-10 10:59 ` kernel test robot
2023-11-10 16:03 ` Ming Lei
2023-11-10 16:03 ` Ming Lei
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=202311101853.9N398fyj-lkp@intel.com \
--to=lkp@intel.com \
--cc=angelogioacchino.delregno@collabora.com \
--cc=axboe@kernel.dk \
--cc=casper.li@mediatek.com \
--cc=chun-hung.wu@mediatek.com \
--cc=ed.tsai@mediatek.com \
--cc=hch@lst.de \
--cc=light.hsieh@mediatek.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-block@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mediatek@lists.infradead.org \
--cc=matthias.bgg@gmail.com \
--cc=ming.lei@redhat.com \
--cc=oe-kbuild-all@lists.linux.dev \
--cc=will.shiu@mediatek.com \
--cc=wsd_upstream@mediatek.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.