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:
		
							parent
							
								
									1f83ea8dbd
								
							
						
					
					
						commit
						72e631c6ac
					
				@ -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 {
 | 
			
		||||
 | 
			
		||||
@ -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;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -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;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user