lkml.org 
[lkml]   [2018]   [Jun]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH 4.4] nvme-pci: initialize queue memory before interrupts
    From: Keith Busch <keith.busch@intel.com>

    commit 161b8be2bd6abad250d4b3f674bdd5480f15beeb upstream.

    A spurious interrupt before the nvme driver has initialized the completion
    queue may inadvertently cause the driver to believe it has a completion
    to process. This may result in a NULL dereference since the nvmeq's tags
    are not set at this point.

    The patch initializes the host's CQ memory so that a spurious interrupt
    isn't mistaken for a real completion.

    Signed-off-by: Keith Busch <keith.busch@intel.com>
    Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de>
    Signed-off-by: Christoph Hellwig <hch@lst.de>
    [bwh: Backported to 4.4: adjust context]
    Signed-off-by: Jens Axboe <axboe@kernel.dk>
    ---
    drivers/nvme/host/pci.c | 4 ++--
    1 file changed, 2 insertions(+), 2 deletions(-)

    diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c
    index e86fcc9e9852..01f47b68b6e7 100644
    --- a/drivers/nvme/host/pci.c
    +++ b/drivers/nvme/host/pci.c
    @@ -1589,11 +1589,11 @@ static int nvme_create_queue(struct nvme_queue *nvmeq, int qid)
    if (result < 0)
    goto release_cq;

    + 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:
    @@ -1797,6 +1797,7 @@ static int nvme_configure_admin_queue(struct nvme_dev *dev)
    goto free_nvmeq;

    nvmeq->cq_vector = 0;
    + nvme_init_queue(nvmeq, 0);
    result = queue_request_irq(dev, nvmeq, nvmeq->irqname);
    if (result) {
    nvmeq->cq_vector = -1;
    @@ -3165,7 +3166,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;
    --
    Ben Hutchings, Software Developer Codethink Ltd
    https://www.codethink.co.uk/ Dale House, 35 Dale Street
    Manchester, M1 2HF, United Kingdom
    \
     
     \ /
      Last update: 2018-06-19 19:24    [W:4.466 / U:0.348 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site