Commit b7170f94 authored by Gerd Hoffmann's avatar Gerd Hoffmann

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: default avatarGerd Hoffmann <kraxel@redhat.com>
Reviewed-by: default avatarGurchetan Singh <gurchetansingh@chromium.org>
Link: http://patchwork.freedesktop.org/patch/msgid/20200908070723.6394-3-kraxel@redhat.com
parent d6005d3d
...@@ -320,13 +320,13 @@ static struct sg_table *vmalloc_to_sgt(char *data, uint32_t size, int *sg_ents) ...@@ -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, ...@@ -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 @@ static void virtio_gpu_queue_ctrl_sgs(struct virtio_gpu_device *vgdev, ...@@ -373,15 +373,16 @@ static void virtio_gpu_queue_ctrl_sgs(struct virtio_gpu_device *vgdev,
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, ...@@ -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, ...@@ -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) ...@@ -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,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment