[PATCH 1/1] nvme: retry security commands if media not ready

Christoph Hellwig hch at lst.de
Wed Oct 2 01:16:33 PDT 2024


On Mon, Sep 30, 2024 at 11:48:43AM -0500, gjoyce at linux.ibm.com wrote:
> +static u32 nvme_get_timeout(struct nvme_ctrl *ctrl)

get_timeout feels a bit too generic for this specific controller/media
ready  timeout.

> +	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;
> +		}

And we really should be caching these values instead of reading the
register for every security command.

> +	u32 timeout;
> +	unsigned long timeout_jiffies;
> +	int ret;
> +
> +	timeout = nvme_get_timeout(ctrl);
> +	timeout_jiffies = jiffies + timeout * HZ;
>  
>  	if (send)
>  		cmd.common.opcode = nvme_admin_security_send;
> @@ -2335,8 +2376,19 @@ static int nvme_sec_submit(void *data, u16 spsp, u8 secp, void *buffer, size_t l
>  	cmd.common.cdw10 = cpu_to_le32(((u32)secp) << 24 | ((u32)spsp) << 8);
>  	cmd.common.cdw11 = cpu_to_le32(len);
>  
> -	return __nvme_submit_sync_cmd(ctrl->admin_q, &cmd, NULL, buffer, len,
> +	ret = __nvme_submit_sync_cmd(ctrl->admin_q, &cmd, NULL, buffer, len,
>  			NVME_QID_ANY, NVME_SUBMIT_AT_HEAD);
> +	while (ret == NVME_SC_ADMIN_COMMAND_MEDIA_NOT_READY) {
> +		if (time_after(jiffies, timeout_jiffies)) {
> +			dev_err(ctrl->device,
> +				"Device media not ready; aborting\n");
> +			return -ENODEV;
> +		}
> +		ssleep(1);
> +		ret =  __nvme_submit_sync_cmd(ctrl->admin_q, &cmd, NULL, buffer,
> +				len, NVME_QID_ANY, NVME_SUBMIT_AT_HEAD);
> +	}

And this also feels a bit odd in that it doesn't catch
NVME_SC_ADMIN_COMMAND_MEDIA_NOT_READY when it should be ready.
I think just marking when the controller is past the timeout and
only doing the retry until then might be the better approach.  And
maybe we should have it in the __nvme_submit_sync_cmd helper for
admin command as Security Send/Receive aren't the only commands with
this issue.




More information about the Linux-nvme mailing list