[PATCH v2] nvme-pci: allocate device queues storage space at probe

Ming Lei ming.lei at redhat.com
Wed Dec 27 03:08:21 PST 2017


On Wed, Dec 27, 2017 at 10:59:44AM +0200, Sagi Grimberg wrote:
> 
> > Hi Sagi,
> > 
> > This patch introduces a new kernel oops:
> 
> Hi Ming, thanks for testing.
> 
> It looks like pci resets are not serialized which is in general not
> healthy and forcing the driver to handle tough races. I think that not
> serializing it is buggy to begin with.
> 
> I think [1] should solve the issue you are seeing (and I think correct
> on its own regardless).
> 
> Keith, Christoph, any objections?
> 
> [1]:
> --
> diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c
> index c7e7b8e22bdb..98e4c28ebaaa 100644
> --- a/drivers/nvme/host/core.c
> +++ b/drivers/nvme/host/core.c
> @@ -112,7 +112,7 @@ int nvme_reset_ctrl(struct nvme_ctrl *ctrl)
>  }
>  EXPORT_SYMBOL_GPL(nvme_reset_ctrl);
> 
> -static int nvme_reset_ctrl_sync(struct nvme_ctrl *ctrl)
> +int nvme_reset_ctrl_sync(struct nvme_ctrl *ctrl)
>  {
>         int ret;
> 
> @@ -121,6 +121,7 @@ static int nvme_reset_ctrl_sync(struct nvme_ctrl *ctrl)
>                 flush_work(&ctrl->reset_work);
>         return ret;
>  }
> +EXPORT_SYMBOL_GPL(nvme_reset_ctrl_sync);
> 
>  static void nvme_delete_ctrl_work(struct work_struct *work)
>  {
> diff --git a/drivers/nvme/host/nvme.h b/drivers/nvme/host/nvme.h
> index 9df2dc063f48..67ab41d71038 100644
> --- a/drivers/nvme/host/nvme.h
> +++ b/drivers/nvme/host/nvme.h
> @@ -400,6 +400,7 @@ int nvme_set_queue_count(struct nvme_ctrl *ctrl, int
> *count);
>  void nvme_start_keep_alive(struct nvme_ctrl *ctrl);
>  void nvme_stop_keep_alive(struct nvme_ctrl *ctrl);
>  int nvme_reset_ctrl(struct nvme_ctrl *ctrl);
> +int nvme_reset_ctrl_sync(struct nvme_ctrl *ctrl);
>  int nvme_delete_ctrl(struct nvme_ctrl *ctrl);
>  int nvme_delete_ctrl_sync(struct nvme_ctrl *ctrl);
> 
> diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c
> index 77200fb89a64..8b116f1ebe66 100644
> --- a/drivers/nvme/host/pci.c
> +++ b/drivers/nvme/host/pci.c
> @@ -2514,7 +2514,7 @@ static void nvme_reset_prepare(struct pci_dev *pdev)
>  static void nvme_reset_done(struct pci_dev *pdev)
>  {
>         struct nvme_dev *dev = pci_get_drvdata(pdev);
> -       nvme_reset_ctrl(&dev->ctrl);
> +       nvme_reset_ctrl_sync(&dev->ctrl);
>  }
> 
>  static void nvme_shutdown(struct pci_dev *pdev)
> --

Yeah, this patch fixes the oops in nvme_suspend_queue().

Thanks,
Ming



More information about the Linux-nvme mailing list