Re: [PATCH v14 07/11] nvme: add copy offload support

kernel test robot
2023-08-12T00:46:20Z

Hi Nitesh,

kernel test robot noticed the following build warnings:

[auto build test WARNING on f7dc24b3413851109c4047b22997bd0d95ed52a2]

url: https://github.com/intel-lab-lkp/linux/commits/Nitesh-Shetty/block-Introduce-queue-limits-and-sysfs-for-copy-offload-support/20230811-192259
base: f7dc24b3413851109c4047b22997bd0d95ed52a2
patch link: https://lore.kernel.org/r/20230811105300.15889-8-nj.shetty%40samsung.com
patch subject: [PATCH v14 07/11] nvme: add copy offload support
config: arm64-randconfig-r013-20230812 (https://download.01.org/0day-ci/archive/20230812/202308120736.Od5Pc9vy-lkp@intel.com/config)
compiler: clang version 17.0.0 (https://github.com/llvm/llvm-project.git 4a5ac14ee968ff0ad5d2cc1ffa0299048db4c88a)
reproduce: (https://download.01.org/0day-ci/archive/20230812/202308120736.Od5Pc9vy-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/202308120736.Od5Pc9vy-lkp@intel.com/

All warnings (new ones prefixed by >>):

>> drivers/nvme/host/core.c:782:2: warning: variable 'dst_lba' is used uninitialized whenever 'if' condition is false [-Wsometimes-uninitialized]
782 | __rq_for_each_bio(bio, req) {
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/blk-mq.h:1008:6: note: expanded from macro '__rq_for_each_bio'
1008 | if ((rq->bio)) \
| ^~~~~~~~~
drivers/nvme/host/core.c:804:33: note: uninitialized use occurs here
804 | cmnd->copy.sdlba = cpu_to_le64(dst_lba);
| ^~~~~~~
include/linux/byteorder/generic.h:86:21: note: expanded from macro 'cpu_to_le64'
86 | #define cpu_to_le64 __cpu_to_le64
| ^
include/uapi/linux/byteorder/little_endian.h:32:51: note: expanded from macro '__cpu_to_le64'
32 | #define __cpu_to_le64(x) ((__force __le64)(__u64)(x))
| ^
drivers/nvme/host/core.c:782:2: note: remove the 'if' if its condition is always true
782 | __rq_for_each_bio(bio, req) {
| ^
include/linux/blk-mq.h:1008:2: note: expanded from macro '__rq_for_each_bio'
1008 | if ((rq->bio)) \
| ^
drivers/nvme/host/core.c:772:13: note: initialize the variable 'dst_lba' to silence this warning
772 | u64 dst_lba, src_lba, n_lba;
| ^
| = 0
1 warning generated.

vim +782 drivers/nvme/host/core.c

765
766 static inline blk_status_t nvme_setup_copy_offload(struct nvme_ns *ns,
767 struct request *req,
768 struct nvme_command *cmnd)
769 {
770 struct nvme_copy_range *range = NULL;
771 struct bio *bio;
772 u64 dst_lba, src_lba, n_lba;
773 u16 nr_range = 1, control = 0, seg = 1;
774
775 if (blk_rq_nr_phys_segments(req) != COPY_MAX_SEGMENTS)
776 return BLK_STS_IOERR;
777
778 /*
779 * First bio contains information about source and last bio contains
780 * information about destination.
781 */
> 782 __rq_for_each_bio(bio, req) {
783 if (seg == blk_rq_nr_phys_segments(req)) {
784 dst_lba = nvme_sect_to_lba(ns, bio->bi_iter.bi_sector);
785 if (n_lba != bio->bi_iter.bi_size >> ns->lba_shift)
786 return BLK_STS_IOERR;
787 } else {
788 src_lba = nvme_sect_to_lba(ns, bio->bi_iter.bi_sector);
789 n_lba = bio->bi_iter.bi_size >> ns->lba_shift;
790 }
791 seg++;
792 }
793
794 if (req->cmd_flags & REQ_FUA)
795 control |= NVME_RW_FUA;
796
797 if (req->cmd_flags & REQ_FAILFAST_DEV)
798 control |= NVME_RW_LR;
799
800 memset(cmnd, 0, sizeof(*cmnd));
801 cmnd->copy.opcode = nvme_cmd_copy;
802 cmnd->copy.nsid = cpu_to_le32(ns->head->ns_id);
803 cmnd->copy.control = cpu_to_le16(control);
804 cmnd->copy.sdlba = cpu_to_le64(dst_lba);
805 cmnd->copy.nr_range = 0;
806
807 range = kmalloc_array(nr_range, sizeof(*range),
808 GFP_ATOMIC | __GFP_NOWARN);
809 if (!range)
810 return BLK_STS_RESOURCE;
811
812 range[0].slba = cpu_to_le64(src_lba);
813 range[0].nlb = cpu_to_le16(n_lba - 1);
814
815 req->special_vec.bv_page = virt_to_page(range);
816 req->special_vec.bv_offset = offset_in_page(range);
817 req->special_vec.bv_len = sizeof(*range) * nr_range;
818 req->rq_flags |= RQF_SPECIAL_PAYLOAD;
819
820 return BLK_STS_OK;
821 }
822

--
0-DAY CI Kernel Test Service