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>
This commit is contained in:
Marc-André Lureau 2021-02-04 14:52:15 +04:00 committed by Gerd Hoffmann
parent 1f83ea8dbd
commit 72e631c6ac
3 changed files with 12 additions and 6 deletions

View File

@ -246,7 +246,7 @@ vg_ctrl_response(VuGpu *g,
} }
vu_queue_push(&g->dev.parent, cmd->vq, &cmd->elem, s); vu_queue_push(&g->dev.parent, cmd->vq, &cmd->elem, s);
vu_queue_notify(&g->dev.parent, cmd->vq); vu_queue_notify(&g->dev.parent, cmd->vq);
cmd->finished = true; cmd->state = VG_CMD_STATE_FINISHED;
} }
void void
@ -800,7 +800,7 @@ vg_process_cmd(VuGpu *vg, struct virtio_gpu_ctrl_command *cmd)
cmd->error = VIRTIO_GPU_RESP_ERR_UNSPEC; cmd->error = VIRTIO_GPU_RESP_ERR_UNSPEC;
break; break;
} }
if (!cmd->finished) { if (cmd->state == VG_CMD_STATE_NEW) {
vg_ctrl_response_nodata(vg, cmd, cmd->error ? cmd->error : vg_ctrl_response_nodata(vg, cmd, cmd->error ? cmd->error :
VIRTIO_GPU_RESP_OK_NODATA); VIRTIO_GPU_RESP_OK_NODATA);
} }
@ -825,7 +825,7 @@ vg_handle_ctrl(VuDev *dev, int qidx)
} }
cmd->vq = vq; cmd->vq = vq;
cmd->error = 0; cmd->error = 0;
cmd->finished = false; cmd->state = VG_CMD_STATE_NEW;
len = iov_to_buf(cmd->elem.out_sg, cmd->elem.out_num, len = iov_to_buf(cmd->elem.out_sg, cmd->elem.out_num,
0, &cmd->cmd_hdr, sizeof(cmd->cmd_hdr)); 0, &cmd->cmd_hdr, sizeof(cmd->cmd_hdr));
@ -844,7 +844,7 @@ vg_handle_ctrl(VuDev *dev, int qidx)
vg_process_cmd(vg, cmd); vg_process_cmd(vg, cmd);
} }
if (!cmd->finished) { if (cmd->state != VG_CMD_STATE_FINISHED) {
QTAILQ_INSERT_TAIL(&vg->fenceq, cmd, next); QTAILQ_INSERT_TAIL(&vg->fenceq, cmd, next);
vg->inflight++; vg->inflight++;
} else { } else {

View File

@ -482,7 +482,7 @@ void vg_virgl_process_cmd(VuGpu *g, struct virtio_gpu_ctrl_command *cmd)
break; break;
} }
if (cmd->finished) { if (cmd->state != VG_CMD_STATE_NEW) {
return; return;
} }

View File

@ -129,12 +129,18 @@ typedef struct VuGpu {
QTAILQ_HEAD(, virtio_gpu_ctrl_command) fenceq; QTAILQ_HEAD(, virtio_gpu_ctrl_command) fenceq;
} VuGpu; } VuGpu;
enum {
VG_CMD_STATE_NEW,
VG_CMD_STATE_PENDING,
VG_CMD_STATE_FINISHED,
};
struct virtio_gpu_ctrl_command { struct virtio_gpu_ctrl_command {
VuVirtqElement elem; VuVirtqElement elem;
VuVirtq *vq; VuVirtq *vq;
struct virtio_gpu_ctrl_hdr cmd_hdr; struct virtio_gpu_ctrl_hdr cmd_hdr;
uint32_t error; uint32_t error;
bool finished; int state;
QTAILQ_ENTRY(virtio_gpu_ctrl_command) next; QTAILQ_ENTRY(virtio_gpu_ctrl_command) next;
}; };