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:[email protected]] > Sent: Monday, February 01, 2016 8:42 AM > To: [email protected]; Busch, Keith > Cc: [email protected]; Wenbo Wang; Wenbo Wang; > [email protected] > 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 <[email protected]> > Reviewed-by: Wenwei Tao <[email protected]> > CC: [email protected] > --- > 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

