Merge tag 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mst/vhost
[linux-2.6-block.git] / drivers / block / virtio_blk.c
index 0f39efb4b3aaffa599940a4877230b64b1dbf433..b16a887bbd02a8b7715fb85a812c73f75a2d25fe 100644 (file)
@@ -253,6 +253,20 @@ static void virtblk_done(struct virtqueue *vq)
        spin_unlock_irqrestore(&vblk->vqs[qid].lock, flags);
 }
 
+static void virtio_commit_rqs(struct blk_mq_hw_ctx *hctx)
+{
+       struct virtio_blk *vblk = hctx->queue->queuedata;
+       struct virtio_blk_vq *vq = &vblk->vqs[hctx->queue_num];
+       bool kick;
+
+       spin_lock_irq(&vq->lock);
+       kick = virtqueue_kick_prepare(vq->vq);
+       spin_unlock_irq(&vq->lock);
+
+       if (kick)
+               virtqueue_notify(vq->vq);
+}
+
 static blk_status_t virtio_queue_rq(struct blk_mq_hw_ctx *hctx,
                           const struct blk_mq_queue_data *bd)
 {
@@ -677,7 +691,7 @@ static int virtblk_map_queues(struct blk_mq_tag_set *set)
 {
        struct virtio_blk *vblk = set->driver_data;
 
-       return blk_mq_virtio_map_queues(set, vblk->vdev, 0);
+       return blk_mq_virtio_map_queues(&set->map[0], vblk->vdev, 0);
 }
 
 #ifdef CONFIG_VIRTIO_BLK_SCSI
@@ -691,6 +705,7 @@ static void virtblk_initialize_rq(struct request *req)
 
 static const struct blk_mq_ops virtio_mq_ops = {
        .queue_rq       = virtio_queue_rq,
+       .commit_rqs     = virtio_commit_rqs,
        .complete       = virtblk_request_done,
        .init_request   = virtblk_init_request,
 #ifdef CONFIG_VIRTIO_BLK_SCSI