|
@@ -968,7 +968,8 @@ static void __nvme_process_cq(struct nvme_queue *nvmeq, unsigned int *tag)
|
|
if (head == nvmeq->cq_head && phase == nvmeq->cq_phase)
|
|
if (head == nvmeq->cq_head && phase == nvmeq->cq_phase)
|
|
return;
|
|
return;
|
|
|
|
|
|
- writel(head, nvmeq->q_db + nvmeq->dev->db_stride);
|
|
|
|
|
|
+ if (likely(nvmeq->cq_vector >= 0))
|
|
|
|
+ writel(head, nvmeq->q_db + nvmeq->dev->db_stride);
|
|
nvmeq->cq_head = head;
|
|
nvmeq->cq_head = head;
|
|
nvmeq->cq_phase = phase;
|
|
nvmeq->cq_phase = phase;
|
|
|
|
|
|
@@ -2787,6 +2788,10 @@ static void nvme_del_queue_end(struct nvme_queue *nvmeq)
|
|
{
|
|
{
|
|
struct nvme_delq_ctx *dq = nvmeq->cmdinfo.ctx;
|
|
struct nvme_delq_ctx *dq = nvmeq->cmdinfo.ctx;
|
|
nvme_put_dq(dq);
|
|
nvme_put_dq(dq);
|
|
|
|
+
|
|
|
|
+ spin_lock_irq(&nvmeq->q_lock);
|
|
|
|
+ nvme_process_cq(nvmeq);
|
|
|
|
+ spin_unlock_irq(&nvmeq->q_lock);
|
|
}
|
|
}
|
|
|
|
|
|
static int adapter_async_del_queue(struct nvme_queue *nvmeq, u8 opcode,
|
|
static int adapter_async_del_queue(struct nvme_queue *nvmeq, u8 opcode,
|