diff mbox

[05/18] virtio-gpu: start introducing a lock around the display info

Message ID 20160904222039.11460-6-marcandre.lureau@redhat.com
State New
Headers show

Commit Message

Marc-André Lureau Sept. 4, 2016, 10:20 p.m. UTC
From: Dave Airlie <airlied@redhat.com>

Signed-off-by: Marc-André Lureau <marcandre.lureau@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 mbox

Patch

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];