|
@@ -162,6 +162,7 @@ static int virtio_queue_rq(struct blk_mq_hw_ctx *hctx, struct request *req)
|
|
|
unsigned int num;
|
|
|
const bool last = (req->cmd_flags & REQ_END) != 0;
|
|
|
int err;
|
|
|
+ bool notify = false;
|
|
|
|
|
|
BUG_ON(req->nr_phys_segments + 2 > vblk->sg_elems);
|
|
|
|
|
@@ -214,10 +215,12 @@ static int virtio_queue_rq(struct blk_mq_hw_ctx *hctx, struct request *req)
|
|
|
return BLK_MQ_RQ_QUEUE_ERROR;
|
|
|
}
|
|
|
|
|
|
- if (last)
|
|
|
- virtqueue_kick(vblk->vq);
|
|
|
-
|
|
|
+ if (last && virtqueue_kick_prepare(vblk->vq))
|
|
|
+ notify = true;
|
|
|
spin_unlock_irqrestore(&vblk->vq_lock, flags);
|
|
|
+
|
|
|
+ if (notify)
|
|
|
+ virtqueue_notify(vblk->vq);
|
|
|
return BLK_MQ_RQ_QUEUE_OK;
|
|
|
}
|
|
|
|