Merge tag 'nvme-6.6-2023-09-14' of git://git.infradead.org/nvme into block-6.6
authorJens Axboe <axboe@kernel.dk>
Thu, 14 Sep 2023 22:20:31 +0000 (16:20 -0600)
committerJens Axboe <axboe@kernel.dk>
Thu, 14 Sep 2023 22:20:31 +0000 (16:20 -0600)
Pull NVMe fixes from Keith:

"nvme fixes for Linux 6.6

 - nvme-tcp iov len fix (Varun)
 - nvme-hwmon const qualifier for safety (Krzysztof)
 - nvme-fc null pointer checks (Nigel)
 - nvme-pci no numa node fix (Pratyush)
 - nvme timeout fix for non-compliant controllers (Keith)"

* tag 'nvme-6.6-2023-09-14' of git://git.infradead.org/nvme:
  nvme: avoid bogus CRTO values
  nvme-pci: do not set the NUMA node of device if it has none
  nvme-fc: Prevent null pointer dereference in nvme_fc_io_getuuid()
  nvme: host: hwmon: constify pointers to hwmon_channel_info
  nvmet-tcp: pass iov_len instead of sg->length to bvec_set_page()

drivers/nvme/host/core.c
drivers/nvme/host/fc.c
drivers/nvme/host/hwmon.c
drivers/nvme/host/pci.c
drivers/nvme/target/tcp.c

index f3a01b7..21783aa 100644 (file)
@@ -2245,25 +2245,8 @@ int nvme_enable_ctrl(struct nvme_ctrl *ctrl)
        else
                ctrl->ctrl_config = NVME_CC_CSS_NVM;
 
-       if (ctrl->cap & NVME_CAP_CRMS_CRWMS) {
-               u32 crto;
-
-               ret = ctrl->ops->reg_read32(ctrl, NVME_REG_CRTO, &crto);
-               if (ret) {
-                       dev_err(ctrl->device, "Reading CRTO failed (%d)\n",
-                               ret);
-                       return ret;
-               }
-
-               if (ctrl->cap & NVME_CAP_CRMS_CRIMS) {
-                       ctrl->ctrl_config |= NVME_CC_CRIME;
-                       timeout = NVME_CRTO_CRIMT(crto);
-               } else {
-                       timeout = NVME_CRTO_CRWMT(crto);
-               }
-       } else {
-               timeout = NVME_CAP_TIMEOUT(ctrl->cap);
-       }
+       if (ctrl->cap & NVME_CAP_CRMS_CRWMS && ctrl->cap & NVME_CAP_CRMS_CRIMS)
+               ctrl->ctrl_config |= NVME_CC_CRIME;
 
        ctrl->ctrl_config |= (NVME_CTRL_PAGE_SHIFT - 12) << NVME_CC_MPS_SHIFT;
        ctrl->ctrl_config |= NVME_CC_AMS_RR | NVME_CC_SHN_NONE;
@@ -2277,6 +2260,39 @@ int nvme_enable_ctrl(struct nvme_ctrl *ctrl)
        if (ret)
                return ret;
 
+       /* CAP value may change after initial CC write */
+       ret = ctrl->ops->reg_read64(ctrl, NVME_REG_CAP, &ctrl->cap);
+       if (ret)
+               return ret;
+
+       timeout = NVME_CAP_TIMEOUT(ctrl->cap);
+       if (ctrl->cap & NVME_CAP_CRMS_CRWMS) {
+               u32 crto, ready_timeout;
+
+               ret = ctrl->ops->reg_read32(ctrl, NVME_REG_CRTO, &crto);
+               if (ret) {
+                       dev_err(ctrl->device, "Reading CRTO failed (%d)\n",
+                               ret);
+                       return ret;
+               }
+
+               /*
+                * CRTO should always be greater or equal to CAP.TO, but some
+                * devices are known to get this wrong. Use the larger of the
+                * two values.
+                */
+               if (ctrl->ctrl_config & NVME_CC_CRIME)
+                       ready_timeout = NVME_CRTO_CRIMT(crto);
+               else
+                       ready_timeout = NVME_CRTO_CRWMT(crto);
+
+               if (ready_timeout < timeout)
+                       dev_warn_once(ctrl->device, "bad crto:%x cap:%llx\n",
+                                     crto, ctrl->cap);
+               else
+                       timeout = ready_timeout;
+       }
+
        ctrl->ctrl_config |= NVME_CC_ENABLE;
        ret = ctrl->ops->reg_write32(ctrl, NVME_REG_CC, ctrl->ctrl_config);
        if (ret)
index 1cd2bf8..a15b377 100644 (file)
@@ -1924,7 +1924,7 @@ char *nvme_fc_io_getuuid(struct nvmefc_fcp_req *req)
        struct nvme_fc_fcp_op *op = fcp_req_to_fcp_op(req);
        struct request *rq = op->rq;
 
-       if (!IS_ENABLED(CONFIG_BLK_CGROUP_FC_APPID) || !rq->bio)
+       if (!IS_ENABLED(CONFIG_BLK_CGROUP_FC_APPID) || !rq || !rq->bio)
                return NULL;
        return blkcg_get_fc_appid(rq->bio);
 }
index 316f3e4..8df73a0 100644 (file)
@@ -187,7 +187,7 @@ static umode_t nvme_hwmon_is_visible(const void *_data,
        return 0;
 }
 
-static const struct hwmon_channel_info *nvme_hwmon_info[] = {
+static const struct hwmon_channel_info *const nvme_hwmon_info[] = {
        HWMON_CHANNEL_INFO(chip, HWMON_C_REGISTER_TZ),
        HWMON_CHANNEL_INFO(temp,
                           HWMON_T_INPUT | HWMON_T_MAX | HWMON_T_MIN |
index 2f57da1..347cb5d 100644 (file)
@@ -2916,9 +2916,6 @@ static struct nvme_dev *nvme_pci_alloc_dev(struct pci_dev *pdev,
        struct nvme_dev *dev;
        int ret = -ENOMEM;
 
-       if (node == NUMA_NO_NODE)
-               set_dev_node(&pdev->dev, first_memory_node);
-
        dev = kzalloc_node(sizeof(*dev), GFP_KERNEL, node);
        if (!dev)
                return ERR_PTR(-ENOMEM);
index 868aa4d..cd92d7d 100644 (file)
@@ -348,7 +348,7 @@ static void nvmet_tcp_build_pdu_iovec(struct nvmet_tcp_cmd *cmd)
        while (length) {
                u32 iov_len = min_t(u32, length, sg->length - sg_offset);
 
-               bvec_set_page(iov, sg_page(sg), sg->length,
+               bvec_set_page(iov, sg_page(sg), iov_len,
                                sg->offset + sg_offset);
 
                length -= iov_len;