From: vishal.l.verma@intel.com (Verma, Vishal L)
Subject: [PATCH] NVMe: Free admin queue memory on initialisation failure
Date: Fri, 3 Aug 2012 18:18:39 +0000 [thread overview]
Message-ID: <CC4171D4.5004%vishal.l.verma@intel.com> (raw)
In-Reply-To: <1344016895-30103-1-git-send-email-willy@linux.intel.com>
Looks good, thank you for the patch, Matthew.
Vishal
On 8/3/12 12:01 PM, "willy@linux.intel.com" <willy@linux.intel.com> wrote:
>From: Matthew Wilcox <matthew.r.wilcox at intel.com>
>
>If the adapter fails initialisation, the memory allocated for the
>admin queue may not be freed. Split the memory freeing part of
>nvme_free_queue() into nvme_free_queue_mem() and call it in the case of
>initialisation failure.
>
>Signed-off-by: Matthew Wilcox <matthew.r.wilcox at intel.com>
>Reported-by: Vishal Verma <vishal.l.verma at intel.com>
>---
> drivers/block/nvme.c | 28 +++++++++++++++++++---------
> 1 file changed, 19 insertions(+), 9 deletions(-)
>
>diff --git a/drivers/block/nvme.c b/drivers/block/nvme.c
>index 3278fbd..2140370 100644
>--- a/drivers/block/nvme.c
>+++ b/drivers/block/nvme.c
>@@ -868,6 +868,15 @@ static int nvme_set_features(struct nvme_dev *dev,
>unsigned fid,
> return nvme_submit_admin_cmd(dev, &c, result);
> }
>
>+static void nvme_free_queue_mem(struct nvme_queue *nvmeq)
>+{
>+ dma_free_coherent(nvmeq->q_dmadev, CQ_SIZE(nvmeq->q_depth),
>+ (void *)nvmeq->cqes, nvmeq->cq_dma_addr);
>+ dma_free_coherent(nvmeq->q_dmadev, SQ_SIZE(nvmeq->q_depth),
>+ nvmeq->sq_cmds, nvmeq->sq_dma_addr);
>+ kfree(nvmeq);
>+}
>+
> static void nvme_free_queue(struct nvme_dev *dev, int qid)
> {
> struct nvme_queue *nvmeq = dev->queues[qid];
>@@ -882,11 +891,7 @@ static void nvme_free_queue(struct nvme_dev *dev,
>int qid)
> adapter_delete_cq(dev, qid);
> }
>
>- dma_free_coherent(nvmeq->q_dmadev, CQ_SIZE(nvmeq->q_depth),
>- (void *)nvmeq->cqes, nvmeq->cq_dma_addr);
>- dma_free_coherent(nvmeq->q_dmadev, SQ_SIZE(nvmeq->q_depth),
>- nvmeq->sq_cmds, nvmeq->sq_dma_addr);
>- kfree(nvmeq);
>+ nvme_free_queue_mem(nvmeq);
> }
>
> static struct nvme_queue *nvme_alloc_queue(struct nvme_dev *dev, int qid,
>@@ -982,7 +987,7 @@ static __devinit struct nvme_queue
>*nvme_create_queue(struct nvme_dev *dev,
>
> static int __devinit nvme_configure_admin_queue(struct nvme_dev *dev)
> {
>- int result;
>+ int result = 0;
> u32 aqa;
> u64 cap;
> unsigned long timeout;
>@@ -1012,17 +1017,22 @@ static int __devinit
>nvme_configure_admin_queue(struct nvme_dev *dev)
> timeout = ((NVME_CAP_TIMEOUT(cap) + 1) * HZ / 2) + jiffies;
> dev->db_stride = NVME_CAP_STRIDE(cap);
>
>- while (!(readl(&dev->bar->csts) & NVME_CSTS_RDY)) {
>+ while (!result && !(readl(&dev->bar->csts) & NVME_CSTS_RDY)) {
> msleep(100);
> if (fatal_signal_pending(current))
>- return -EINTR;
>+ result = -EINTR;
> if (time_after(jiffies, timeout)) {
> dev_err(&dev->pci_dev->dev,
> "Device not ready; aborting initialisation\n");
>- return -ENODEV;
>+ result = -ENODEV;
> }
> }
>
>+ if (result) {
>+ nvme_free_queue_mem(nvmeq);
>+ return result;
>+ }
>+
> result = queue_request_irq(dev, nvmeq, "nvme admin");
> dev->queues[0] = nvmeq;
> return result;
>--
>1.7.10.4
>
>
>_______________________________________________
>Linux-nvme mailing list
>Linux-nvme at lists.infradead.org
>http://merlin.infradead.org/mailman/listinfo/linux-nvme
prev parent reply other threads:[~2012-08-03 18:18 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-08-03 18:01 [PATCH] NVMe: Free admin queue memory on initialisation failure willy
2012-08-03 18:18 ` Verma, Vishal L [this message]
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=CC4171D4.5004%vishal.l.verma@intel.com \
--to=vishal.l.verma@intel.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: link
Be 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.