aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/block/virtio_blk.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/drivers/block/virtio_blk.c b/drivers/block/virtio_blk.c
index c8f286e8d80f..f63d358f3d93 100644
--- a/drivers/block/virtio_blk.c
+++ b/drivers/block/virtio_blk.c
@@ -162,6 +162,7 @@ static int virtio_queue_rq(struct blk_mq_hw_ctx *hctx, struct request *req)
162 unsigned int num; 162 unsigned int num;
163 const bool last = (req->cmd_flags & REQ_END) != 0; 163 const bool last = (req->cmd_flags & REQ_END) != 0;
164 int err; 164 int err;
165 bool notify = false;
165 166
166 BUG_ON(req->nr_phys_segments + 2 > vblk->sg_elems); 167 BUG_ON(req->nr_phys_segments + 2 > vblk->sg_elems);
167 168
@@ -214,10 +215,12 @@ static int virtio_queue_rq(struct blk_mq_hw_ctx *hctx, struct request *req)
214 return BLK_MQ_RQ_QUEUE_ERROR; 215 return BLK_MQ_RQ_QUEUE_ERROR;
215 } 216 }
216 217
217 if (last) 218 if (last && virtqueue_kick_prepare(vblk->vq))
218 virtqueue_kick(vblk->vq); 219 notify = true;
219
220 spin_unlock_irqrestore(&vblk->vq_lock, flags); 220 spin_unlock_irqrestore(&vblk->vq_lock, flags);
221
222 if (notify)
223 virtqueue_notify(vblk->vq);
221 return BLK_MQ_RQ_QUEUE_OK; 224 return BLK_MQ_RQ_QUEUE_OK;
222} 225}
223 226