drm/virtio: return virtio_gpu_queue errors
In case queuing virtio commands fails (can happen when the device got unplugged) pass up the error. Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> Reviewed-by: Gurchetan Singh <gurchetansingh@chromium.org> Link: http://patchwork.freedesktop.org/patch/msgid/20200908070723.6394-3-kraxel@redhat.com
This commit is contained in:
@@ -320,13 +320,13 @@ static struct sg_table *vmalloc_to_sgt(char *data, uint32_t size, int *sg_ents)
|
|||||||
return sgt;
|
return sgt;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void virtio_gpu_queue_ctrl_sgs(struct virtio_gpu_device *vgdev,
|
static int virtio_gpu_queue_ctrl_sgs(struct virtio_gpu_device *vgdev,
|
||||||
struct virtio_gpu_vbuffer *vbuf,
|
struct virtio_gpu_vbuffer *vbuf,
|
||||||
struct virtio_gpu_fence *fence,
|
struct virtio_gpu_fence *fence,
|
||||||
int elemcnt,
|
int elemcnt,
|
||||||
struct scatterlist **sgs,
|
struct scatterlist **sgs,
|
||||||
int outcnt,
|
int outcnt,
|
||||||
int incnt)
|
int incnt)
|
||||||
{
|
{
|
||||||
struct virtqueue *vq = vgdev->ctrlq.vq;
|
struct virtqueue *vq = vgdev->ctrlq.vq;
|
||||||
int ret, idx;
|
int ret, idx;
|
||||||
@@ -335,7 +335,7 @@ static void virtio_gpu_queue_ctrl_sgs(struct virtio_gpu_device *vgdev,
|
|||||||
if (fence && vbuf->objs)
|
if (fence && vbuf->objs)
|
||||||
virtio_gpu_array_unlock_resv(vbuf->objs);
|
virtio_gpu_array_unlock_resv(vbuf->objs);
|
||||||
free_vbuf(vgdev, vbuf);
|
free_vbuf(vgdev, vbuf);
|
||||||
return;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (vgdev->has_indirect)
|
if (vgdev->has_indirect)
|
||||||
@@ -373,15 +373,16 @@ again:
|
|||||||
spin_unlock(&vgdev->ctrlq.qlock);
|
spin_unlock(&vgdev->ctrlq.qlock);
|
||||||
|
|
||||||
drm_dev_exit(idx);
|
drm_dev_exit(idx);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void virtio_gpu_queue_fenced_ctrl_buffer(struct virtio_gpu_device *vgdev,
|
static int virtio_gpu_queue_fenced_ctrl_buffer(struct virtio_gpu_device *vgdev,
|
||||||
struct virtio_gpu_vbuffer *vbuf,
|
struct virtio_gpu_vbuffer *vbuf,
|
||||||
struct virtio_gpu_fence *fence)
|
struct virtio_gpu_fence *fence)
|
||||||
{
|
{
|
||||||
struct scatterlist *sgs[3], vcmd, vout, vresp;
|
struct scatterlist *sgs[3], vcmd, vout, vresp;
|
||||||
struct sg_table *sgt = NULL;
|
struct sg_table *sgt = NULL;
|
||||||
int elemcnt = 0, outcnt = 0, incnt = 0;
|
int elemcnt = 0, outcnt = 0, incnt = 0, ret;
|
||||||
|
|
||||||
/* set up vcmd */
|
/* set up vcmd */
|
||||||
sg_init_one(&vcmd, vbuf->buf, vbuf->size);
|
sg_init_one(&vcmd, vbuf->buf, vbuf->size);
|
||||||
@@ -398,7 +399,7 @@ static void virtio_gpu_queue_fenced_ctrl_buffer(struct virtio_gpu_device *vgdev,
|
|||||||
if (!sgt) {
|
if (!sgt) {
|
||||||
if (fence && vbuf->objs)
|
if (fence && vbuf->objs)
|
||||||
virtio_gpu_array_unlock_resv(vbuf->objs);
|
virtio_gpu_array_unlock_resv(vbuf->objs);
|
||||||
return;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
elemcnt += sg_ents;
|
elemcnt += sg_ents;
|
||||||
@@ -419,13 +420,14 @@ static void virtio_gpu_queue_fenced_ctrl_buffer(struct virtio_gpu_device *vgdev,
|
|||||||
incnt++;
|
incnt++;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtio_gpu_queue_ctrl_sgs(vgdev, vbuf, fence, elemcnt, sgs, outcnt,
|
ret = virtio_gpu_queue_ctrl_sgs(vgdev, vbuf, fence, elemcnt, sgs, outcnt,
|
||||||
incnt);
|
incnt);
|
||||||
|
|
||||||
if (sgt) {
|
if (sgt) {
|
||||||
sg_free_table(sgt);
|
sg_free_table(sgt);
|
||||||
kfree(sgt);
|
kfree(sgt);
|
||||||
}
|
}
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
void virtio_gpu_notify(struct virtio_gpu_device *vgdev)
|
void virtio_gpu_notify(struct virtio_gpu_device *vgdev)
|
||||||
@@ -444,10 +446,10 @@ void virtio_gpu_notify(struct virtio_gpu_device *vgdev)
|
|||||||
virtqueue_notify(vgdev->ctrlq.vq);
|
virtqueue_notify(vgdev->ctrlq.vq);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void virtio_gpu_queue_ctrl_buffer(struct virtio_gpu_device *vgdev,
|
static int virtio_gpu_queue_ctrl_buffer(struct virtio_gpu_device *vgdev,
|
||||||
struct virtio_gpu_vbuffer *vbuf)
|
struct virtio_gpu_vbuffer *vbuf)
|
||||||
{
|
{
|
||||||
virtio_gpu_queue_fenced_ctrl_buffer(vgdev, vbuf, NULL);
|
return virtio_gpu_queue_fenced_ctrl_buffer(vgdev, vbuf, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void virtio_gpu_queue_cursor(struct virtio_gpu_device *vgdev,
|
static void virtio_gpu_queue_cursor(struct virtio_gpu_device *vgdev,
|
||||||
|
Reference in New Issue
Block a user