Clarification regarding "nvme discover" and setting IOSQES/IOCQES

Keith Busch kbusch at kernel.org
Mon Feb 8 14:04:58 EST 2021


On Mon, Feb 08, 2021 at 10:59:43AM -0800, Sagi Grimberg wrote:
> 
> > Hi Sagi,
> > 
> > Yes. The Discovery Controller currently allows it. The problem, however,
> > is that the DC seems to be expecting these values to be non-zero.
> > 
> > I tried setting IOCQES=0 and IOSQES=0, which the DC allows (i.e. Prop
> > Set return status=0). However, when I follow this by a "Property Get -
> > Controller Status", the Status now shows "Controller Fatal Status (CFS)"
> > (see Base specs - Figure 79).
> 
> Yes, the oversight extends to the target that expects it (shared code
> with I/O controllers).
> 
> Does this fix your issue?

Seems like the Identify Controller SQES and CQES fields ought to be
updated too, but the spec isn't clear on this. Feels like ECN
material...

> --
> diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c
> index 546a10407385..a7578c601727 100644
> --- a/drivers/nvme/host/core.c
> +++ b/drivers/nvme/host/core.c
> @@ -2443,6 +2443,11 @@ int nvme_disable_ctrl(struct nvme_ctrl *ctrl)
>  }
>  EXPORT_SYMBOL_GPL(nvme_disable_ctrl);
> 
> +static inline bool nvme_discovery_ctrl(struct nvme_ctrl *ctrl)
> +{
> +       return ctrl->opts && ctrl->opts->discovery_nqn;
> +}
> +
>  int nvme_enable_ctrl(struct nvme_ctrl *ctrl)
>  {
>         unsigned dev_page_min;
> @@ -2468,7 +2473,8 @@ int nvme_enable_ctrl(struct nvme_ctrl *ctrl)
>                 ctrl->ctrl_config = NVME_CC_CSS_NVM;
>         ctrl->ctrl_config |= (NVME_CTRL_PAGE_SHIFT - 12) <<
> NVME_CC_MPS_SHIFT;
>         ctrl->ctrl_config |= NVME_CC_AMS_RR | NVME_CC_SHN_NONE;
> -       ctrl->ctrl_config |= NVME_CC_IOSQES | NVME_CC_IOCQES;
> +       if (!nvme_discovery_ctrl(ctrl))
> +               ctrl->ctrl_config |= NVME_CC_IOSQES | NVME_CC_IOCQES;
>         ctrl->ctrl_config |= NVME_CC_ENABLE;
> 
>         ret = ctrl->ops->reg_write32(ctrl, NVME_REG_CC, ctrl->ctrl_config);
> @@ -2888,11 +2894,6 @@ static const struct attribute_group
> *nvme_subsys_attrs_groups[] = {
>         NULL,
>  };
> 
> -static inline bool nvme_discovery_ctrl(struct nvme_ctrl *ctrl)
> -{
> -       return ctrl->opts && ctrl->opts->discovery_nqn;
> -}
> -
>  static bool nvme_validate_cntlid(struct nvme_subsystem *subsys,
>                 struct nvme_ctrl *ctrl, struct nvme_id_ctrl *id)
>  {
> diff --git a/drivers/nvme/target/core.c b/drivers/nvme/target/core.c
> index 8ce4d59cc9e7..baa26a65d83d 100644
> --- a/drivers/nvme/target/core.c
> +++ b/drivers/nvme/target/core.c
> @@ -1107,9 +1107,14 @@ static void nvmet_start_ctrl(struct nvmet_ctrl *ctrl)
>  {
>         lockdep_assert_held(&ctrl->lock);
> 
> -       if (nvmet_cc_iosqes(ctrl->cc) != NVME_NVM_IOSQES ||
> -           nvmet_cc_iocqes(ctrl->cc) != NVME_NVM_IOCQES ||
> -           nvmet_cc_mps(ctrl->cc) != 0 ||
> +       if (!ctrl->subsys->type == NVME_NQN_DISC &&
> +           (nvmet_cc_iosqes(ctrl->cc) != NVME_NVM_IOSQES ||
> +            nvmet_cc_iocqes(ctrl->cc) != NVME_NVM_IOCQES)) {
> +               ctrl->csts = NVME_CSTS_CFS;
> +               return;
> +       }
> +
> +       if (nvmet_cc_mps(ctrl->cc) != 0 ||
>             nvmet_cc_ams(ctrl->cc) != 0 ||
>             nvmet_cc_css(ctrl->cc) != 0) {
>                 ctrl->csts = NVME_CSTS_CFS;
> --
> 
> _______________________________________________
> Linux-nvme mailing list
> Linux-nvme at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-nvme



More information about the Linux-nvme mailing list