Re: [PATCH v4 05/10] nvme: add copy offload support

kernel test robot
2022-04-28T15:06:00Z

Hi Nitesh,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on next-20220422]
[cannot apply to axboe-block/for-next device-mapper-dm/for-next linus/master v5.18-rc4 v5.18-rc3 v5.18-rc2 v5.18-rc4]
[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]

url: https://github.com/intel-lab-lkp/linux/commits/Nitesh-Shetty/block-Introduce-queue-limits-for-copy-offload-support/20220426-201825
base: e7d6987e09a328d4a949701db40ef63fbb970670
config: s390-randconfig-s032-20220427 (https://download.01.org/0day-ci/archive/20220428/202204282136.kqIaq8aK-lkp@intel.com/config)
compiler: s390-linux-gcc (GCC) 11.3.0
reproduce:
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# apt-get install sparse
# sparse version: v0.6.4-dirty
# https://github.com/intel-lab-lkp/linux/commit/e029014185aff1d7c8facf6e19447487c6ce2b93
git remote add linux-review https://github.com/intel-lab-lkp/linux
git fetch --no-tags linux-review Nitesh-Shetty/block-Introduce-queue-limits-for-copy-offload-support/20220426-201825
git checkout e029014185aff1d7c8facf6e19447487c6ce2b93
# save the config file
mkdir build_dir && cp config build_dir/.config
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-11.3.0 make.cross C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' O=build_dir ARCH=s390 SHELL=/bin/bash drivers/md/ drivers/nvme/host/ drivers/nvme/target/

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

sparse warnings: (new ones prefixed by >>)
>> drivers/nvme/host/core.c:803:26: sparse: sparse: incorrect type in assignment (different base types) @@ expected restricted __le16 [usertype] dspec @@ got restricted __le32 [usertype] @@
drivers/nvme/host/core.c:803:26: sparse: expected restricted __le16 [usertype] dspec
drivers/nvme/host/core.c:803:26: sparse: got restricted __le32 [usertype]

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

739
740 static inline blk_status_t nvme_setup_copy_write(struct nvme_ns *ns,
741 struct request *req, struct nvme_command *cmnd)
742 {
743 struct nvme_ctrl *ctrl = ns->ctrl;
744 struct nvme_copy_range *range = NULL;
745 struct bio *bio = req->bio;
746 struct nvme_copy_token *token = bvec_kmap_local(&bio->bi_io_vec[0]);
747 sector_t src_sector, dst_sector, n_sectors;
748 u64 src_lba, dst_lba, n_lba;
749 unsigned short nr_range = 1;
750 u16 control = 0;
751 u32 dsmgmt = 0;
752
753 if (unlikely(memcmp(token->subsys, "nvme", 4)))
754 return BLK_STS_NOTSUPP;
755 if (unlikely(token->ns != ns))
756 return BLK_STS_NOTSUPP;
757
758 src_sector = token->src_sector;
759 dst_sector = bio->bi_iter.bi_sector;
760 n_sectors = token->sectors;
761 if (WARN_ON(n_sectors != bio->bi_iter.bi_size >> 9))
762 return BLK_STS_NOTSUPP;
763
764 src_lba = nvme_sect_to_lba(ns, src_sector);
765 dst_lba = nvme_sect_to_lba(ns, dst_sector);
766 n_lba = nvme_sect_to_lba(ns, n_sectors);
767
768 if (unlikely(nvme_lba_to_sect(ns, src_lba) != src_sector) ||
769 unlikely(nvme_lba_to_sect(ns, dst_lba) != dst_sector) ||
770 unlikely(nvme_lba_to_sect(ns, n_lba) != n_sectors))
771 return BLK_STS_NOTSUPP;
772
773 if (WARN_ON(!n_lba))
774 return BLK_STS_NOTSUPP;
775
776 if (req->cmd_flags & REQ_FUA)
777 control |= NVME_RW_FUA;
778
779 if (req->cmd_flags & REQ_FAILFAST_DEV)
780 control |= NVME_RW_LR;
781
782 memset(cmnd, 0, sizeof(*cmnd));
783 cmnd->copy.opcode = nvme_cmd_copy;
784 cmnd->copy.nsid = cpu_to_le32(ns->head->ns_id);
785 cmnd->copy.sdlba = cpu_to_le64(dst_lba);
786
787 range = kmalloc_array(nr_range, sizeof(*range),
788 GFP_ATOMIC | __GFP_NOWARN);
789 if (!range)
790 return BLK_STS_RESOURCE;
791
792 range[0].slba = cpu_to_le64(src_lba);
793 range[0].nlb = cpu_to_le16(n_lba - 1);
794
795 cmnd->copy.nr_range = 0;
796
797 req->special_vec.bv_page = virt_to_page(range);
798 req->special_vec.bv_offset = offset_in_page(range);
799 req->special_vec.bv_len = sizeof(*range) * nr_range;
800 req->rq_flags |= RQF_SPECIAL_PAYLOAD;
801
802 cmnd->copy.control = cpu_to_le16(control);
> 803 cmnd->copy.dspec = cpu_to_le32(dsmgmt);
804
805 return BLK_STS_OK;
806 }
807

--
0-DAY CI Kernel Test Service