[PATCH v2 03/10] block: Add copy offload support infrastructure
Dan Carpenter
dan.carpenter at oracle.com
Tue Feb 8 23:48:44 PST 2022
Hi Nitesh,
url: https://github.com/0day-ci/linux/commits/Nitesh-Shetty/block-make-bio_map_kern-non-static/20220207-231407
base: https://git.kernel.org/pub/scm/linux/kernel/git/axboe/linux-block.git for-next
config: i386-randconfig-m021-20220207 (https://download.01.org/0day-ci/archive/20220209/202202090703.U5riBMIn-lkp@intel.com/config)
compiler: gcc-9 (Debian 9.3.0-22) 9.3.0
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp at intel.com>
Reported-by: Dan Carpenter <dan.carpenter at oracle.com>
smatch warnings:
block/blk-lib.c:272 blk_copy_offload() warn: possible memory leak of 'ctx'
vim +/ctx +272 block/blk-lib.c
12a9801a7301f1 Nitesh Shetty 2022-02-07 185 int blk_copy_offload(struct block_device *src_bdev, int nr_srcs,
12a9801a7301f1 Nitesh Shetty 2022-02-07 186 struct range_entry *rlist, struct block_device *dst_bdev, gfp_t gfp_mask)
12a9801a7301f1 Nitesh Shetty 2022-02-07 187 {
12a9801a7301f1 Nitesh Shetty 2022-02-07 188 struct request_queue *sq = bdev_get_queue(src_bdev);
12a9801a7301f1 Nitesh Shetty 2022-02-07 189 struct request_queue *dq = bdev_get_queue(dst_bdev);
12a9801a7301f1 Nitesh Shetty 2022-02-07 190 struct bio *read_bio, *write_bio;
12a9801a7301f1 Nitesh Shetty 2022-02-07 191 struct copy_ctx *ctx;
12a9801a7301f1 Nitesh Shetty 2022-02-07 192 struct cio *cio;
12a9801a7301f1 Nitesh Shetty 2022-02-07 193 struct page *token;
12a9801a7301f1 Nitesh Shetty 2022-02-07 194 sector_t src_blk, copy_len, dst_blk;
12a9801a7301f1 Nitesh Shetty 2022-02-07 195 sector_t remaining, max_copy_len = LONG_MAX;
12a9801a7301f1 Nitesh Shetty 2022-02-07 196 int ri = 0, ret = 0;
12a9801a7301f1 Nitesh Shetty 2022-02-07 197
12a9801a7301f1 Nitesh Shetty 2022-02-07 198 cio = kzalloc(sizeof(struct cio), GFP_KERNEL);
12a9801a7301f1 Nitesh Shetty 2022-02-07 199 if (!cio)
12a9801a7301f1 Nitesh Shetty 2022-02-07 200 return -ENOMEM;
12a9801a7301f1 Nitesh Shetty 2022-02-07 201 atomic_set(&cio->refcount, 0);
12a9801a7301f1 Nitesh Shetty 2022-02-07 202 cio->rlist = rlist;
12a9801a7301f1 Nitesh Shetty 2022-02-07 203
12a9801a7301f1 Nitesh Shetty 2022-02-07 204 max_copy_len = min3(max_copy_len, (sector_t)sq->limits.max_copy_sectors,
12a9801a7301f1 Nitesh Shetty 2022-02-07 205 (sector_t)dq->limits.max_copy_sectors);
12a9801a7301f1 Nitesh Shetty 2022-02-07 206 max_copy_len = min3(max_copy_len, (sector_t)sq->limits.max_copy_range_sectors,
12a9801a7301f1 Nitesh Shetty 2022-02-07 207 (sector_t)dq->limits.max_copy_range_sectors) << SECTOR_SHIFT;
12a9801a7301f1 Nitesh Shetty 2022-02-07 208
12a9801a7301f1 Nitesh Shetty 2022-02-07 209 for (ri = 0; ri < nr_srcs; ri++) {
12a9801a7301f1 Nitesh Shetty 2022-02-07 210 cio->rlist[ri].comp_len = rlist[ri].len;
12a9801a7301f1 Nitesh Shetty 2022-02-07 211 for (remaining = rlist[ri].len, src_blk = rlist[ri].src, dst_blk = rlist[ri].dst;
12a9801a7301f1 Nitesh Shetty 2022-02-07 212 remaining > 0;
12a9801a7301f1 Nitesh Shetty 2022-02-07 213 remaining -= copy_len, src_blk += copy_len, dst_blk += copy_len) {
12a9801a7301f1 Nitesh Shetty 2022-02-07 214 copy_len = min(remaining, max_copy_len);
12a9801a7301f1 Nitesh Shetty 2022-02-07 215
12a9801a7301f1 Nitesh Shetty 2022-02-07 216 token = alloc_page(gfp_mask);
12a9801a7301f1 Nitesh Shetty 2022-02-07 217 if (unlikely(!token)) {
12a9801a7301f1 Nitesh Shetty 2022-02-07 218 ret = -ENOMEM;
12a9801a7301f1 Nitesh Shetty 2022-02-07 219 goto err_token;
12a9801a7301f1 Nitesh Shetty 2022-02-07 220 }
12a9801a7301f1 Nitesh Shetty 2022-02-07 221
12a9801a7301f1 Nitesh Shetty 2022-02-07 222 read_bio = bio_alloc(src_bdev, 1, REQ_OP_READ | REQ_COPY | REQ_NOMERGE,
12a9801a7301f1 Nitesh Shetty 2022-02-07 223 gfp_mask);
12a9801a7301f1 Nitesh Shetty 2022-02-07 224 if (!read_bio) {
12a9801a7301f1 Nitesh Shetty 2022-02-07 225 ret = -ENOMEM;
12a9801a7301f1 Nitesh Shetty 2022-02-07 226 goto err_read_bio;
12a9801a7301f1 Nitesh Shetty 2022-02-07 227 }
12a9801a7301f1 Nitesh Shetty 2022-02-07 228 read_bio->bi_iter.bi_sector = src_blk >> SECTOR_SHIFT;
12a9801a7301f1 Nitesh Shetty 2022-02-07 229 read_bio->bi_iter.bi_size = copy_len;
12a9801a7301f1 Nitesh Shetty 2022-02-07 230 __bio_add_page(read_bio, token, PAGE_SIZE, 0);
12a9801a7301f1 Nitesh Shetty 2022-02-07 231 ret = submit_bio_wait(read_bio);
12a9801a7301f1 Nitesh Shetty 2022-02-07 232 if (ret) {
12a9801a7301f1 Nitesh Shetty 2022-02-07 233 bio_put(read_bio);
12a9801a7301f1 Nitesh Shetty 2022-02-07 234 goto err_read_bio;
12a9801a7301f1 Nitesh Shetty 2022-02-07 235 }
12a9801a7301f1 Nitesh Shetty 2022-02-07 236 bio_put(read_bio);
12a9801a7301f1 Nitesh Shetty 2022-02-07 237 ctx = kzalloc(sizeof(struct copy_ctx), gfp_mask);
12a9801a7301f1 Nitesh Shetty 2022-02-07 238 if (!ctx) {
12a9801a7301f1 Nitesh Shetty 2022-02-07 239 ret = -ENOMEM;
12a9801a7301f1 Nitesh Shetty 2022-02-07 240 goto err_read_bio;
12a9801a7301f1 Nitesh Shetty 2022-02-07 241 }
12a9801a7301f1 Nitesh Shetty 2022-02-07 242 ctx->cio = cio;
12a9801a7301f1 Nitesh Shetty 2022-02-07 243 ctx->range_idx = ri;
12a9801a7301f1 Nitesh Shetty 2022-02-07 244 ctx->start_sec = rlist[ri].src;
12a9801a7301f1 Nitesh Shetty 2022-02-07 245
12a9801a7301f1 Nitesh Shetty 2022-02-07 246 write_bio = bio_alloc(dst_bdev, 1, REQ_OP_WRITE | REQ_COPY | REQ_NOMERGE,
12a9801a7301f1 Nitesh Shetty 2022-02-07 247 gfp_mask);
12a9801a7301f1 Nitesh Shetty 2022-02-07 248 if (!write_bio) {
Please call kfree(ctx) before the goto.
12a9801a7301f1 Nitesh Shetty 2022-02-07 249 ret = -ENOMEM;
12a9801a7301f1 Nitesh Shetty 2022-02-07 250 goto err_read_bio;
12a9801a7301f1 Nitesh Shetty 2022-02-07 251 }
12a9801a7301f1 Nitesh Shetty 2022-02-07 252
12a9801a7301f1 Nitesh Shetty 2022-02-07 253 write_bio->bi_iter.bi_sector = dst_blk >> SECTOR_SHIFT;
12a9801a7301f1 Nitesh Shetty 2022-02-07 254 write_bio->bi_iter.bi_size = copy_len;
12a9801a7301f1 Nitesh Shetty 2022-02-07 255 __bio_add_page(write_bio, token, PAGE_SIZE, 0);
12a9801a7301f1 Nitesh Shetty 2022-02-07 256 write_bio->bi_end_io = bio_copy_end_io;
12a9801a7301f1 Nitesh Shetty 2022-02-07 257 write_bio->bi_private = ctx;
12a9801a7301f1 Nitesh Shetty 2022-02-07 258 atomic_inc(&cio->refcount);
12a9801a7301f1 Nitesh Shetty 2022-02-07 259 submit_bio(write_bio);
12a9801a7301f1 Nitesh Shetty 2022-02-07 260 }
12a9801a7301f1 Nitesh Shetty 2022-02-07 261 }
12a9801a7301f1 Nitesh Shetty 2022-02-07 262
12a9801a7301f1 Nitesh Shetty 2022-02-07 263 /* Wait for completion of all IO's*/
12a9801a7301f1 Nitesh Shetty 2022-02-07 264 return cio_await_completion(cio);
12a9801a7301f1 Nitesh Shetty 2022-02-07 265
12a9801a7301f1 Nitesh Shetty 2022-02-07 266 err_read_bio:
12a9801a7301f1 Nitesh Shetty 2022-02-07 267 __free_page(token);
12a9801a7301f1 Nitesh Shetty 2022-02-07 268 err_token:
12a9801a7301f1 Nitesh Shetty 2022-02-07 269 rlist[ri].comp_len = min_t(sector_t, rlist[ri].comp_len, (rlist[ri].len - remaining));
12a9801a7301f1 Nitesh Shetty 2022-02-07 270
12a9801a7301f1 Nitesh Shetty 2022-02-07 271 cio->io_err = ret;
12a9801a7301f1 Nitesh Shetty 2022-02-07 @272 return cio_await_completion(cio);
12a9801a7301f1 Nitesh Shetty 2022-02-07 273 }
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
More information about the Linux-nvme
mailing list