Message ID | 20230324181741.13908-12-michael.christie@oracle.com |
---|---|
State | Superseded |
Headers | show |
Series | Use block pr_ops in LIO | expand |
Hi Mike, I love your patch! Perhaps something to improve: [auto build test WARNING on mkp-scsi/for-next] [also build test WARNING on jejb-scsi/for-next axboe-block/for-next linus/master v6.3-rc4 next-20230328] [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/Mike-Christie/block-Add-PR-callouts-for-read-keys-and-reservation/20230325-022314 base: https://git.kernel.org/pub/scm/linux/kernel/git/mkp/scsi.git for-next patch link: https://lore.kernel.org/r/20230324181741.13908-12-michael.christie%40oracle.com patch subject: [PATCH v5 11/18] nvme: Add pr_ops read_keys support config: i386-randconfig-s002 (https://download.01.org/0day-ci/archive/20230328/202303281502.U47uzous-lkp@intel.com/config) compiler: gcc-11 (Debian 11.3.0-8) 11.3.0 reproduce: # apt-get install sparse # sparse version: v0.6.4-39-gce1a6720-dirty # https://github.com/intel-lab-lkp/linux/commit/fcd2233cf643c550ab3cea2b6102077b1d05b389 git remote add linux-review https://github.com/intel-lab-lkp/linux git fetch --no-tags linux-review Mike-Christie/block-Add-PR-callouts-for-read-keys-and-reservation/20230325-022314 git checkout fcd2233cf643c550ab3cea2b6102077b1d05b389 # save the config file mkdir build_dir && cp config build_dir/.config make W=1 C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' O=build_dir ARCH=i386 olddefconfig make W=1 C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' O=build_dir ARCH=i386 SHELL=/bin/bash drivers/nvme/host/ If you fix the issue, kindly add following tag where applicable | Reported-by: kernel test robot <lkp@intel.com> | Link: https://lore.kernel.org/oe-kbuild-all/202303281502.U47uzous-lkp@intel.com/ sparse warnings: (new ones prefixed by >>) >> drivers/nvme/host/pr.c:165:24: sparse: sparse: incorrect type in assignment (different base types) @@ expected restricted __le32 [assigned] [usertype] cdw11 @@ got int @@ drivers/nvme/host/pr.c:165:24: sparse: expected restricted __le32 [assigned] [usertype] cdw11 drivers/nvme/host/pr.c:165:24: sparse: got int >> drivers/nvme/host/pr.c:171:21: sparse: sparse: restricted __le32 degrades to integer vim +165 drivers/nvme/host/pr.c 156 157 static int nvme_pr_resv_report(struct block_device *bdev, void *data, 158 u32 data_len, bool *eds) 159 { 160 struct nvme_command c = { }; 161 int ret; 162 163 c.common.opcode = nvme_cmd_resv_report; 164 c.common.cdw10 = cpu_to_le32(nvme_bytes_to_numd(data_len)); > 165 c.common.cdw11 = NVME_EXTENDED_DATA_STRUCT; 166 *eds = true; 167 168 retry: 169 ret = nvme_send_pr_command(bdev, &c, data, data_len); 170 if (ret == NVME_SC_HOST_ID_INCONSIST && > 171 c.common.cdw11 == NVME_EXTENDED_DATA_STRUCT) { 172 c.common.cdw11 = 0; 173 *eds = false; 174 goto retry; 175 } 176 177 if (ret < 0) 178 return ret; 179 180 return nvme_sc_to_pr_err(ret); 181 } 182
On 3/28/23 2:11 AM, kernel test robot wrote: > Hi Mike, > > I love your patch! Perhaps something to improve: > > [auto build test WARNING on mkp-scsi/for-next] > [also build test WARNING on jejb-scsi/for-next axboe-block/for-next linus/master v6.3-rc4 next-20230328] > [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/Mike-Christie/block-Add-PR-callouts-for-read-keys-and-reservation/20230325-022314 > base: https://git.kernel.org/pub/scm/linux/kernel/git/mkp/scsi.git for-next > patch link: https://lore.kernel.org/r/20230324181741.13908-12-michael.christie%40oracle.com > patch subject: [PATCH v5 11/18] nvme: Add pr_ops read_keys support > config: i386-randconfig-s002 (https://download.01.org/0day-ci/archive/20230328/202303281502.U47uzous-lkp@intel.com/config) > compiler: gcc-11 (Debian 11.3.0-8) 11.3.0 > reproduce: > # apt-get install sparse > # sparse version: v0.6.4-39-gce1a6720-dirty > # https://github.com/intel-lab-lkp/linux/commit/fcd2233cf643c550ab3cea2b6102077b1d05b389 > git remote add linux-review https://github.com/intel-lab-lkp/linux > git fetch --no-tags linux-review Mike-Christie/block-Add-PR-callouts-for-read-keys-and-reservation/20230325-022314 > git checkout fcd2233cf643c550ab3cea2b6102077b1d05b389 > # save the config file > mkdir build_dir && cp config build_dir/.config > make W=1 C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' O=build_dir ARCH=i386 olddefconfig > make W=1 C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' O=build_dir ARCH=i386 SHELL=/bin/bash drivers/nvme/host/ > > If you fix the issue, kindly add following tag where applicable > | Reported-by: kernel test robot <lkp@intel.com> > | Link: https://lore.kernel.org/oe-kbuild-all/202303281502.U47uzous-lkp@intel.com/ > > sparse warnings: (new ones prefixed by >>) >>> drivers/nvme/host/pr.c:165:24: sparse: sparse: incorrect type in assignment (different base types) @@ expected restricted __le32 [assigned] [usertype] cdw11 @@ got int @@ > drivers/nvme/host/pr.c:165:24: sparse: expected restricted __le32 [assigned] [usertype] cdw11 > drivers/nvme/host/pr.c:165:24: sparse: got int >>> drivers/nvme/host/pr.c:171:21: sparse: sparse: restricted __le32 degrades to integer > > vim +165 drivers/nvme/host/pr.c > > 156 > 157 static int nvme_pr_resv_report(struct block_device *bdev, void *data, > 158 u32 data_len, bool *eds) > 159 { > 160 struct nvme_command c = { }; > 161 int ret; > 162 > 163 c.common.opcode = nvme_cmd_resv_report; > 164 c.common.cdw10 = cpu_to_le32(nvme_bytes_to_numd(data_len)); > > 165 c.common.cdw11 = NVME_EXTENDED_DATA_STRUCT; > 166 *eds = true; > 167 > 168 retry: > 169 ret = nvme_send_pr_command(bdev, &c, data, data_len); > 170 if (ret == NVME_SC_HOST_ID_INCONSIST && > > 171 c.common.cdw11 == NVME_EXTENDED_DATA_STRUCT) { Kernel test bot is correct. Will fix.
diff --git a/drivers/nvme/host/pr.c b/drivers/nvme/host/pr.c index cd93d2e5b340..6aadcc25f3e2 100644 --- a/drivers/nvme/host/pr.c +++ b/drivers/nvme/host/pr.c @@ -154,10 +154,79 @@ static int nvme_pr_release(struct block_device *bdev, u64 key, enum pr_type type return nvme_pr_command(bdev, cdw10, key, 0, nvme_cmd_resv_release); } +static int nvme_pr_resv_report(struct block_device *bdev, void *data, + u32 data_len, bool *eds) +{ + struct nvme_command c = { }; + int ret; + + c.common.opcode = nvme_cmd_resv_report; + c.common.cdw10 = cpu_to_le32(nvme_bytes_to_numd(data_len)); + c.common.cdw11 = NVME_EXTENDED_DATA_STRUCT; + *eds = true; + +retry: + ret = nvme_send_pr_command(bdev, &c, data, data_len); + if (ret == NVME_SC_HOST_ID_INCONSIST && + c.common.cdw11 == NVME_EXTENDED_DATA_STRUCT) { + c.common.cdw11 = 0; + *eds = false; + goto retry; + } + + if (ret < 0) + return ret; + + return nvme_sc_to_pr_err(ret); +} + +static int nvme_pr_read_keys(struct block_device *bdev, + struct pr_keys *keys_info) +{ + u32 rse_len, num_keys = keys_info->num_keys; + struct nvme_reservation_status_ext *rse; + int ret, i; + bool eds; + + /* + * Assume we are using 128-bit host IDs and allocate a buffer large + * enough to get enough keys to fill the return keys buffer. + */ + rse_len = struct_size(rse, regctl_eds, num_keys); + rse = kzalloc(rse_len, GFP_KERNEL); + if (!rse) + return -ENOMEM; + + ret = nvme_pr_resv_report(bdev, rse, rse_len, &eds); + if (ret) + goto free_rse; + + keys_info->generation = le32_to_cpu(rse->gen); + keys_info->num_keys = get_unaligned_le16(&rse->regctl); + + num_keys = min(num_keys, keys_info->num_keys); + for (i = 0; i < num_keys; i++) { + if (eds) { + keys_info->keys[i] = + le64_to_cpu(rse->regctl_eds[i].rkey); + } else { + struct nvme_reservation_status *rs; + + rs = (struct nvme_reservation_status *)rse; + keys_info->keys[i] = le64_to_cpu(rs->regctl_ds[i].rkey); + } + } + +free_rse: + kfree(rse); + return ret; +} + const struct pr_ops nvme_pr_ops = { .pr_register = nvme_pr_register, .pr_reserve = nvme_pr_reserve, .pr_release = nvme_pr_release, .pr_preempt = nvme_pr_preempt, .pr_clear = nvme_pr_clear, + .pr_read_keys = nvme_pr_read_keys, }; diff --git a/include/linux/nvme.h b/include/linux/nvme.h index 83704fc04a94..c18bd55a4ead 100644 --- a/include/linux/nvme.h +++ b/include/linux/nvme.h @@ -759,6 +759,10 @@ enum { NVME_LBART_ATTRIB_HIDE = 1 << 1, }; +enum nvme_eds { + NVME_EXTENDED_DATA_STRUCT = 0x1, +}; + struct nvme_registered_ctrl { __le16 cntlid; __u8 rcsts;
This patch adds support for the pr_ops read_keys callout by calling the NVMe Reservation Report helper, then parsing that info to get the controller's registered keys. Because the callout is only used in the kernel where the callers, like LIO, do not know about controller/host IDs, the callout just returns the registered keys which is required by the SCSI PR in READ KEYS command. Signed-off-by: Mike Christie <michael.christie@oracle.com> --- drivers/nvme/host/pr.c | 69 ++++++++++++++++++++++++++++++++++++++++++ include/linux/nvme.h | 4 +++ 2 files changed, 73 insertions(+)