From: Dave Airlie <airl...@redhat.com> Signed-off-by: Marc-André Lureau <marcandre.lur...@redhat.com> --- hw/display/virtio-gpu-3d.c | 6 ++++++ hw/display/virtio-gpu.c | 8 ++++++++ include/hw/virtio/virtio-gpu.h | 2 ++ 3 files changed, 16 insertions(+)
diff --git a/hw/display/virtio-gpu-3d.c b/hw/display/virtio-gpu-3d.c index 036d943..6381e78 100644 --- a/hw/display/virtio-gpu-3d.c +++ b/hw/display/virtio-gpu-3d.c @@ -123,11 +123,13 @@ static void virtio_gpu_do_resource_flush(VirtIOGPU *g, { int i; + qemu_mutex_lock(&g->display_info_lock); for (i = 0; i < fl->num_flushes; i++) { virtio_gpu_rect_update(g, fl->idx[i], fl->r.x, fl->r.y, fl->r.width, fl->r.height); } + qemu_mutex_unlock(&g->display_info_lock); } static void virgl_cmd_resource_flush(VirtIOGPU *g, @@ -141,6 +143,7 @@ static void virgl_cmd_resource_flush(VirtIOGPU *g, trace_virtio_gpu_cmd_res_flush(rf.resource_id, rf.r.width, rf.r.height, rf.r.x, rf.r.y); + qemu_mutex_lock(&g->display_info_lock); msg.u.fl.r = rf.r; msg.u.fl.num_flushes = 0; for (i = 0; i < g->conf.max_outputs; i++) { @@ -149,6 +152,7 @@ static void virgl_cmd_resource_flush(VirtIOGPU *g, } msg.u.fl.idx[msg.u.fl.num_flushes++] = i; } + qemu_mutex_unlock(&g->display_info_lock); virtio_gpu_do_resource_flush(g, &msg.u.fl); } @@ -156,6 +160,7 @@ static void virtio_gpu_do_set_scanout(VirtIOGPU *g, struct virtio_gpu_set_scanout_info *info) { + qemu_mutex_lock(&g->display_info_lock); if (info->tex_id) { qemu_console_resize(g->scanout[info->idx].con, info->r.width, info->r.height); @@ -171,6 +176,7 @@ static void virtio_gpu_do_set_scanout(VirtIOGPU *g, 0, 0, 0, 0, 0, 0); } g->scanout[info->idx].resource_id = info->resource_id; + qemu_mutex_unlock(&g->display_info_lock); } static void virgl_cmd_set_scanout(VirtIOGPU *g, diff --git a/hw/display/virtio-gpu.c b/hw/display/virtio-gpu.c index 78b3453..157b9ba 100644 --- a/hw/display/virtio-gpu.c +++ b/hw/display/virtio-gpu.c @@ -102,6 +102,8 @@ static void update_cursor(VirtIOGPU *g, struct virtio_gpu_update_cursor *cursor) if (cursor->pos.scanout_id >= g->conf.max_outputs) { return; } + + qemu_mutex_lock(&g->display_info_lock); s = &g->scanout[cursor->pos.scanout_id]; trace_virtio_gpu_update_cursor(cursor->pos.scanout_id, @@ -131,6 +133,7 @@ static void update_cursor(VirtIOGPU *g, struct virtio_gpu_update_cursor *cursor) } dpy_mouse_set(s->con, cursor->pos.x, cursor->pos.y, cursor->resource_id ? 1 : 0); + qemu_mutex_unlock(&g->display_info_lock); } static void virtio_gpu_get_config(VirtIODevice *vdev, uint8_t *config) @@ -230,6 +233,7 @@ virtio_gpu_fill_display_info(VirtIOGPU *g, { int i; + qemu_mutex_lock(&g->display_info_lock); for (i = 0; i < g->conf.max_outputs; i++) { if (g->enabled_output_bitmask & (1 << i)) { dpy_info->pmodes[i].enabled = 1; @@ -237,6 +241,7 @@ virtio_gpu_fill_display_info(VirtIOGPU *g, dpy_info->pmodes[i].r.height = g->req_state[i].height; } } + qemu_mutex_unlock(&g->display_info_lock); } void virtio_gpu_get_display_info(VirtIOGPU *g, @@ -915,6 +920,7 @@ static int virtio_gpu_ui_info(void *opaque, uint32_t idx, QemuUIInfo *info) return -1; } + qemu_mutex_lock(&g->display_info_lock); g->req_state[idx].x = info->xoff; g->req_state[idx].y = info->yoff; g->req_state[idx].width = info->width; @@ -926,6 +932,7 @@ static int virtio_gpu_ui_info(void *opaque, uint32_t idx, QemuUIInfo *info) g->enabled_output_bitmask &= ~(1 << idx); } + qemu_mutex_unlock(&g->display_info_lock); /* send event to guest */ virtio_gpu_notify_event(g, VIRTIO_GPU_EVENT_DISPLAY); return 0; @@ -1149,6 +1156,7 @@ static void virtio_gpu_device_realize(DeviceState *qdev, Error **errp) QTAILQ_INIT(&g->cmdq); QTAILQ_INIT(&g->fenceq); + qemu_mutex_init(&g->display_info_lock); g->enabled_output_bitmask = 1; g->qdev = qdev; diff --git a/include/hw/virtio/virtio-gpu.h b/include/hw/virtio/virtio-gpu.h index 85d554d..834ef4f 100644 --- a/include/hw/virtio/virtio-gpu.h +++ b/include/hw/virtio/virtio-gpu.h @@ -120,6 +120,8 @@ typedef struct VirtIOGPU { QTAILQ_HEAD(, virtio_gpu_ctrl_command) cmdq; QTAILQ_HEAD(, virtio_gpu_ctrl_command) fenceq; + /* lock protects scanout and req_state */ + QemuMutex display_info_lock; struct virtio_gpu_scanout scanout[VIRTIO_GPU_MAX_SCANOUTS]; struct virtio_gpu_requested_state req_state[VIRTIO_GPU_MAX_SCANOUTS]; -- 2.9.0