diff options
Diffstat (limited to 'drivers/vhost/vhost.c')
-rw-r--r-- | drivers/vhost/vhost.c | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c index f23cf8956d19..5affce325031 100644 --- a/drivers/vhost/vhost.c +++ b/drivers/vhost/vhost.c | |||
@@ -425,7 +425,7 @@ int vhost_zerocopy_signal_used(struct vhost_virtqueue *vq) | |||
425 | int j = 0; | 425 | int j = 0; |
426 | 426 | ||
427 | for (i = vq->done_idx; i != vq->upend_idx; i = (i + 1) % UIO_MAXIOV) { | 427 | for (i = vq->done_idx; i != vq->upend_idx; i = (i + 1) % UIO_MAXIOV) { |
428 | if ((vq->heads[i].len == VHOST_DMA_DONE_LEN)) { | 428 | if (VHOST_DMA_IS_DONE(vq->heads[i].len)) { |
429 | vq->heads[i].len = VHOST_DMA_CLEAR_LEN; | 429 | vq->heads[i].len = VHOST_DMA_CLEAR_LEN; |
430 | vhost_add_used_and_signal(vq->dev, vq, | 430 | vhost_add_used_and_signal(vq->dev, vq, |
431 | vq->heads[i].id, 0); | 431 | vq->heads[i].id, 0); |
@@ -1600,13 +1600,14 @@ void vhost_ubuf_put_and_wait(struct vhost_ubuf_ref *ubufs) | |||
1600 | kfree(ubufs); | 1600 | kfree(ubufs); |
1601 | } | 1601 | } |
1602 | 1602 | ||
1603 | void vhost_zerocopy_callback(struct ubuf_info *ubuf, bool status) | 1603 | void vhost_zerocopy_callback(struct ubuf_info *ubuf, int status) |
1604 | { | 1604 | { |
1605 | struct vhost_ubuf_ref *ubufs = ubuf->ctx; | 1605 | struct vhost_ubuf_ref *ubufs = ubuf->ctx; |
1606 | struct vhost_virtqueue *vq = ubufs->vq; | 1606 | struct vhost_virtqueue *vq = ubufs->vq; |
1607 | 1607 | ||
1608 | vhost_poll_queue(&vq->poll); | 1608 | vhost_poll_queue(&vq->poll); |
1609 | /* set len to mark this desc buffers done DMA */ | 1609 | /* set len to mark this desc buffers done DMA */ |
1610 | vq->heads[ubuf->desc].len = VHOST_DMA_DONE_LEN; | 1610 | vq->heads[ubuf->desc].len = status ? |
1611 | VHOST_DMA_FAILED_LEN : VHOST_DMA_DONE_LEN; | ||
1611 | kref_put(&ubufs->kref, vhost_zerocopy_done_signal); | 1612 | kref_put(&ubufs->kref, vhost_zerocopy_done_signal); |
1612 | } | 1613 | } |