[PATCHv2] nvme: always initialize known command effects
Kanchan Joshi
joshi.k at samsung.com
Mon Jan 23 02:24:31 PST 2023
On Thu, Jan 19, 2023 at 08:41:28AM -0800, Keith Busch wrote:
>From: Keith Busch <kbusch at kernel.org>
>
>Instead of appending command effects flags per IO, set the known effects
>flags the driver needs to react to just once during initial setup.
>
>Signed-off-by: Keith Busch <kbusch at kernel.org>
>---
> drivers/nvme/host/core.c | 83 +++++++++++++++++++++-------------------
> 1 file changed, 44 insertions(+), 39 deletions(-)
>
>diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c
>index 7be562a4e1aa7..d7d2c2b342ba4 100644
>--- a/drivers/nvme/host/core.c
>+++ b/drivers/nvme/host/core.c
>@@ -1060,41 +1060,12 @@ int nvme_submit_sync_cmd(struct request_queue *q, struct nvme_command *cmd,
> }
> EXPORT_SYMBOL_GPL(nvme_submit_sync_cmd);
>
>-static u32 nvme_known_admin_effects(u8 opcode)
>-{
>- switch (opcode) {
>- case nvme_admin_format_nvm:
>- return NVME_CMD_EFFECTS_LBCC | NVME_CMD_EFFECTS_NCC |
>- NVME_CMD_EFFECTS_CSE_MASK;
>- case nvme_admin_sanitize_nvm:
>- return NVME_CMD_EFFECTS_LBCC | NVME_CMD_EFFECTS_CSE_MASK;
>- default:
>- break;
>- }
>- return 0;
>-}
>-
>-static u32 nvme_known_nvm_effects(u8 opcode)
>-{
>- switch (opcode) {
>- case nvme_cmd_write:
>- case nvme_cmd_write_zeroes:
>- case nvme_cmd_write_uncor:
>- return NVME_CMD_EFFECTS_LBCC;
>- default:
>- return 0;
>- }
>-}
>-
> u32 nvme_command_effects(struct nvme_ctrl *ctrl, struct nvme_ns *ns, u8 opcode)
> {
> u32 effects = 0;
>
> if (ns) {
>- if (ns->head->effects)
>- effects = le32_to_cpu(ns->head->effects->iocs[opcode]);
>- if (ns->head->ids.csi == NVME_CAP_CSS_NVM)
>- effects |= nvme_known_nvm_effects(opcode);
>+ effects = le32_to_cpu(ns->head->effects->iocs[opcode]);
> if (effects & ~(NVME_CMD_EFFECTS_CSUPP | NVME_CMD_EFFECTS_LBCC))
> dev_warn_once(ctrl->device,
> "IO command:%02x has unusual effects:%08x\n",
>@@ -1107,9 +1078,7 @@ u32 nvme_command_effects(struct nvme_ctrl *ctrl, struct nvme_ns *ns, u8 opcode)
> */
> effects &= ~NVME_CMD_EFFECTS_CSE_MASK;
> } else {
>- if (ctrl->effects)
>- effects = le32_to_cpu(ctrl->effects->acs[opcode]);
>- effects |= nvme_known_admin_effects(opcode);
>+ effects = le32_to_cpu(ctrl->effects->acs[opcode]);
> }
>
> return effects;
>@@ -3122,6 +3091,44 @@ static int nvme_init_non_mdts_limits(struct nvme_ctrl *ctrl)
> return ret;
> }
>
>+static void nvme_init_known_nvm_effects(struct nvme_ctrl *ctrl)
>+{
>+ struct nvme_effects_log *log = ctrl->effects;
>+
>+ log->acs[nvme_admin_format_nvm] |= cpu_to_le32(NVME_CMD_EFFECTS_LBCC |
>+ NVME_CMD_EFFECTS_NCC |
>+ NVME_CMD_EFFECTS_CSE_MASK);
>+ log->acs[nvme_admin_sanitize_nvm] |= cpu_to_le32(NVME_CMD_EFFECTS_LBCC |
>+ NVME_CMD_EFFECTS_CSE_MASK);
>+
>+ log->iocs[nvme_cmd_write] |= cpu_to_le32(NVME_CMD_EFFECTS_LBCC);
>+ log->iocs[nvme_cmd_write_zeroes] |= cpu_to_le32(NVME_CMD_EFFECTS_LBCC);
>+ log->iocs[nvme_cmd_write_uncor] |= cpu_to_le32(NVME_CMD_EFFECTS_LBCC);
>+}
>+
>+static int nvme_init_effects(struct nvme_ctrl *ctrl, struct nvme_id_ctrl *id)
>+{
>+ int ret = 0;
>+
>+ if (ctrl->effects)
>+ return 0;
>+
>+ if (id->lpa & NVME_CTRL_LPA_CMD_EFFECTS_LOG) {
>+ ret = nvme_get_effects_log(ctrl, NVME_CSI_NVM, &ctrl->effects);
>+ if (ret < 0)
>+ return ret;
>+ }
>+
>+ if (!ctrl->effects) {
>+ ctrl->effects = kzalloc(sizeof(*ctrl->effects), GFP_KERNEL);
ctrl->effects is not getting freed if controller does not support the
commands-supported-and-effects log page?
More information about the Linux-nvme
mailing list