RE: [PATCH] NVMe: do not touch sq door bell if nvmeq has been suspended
From: Busch, Keith
Date: Mon Feb 01 2016 - 10:59:47 EST
Does this ever happen? The queue should be stopped before the bar is unmapped. If that's insufficient to guard against this, we've another problem this patch does not cover. That command will just timeout since it was accepted by the driver, but not actually submitted to anything. The request needs to be requeued or return BLK_MQ_RQ_QUEUE_BUSY.
> -----Original Message-----
> From: Wenbo Wang [mailto:mail_weber_wang@xxxxxxx]
> Sent: Monday, February 01, 2016 8:42 AM
> To: axboe@xxxxxx; Busch, Keith
> Cc: linux-kernel@xxxxxxxxxxxxxxx; Wenbo Wang; Wenbo Wang; linux-nvme@xxxxxxxxxxxxxxxxxxx
> Subject: [PATCH] NVMe: do not touch sq door bell if nvmeq has been suspended
>
> If __nvme_submit_cmd races with nvme_dev_disable, nvmeq
> could have been suspended and dev->bar could have been
> unmapped. Do not touch sq door bell in this case.
>
> Signed-off-by: Wenbo Wang <wenbo.wang@xxxxxxxxxxxx>
> Reviewed-by: Wenwei Tao <wenwei.tao@xxxxxxxxxxxx>
> CC: linux-nvme@xxxxxxxxxxxxxxxxxxx
> ---
> drivers/nvme/host/pci.c | 3 ++-
> 1 file changed, 2 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c
> index 8b1a725..2288712 100644
> --- a/drivers/nvme/host/pci.c
> +++ b/drivers/nvme/host/pci.c
> @@ -325,7 +325,8 @@ static void __nvme_submit_cmd(struct nvme_queue *nvmeq,
>
> if (++tail == nvmeq->q_depth)
> tail = 0;
> - writel(tail, nvmeq->q_db);
> + if (likely(nvmeq->cq_vector >= 0))
> + writel(tail, nvmeq->q_db);
> nvmeq->sq_tail = tail;
> }
>
> --
> 1.8.3.1