]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blobdiff - drivers/block/virtio_blk.c
block: virtio_blk: don't hold spin lock during world switch
[mirror_ubuntu-bionic-kernel.git] / drivers / block / virtio_blk.c
index c8f286e8d80f8e78acf1c7f59cee3ef583c2a50a..f63d358f3d933be8b2ec7a7eec0dbaec296796be 100644 (file)
@@ -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;
 }