|
@@ -144,11 +144,11 @@ static void virtblk_done(struct virtqueue *vq)
|
|
if (unlikely(virtqueue_is_broken(vq)))
|
|
if (unlikely(virtqueue_is_broken(vq)))
|
|
break;
|
|
break;
|
|
} while (!virtqueue_enable_cb(vq));
|
|
} while (!virtqueue_enable_cb(vq));
|
|
- spin_unlock_irqrestore(&vblk->vq_lock, flags);
|
|
|
|
|
|
|
|
/* In case queue is stopped waiting for more buffers. */
|
|
/* In case queue is stopped waiting for more buffers. */
|
|
if (req_done)
|
|
if (req_done)
|
|
blk_mq_start_stopped_hw_queues(vblk->disk->queue);
|
|
blk_mq_start_stopped_hw_queues(vblk->disk->queue);
|
|
|
|
+ spin_unlock_irqrestore(&vblk->vq_lock, flags);
|
|
}
|
|
}
|
|
|
|
|
|
static int virtio_queue_rq(struct blk_mq_hw_ctx *hctx, struct request *req)
|
|
static int virtio_queue_rq(struct blk_mq_hw_ctx *hctx, struct request *req)
|
|
@@ -202,8 +202,8 @@ static int virtio_queue_rq(struct blk_mq_hw_ctx *hctx, struct request *req)
|
|
err = __virtblk_add_req(vblk->vq, vbr, vbr->sg, num);
|
|
err = __virtblk_add_req(vblk->vq, vbr, vbr->sg, num);
|
|
if (err) {
|
|
if (err) {
|
|
virtqueue_kick(vblk->vq);
|
|
virtqueue_kick(vblk->vq);
|
|
- spin_unlock_irqrestore(&vblk->vq_lock, flags);
|
|
|
|
blk_mq_stop_hw_queue(hctx);
|
|
blk_mq_stop_hw_queue(hctx);
|
|
|
|
+ spin_unlock_irqrestore(&vblk->vq_lock, flags);
|
|
/* Out of mem doesn't actually happen, since we fall back
|
|
/* Out of mem doesn't actually happen, since we fall back
|
|
* to direct descriptors */
|
|
* to direct descriptors */
|
|
if (err == -ENOMEM || err == -ENOSPC)
|
|
if (err == -ENOMEM || err == -ENOSPC)
|