summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarc-André Lureau2021-02-04 11:52:15 +0100
committerGerd Hoffmann2021-02-04 15:58:54 +0100
commit72e631c6ac72363924f6c7030a99a7900d15451e (patch)
tree0e15e514be6dad1ab8a00ab82245907a33950631
parentvhost-user-gpu: handle vhost-user-gpu features in a callback (diff)
downloadqemu-72e631c6ac72363924f6c7030a99a7900d15451e.tar.gz
qemu-72e631c6ac72363924f6c7030a99a7900d15451e.tar.xz
qemu-72e631c6ac72363924f6c7030a99a7900d15451e.zip
vhost-user-gpu: use an extandable state enum for commands
Introduce a pending state for commands which aren't finished yet, but are being handled. See following patch. Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com> Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com> Message-Id: <20210204105232.834642-4-marcandre.lureau@redhat.com> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
-rw-r--r--contrib/vhost-user-gpu/vhost-user-gpu.c8
-rw-r--r--contrib/vhost-user-gpu/virgl.c2
-rw-r--r--contrib/vhost-user-gpu/vugpu.h8
3 files changed, 12 insertions, 6 deletions
diff --git a/contrib/vhost-user-gpu/vhost-user-gpu.c b/contrib/vhost-user-gpu/vhost-user-gpu.c
index 85c16404fb..7dcc02966c 100644
--- a/contrib/vhost-user-gpu/vhost-user-gpu.c
+++ b/contrib/vhost-user-gpu/vhost-user-gpu.c
@@ -246,7 +246,7 @@ vg_ctrl_response(VuGpu *g,
}
vu_queue_push(&g->dev.parent, cmd->vq, &cmd->elem, s);
vu_queue_notify(&g->dev.parent, cmd->vq);
- cmd->finished = true;
+ cmd->state = VG_CMD_STATE_FINISHED;
}
void
@@ -800,7 +800,7 @@ vg_process_cmd(VuGpu *vg, struct virtio_gpu_ctrl_command *cmd)
cmd->error = VIRTIO_GPU_RESP_ERR_UNSPEC;
break;
}
- if (!cmd->finished) {
+ if (cmd->state == VG_CMD_STATE_NEW) {
vg_ctrl_response_nodata(vg, cmd, cmd->error ? cmd->error :
VIRTIO_GPU_RESP_OK_NODATA);
}
@@ -825,7 +825,7 @@ vg_handle_ctrl(VuDev *dev, int qidx)
}
cmd->vq = vq;
cmd->error = 0;
- cmd->finished = false;
+ cmd->state = VG_CMD_STATE_NEW;
len = iov_to_buf(cmd->elem.out_sg, cmd->elem.out_num,
0, &cmd->cmd_hdr, sizeof(cmd->cmd_hdr));
@@ -844,7 +844,7 @@ vg_handle_ctrl(VuDev *dev, int qidx)
vg_process_cmd(vg, cmd);
}
- if (!cmd->finished) {
+ if (cmd->state != VG_CMD_STATE_FINISHED) {
QTAILQ_INSERT_TAIL(&vg->fenceq, cmd, next);
vg->inflight++;
} else {
diff --git a/contrib/vhost-user-gpu/virgl.c b/contrib/vhost-user-gpu/virgl.c
index e647278052..8bb3c563d9 100644
--- a/contrib/vhost-user-gpu/virgl.c
+++ b/contrib/vhost-user-gpu/virgl.c
@@ -482,7 +482,7 @@ void vg_virgl_process_cmd(VuGpu *g, struct virtio_gpu_ctrl_command *cmd)
break;
}
- if (cmd->finished) {
+ if (cmd->state != VG_CMD_STATE_NEW) {
return;
}
diff --git a/contrib/vhost-user-gpu/vugpu.h b/contrib/vhost-user-gpu/vugpu.h
index 86f3ac86aa..04d5615812 100644
--- a/contrib/vhost-user-gpu/vugpu.h
+++ b/contrib/vhost-user-gpu/vugpu.h
@@ -129,12 +129,18 @@ typedef struct VuGpu {
QTAILQ_HEAD(, virtio_gpu_ctrl_command) fenceq;
} VuGpu;
+enum {
+ VG_CMD_STATE_NEW,
+ VG_CMD_STATE_PENDING,
+ VG_CMD_STATE_FINISHED,
+};
+
struct virtio_gpu_ctrl_command {
VuVirtqElement elem;
VuVirtq *vq;
struct virtio_gpu_ctrl_hdr cmd_hdr;
uint32_t error;
- bool finished;
+ int state;
QTAILQ_ENTRY(virtio_gpu_ctrl_command) next;
};