From: Wenbo Wang <mail_weber_wang@163.com> To: keith.busch@intel.com, axboe@fb.com Cc: linux-nvme@lists.infradead.org, linux-kernel@vger.kernel.org, wenwei.tao@memblaze.com, Wenbo Wang <mail_weber_wang@163.com>, Wenbo Wang <wenbo.wang@memblaze.com> Subject: [PATCH] NVMe: init nvme queue before enabling irq Date: Tue, 19 Jan 2016 23:57:40 -0500 [thread overview] Message-ID: <1453265860-31080-1-git-send-email-mail_weber_wang@163.com> (raw) During reset process, the nvme_dev->bar (ioremapped) may change, so nvmeq->q_db shall be also updated by nvme_init_queue(). Currently nvmeq irq is enabled before queue init, so a spurious interrupt triggered nvme_process_cq may access nvmeq->q_db just before it is updated, this could cause kernel panic. Signed-off-by: Wenbo Wang <wenbo.wang@memblaze.com> Reviewed-by: Wenwei Tao <wenwei.tao@memblaze.com> --- drivers/nvme/host/pci.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c index f5c0e26..df55f28 100644 --- a/drivers/nvme/host/pci.c +++ b/drivers/nvme/host/pci.c @@ -1590,11 +1590,17 @@ static int nvme_create_queue(struct nvme_queue *nvmeq, int qid) if (result < 0) goto release_cq; + /* + * Init queue door bell ioremap address before enabling irq, if not, + * a spurious interrupt triggered nvme_process_cq may access invalid + * address + */ + nvme_init_queue(nvmeq, qid); + result = queue_request_irq(dev, nvmeq, nvmeq->irqname); if (result < 0) goto release_sq; - nvme_init_queue(nvmeq, qid); return result; release_sq: @@ -1789,6 +1795,8 @@ static int nvme_configure_admin_queue(struct nvme_dev *dev) if (result) goto free_nvmeq; + nvme_init_queue(nvmeq, 0); + nvmeq->cq_vector = 0; result = queue_request_irq(dev, nvmeq, nvmeq->irqname); if (result) { @@ -3164,7 +3172,6 @@ static void nvme_probe_work(struct work_struct *work) goto disable; } - nvme_init_queue(dev->queues[0], 0); result = nvme_alloc_admin_tags(dev); if (result) goto disable; -- 1.8.3.1
WARNING: multiple messages have this Message-ID (diff)
From: mail_weber_wang@163.com (Wenbo Wang) Subject: [PATCH] NVMe: init nvme queue before enabling irq Date: Tue, 19 Jan 2016 23:57:40 -0500 [thread overview] Message-ID: <1453265860-31080-1-git-send-email-mail_weber_wang@163.com> (raw) During reset process, the nvme_dev->bar (ioremapped) may change, so nvmeq->q_db shall be also updated by nvme_init_queue(). Currently nvmeq irq is enabled before queue init, so a spurious interrupt triggered nvme_process_cq may access nvmeq->q_db just before it is updated, this could cause kernel panic. Signed-off-by: Wenbo Wang <wenbo.wang at memblaze.com> Reviewed-by: Wenwei Tao <wenwei.tao at memblaze.com> --- drivers/nvme/host/pci.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c index f5c0e26..df55f28 100644 --- a/drivers/nvme/host/pci.c +++ b/drivers/nvme/host/pci.c @@ -1590,11 +1590,17 @@ static int nvme_create_queue(struct nvme_queue *nvmeq, int qid) if (result < 0) goto release_cq; + /* + * Init queue door bell ioremap address before enabling irq, if not, + * a spurious interrupt triggered nvme_process_cq may access invalid + * address + */ + nvme_init_queue(nvmeq, qid); + result = queue_request_irq(dev, nvmeq, nvmeq->irqname); if (result < 0) goto release_sq; - nvme_init_queue(nvmeq, qid); return result; release_sq: @@ -1789,6 +1795,8 @@ static int nvme_configure_admin_queue(struct nvme_dev *dev) if (result) goto free_nvmeq; + nvme_init_queue(nvmeq, 0); + nvmeq->cq_vector = 0; result = queue_request_irq(dev, nvmeq, nvmeq->irqname); if (result) { @@ -3164,7 +3172,6 @@ static void nvme_probe_work(struct work_struct *work) goto disable; } - nvme_init_queue(dev->queues[0], 0); result = nvme_alloc_admin_tags(dev); if (result) goto disable; -- 1.8.3.1
next reply other threads:[~2016-01-20 4:59 UTC|newest] Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top 2016-01-20 4:57 Wenbo Wang [this message] 2016-01-20 4:57 ` [PATCH] NVMe: init nvme queue before enabling irq Wenbo Wang 2016-01-20 9:06 ` Sagi Grimberg 2016-01-20 9:06 ` Sagi Grimberg 2016-01-20 10:52 ` Wenbo Wang 2016-01-20 9:09 ` Johannes Thumshirn 2016-01-20 9:09 ` Johannes Thumshirn 2016-01-20 9:45 ` Wenbo Wang 2016-01-20 9:56 ` Sagi Grimberg 2016-01-20 9:56 ` Sagi Grimberg 2016-01-20 10:22 ` Johannes Thumshirn 2016-01-20 10:22 ` Johannes Thumshirn 2016-01-20 10:41 ` Wenbo Wang
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=1453265860-31080-1-git-send-email-mail_weber_wang@163.com \ --to=mail_weber_wang@163.com \ --cc=axboe@fb.com \ --cc=keith.busch@intel.com \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-nvme@lists.infradead.org \ --cc=wenbo.wang@memblaze.com \ --cc=wenwei.tao@memblaze.com \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.