Merge tag 'for-linus-20180608' of git://git.kernel.dk/linux-block
[muen/linux.git] / drivers / nvme / host / pci.c
index d234de5505ea2b19f80f5ed336b63f217195a359..fc33804662e7bd35cfbacd93a26101bf23b3f43d 100644 (file)
@@ -42,7 +42,7 @@ static int use_threaded_interrupts;
 module_param(use_threaded_interrupts, int, 0);
 
 static bool use_cmb_sqes = true;
-module_param(use_cmb_sqes, bool, 0644);
+module_param(use_cmb_sqes, bool, 0444);
 MODULE_PARM_DESC(use_cmb_sqes, "use controller's memory buffer for I/O SQes");
 
 static unsigned int max_host_mem_size_mb = 128;
@@ -920,11 +920,9 @@ static inline void nvme_ring_cq_doorbell(struct nvme_queue *nvmeq)
 {
        u16 head = nvmeq->cq_head;
 
-       if (likely(nvmeq->cq_vector >= 0)) {
-               if (nvme_dbbuf_update_and_check_event(head, nvmeq->dbbuf_cq_db,
-                                                     nvmeq->dbbuf_cq_ei))
-                       writel(head, nvmeq->q_db + nvmeq->dev->db_stride);
-       }
+       if (nvme_dbbuf_update_and_check_event(head, nvmeq->dbbuf_cq_db,
+                                             nvmeq->dbbuf_cq_ei))
+               writel(head, nvmeq->q_db + nvmeq->dev->db_stride);
 }
 
 static inline void nvme_handle_cqe(struct nvme_queue *nvmeq, u16 idx)
@@ -1477,11 +1475,13 @@ static int nvme_create_queue(struct nvme_queue *nvmeq, int qid)
         */
        vector = dev->num_vecs == 1 ? 0 : qid;
        result = adapter_alloc_cq(dev, qid, nvmeq, vector);
-       if (result < 0)
-               goto out;
+       if (result)
+               return result;
 
        result = adapter_alloc_sq(dev, qid, nvmeq);
        if (result < 0)
+               return result;
+       else if (result)
                goto release_cq;
 
        /*
@@ -1503,7 +1503,6 @@ release_sq:
        adapter_delete_sq(dev, qid);
 release_cq:
        adapter_delete_cq(dev, qid);
-out:
        return result;
 }
 
@@ -2012,13 +2011,7 @@ static void nvme_del_cq_end(struct request *req, blk_status_t error)
        if (!error) {
                unsigned long flags;
 
-               /*
-                * We might be called with the AQ cq_lock held
-                * and the I/O queue cq_lock should always
-                * nest inside the AQ one.
-                */
-               spin_lock_irqsave_nested(&nvmeq->cq_lock, flags,
-                                       SINGLE_DEPTH_NESTING);
+               spin_lock_irqsave(&nvmeq->cq_lock, flags);
                nvme_process_cq(nvmeq, &start, &end, -1);
                spin_unlock_irqrestore(&nvmeq->cq_lock, flags);
 
@@ -2231,14 +2224,6 @@ static void nvme_dev_disable(struct nvme_dev *dev, bool shutdown)
        nvme_stop_queues(&dev->ctrl);
 
        if (!dead && dev->ctrl.queue_count > 0) {
-               /*
-                * If the controller is still alive tell it to stop using the
-                * host memory buffer.  In theory the shutdown / reset should
-                * make sure that it doesn't access the host memoery anymore,
-                * but I'd rather be safe than sorry..
-                */
-               if (dev->host_mem_descs)
-                       nvme_set_host_mem(dev, 0);
                nvme_disable_io_queues(dev);
                nvme_disable_admin_queue(dev, shutdown);
        }
@@ -2614,7 +2599,7 @@ static void nvme_remove(struct pci_dev *pdev)
 
        if (!pci_device_is_present(pdev)) {
                nvme_change_ctrl_state(&dev->ctrl, NVME_CTRL_DEAD);
-               nvme_dev_disable(dev, false);
+               nvme_dev_disable(dev, true);
        }
 
        flush_work(&dev->ctrl.reset_work);