[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 05/18] virtio-gpu: start introducing a lock around t
From: |
Marc-André Lureau |
Subject: |
[Qemu-devel] [PATCH 05/18] virtio-gpu: start introducing a lock around the display info |
Date: |
Mon, 5 Sep 2016 02:20:26 +0400 |
From: Dave Airlie <address@hidden>
Signed-off-by: Marc-André Lureau <address@hidden>
---
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
- [Qemu-devel] [PATCH 00/18] virgl: use a seperate rendering thread, Marc-André Lureau, 2016/09/04
- [Qemu-devel] [PATCH 02/18] console: add dpy_gl_ctx_is_mt_safe, Marc-André Lureau, 2016/09/04
- [Qemu-devel] [PATCH 04/18] virtio-gpu: start splitting scanout/resource flushing, Marc-André Lureau, 2016/09/04
- [Qemu-devel] [PATCH 01/18] console: skip same-size resize, Marc-André Lureau, 2016/09/04
- [Qemu-devel] [PATCH 03/18] virtio-gpu: add "iothread" property, Marc-André Lureau, 2016/09/04
- [Qemu-devel] [PATCH 05/18] virtio-gpu: start introducing a lock around the display info,
Marc-André Lureau <=
- [Qemu-devel] [PATCH 06/18] virtio-gpu: create a thread context, Marc-André Lureau, 2016/09/04
- [Qemu-devel] [PATCH 08/18] gl: bind GL api before context creation, Marc-André Lureau, 2016/09/04
- [Qemu-devel] [PATCH 07/18] gl: allow to keep current context in ctx-create, Marc-André Lureau, 2016/09/04
- [Qemu-devel] [PATCH 09/18] bitmap: add a simple foreach util, Marc-André Lureau, 2016/09/04
- [Qemu-devel] [PATCH 11/18] virtio-gpu: use a bh for cursor modifications, Marc-André Lureau, 2016/09/04
- [Qemu-devel] [PATCH 10/18] virtio-blk: use bitmap_foreach, Marc-André Lureau, 2016/09/04
- [Qemu-devel] [PATCH 12/18] virtio-gpu: save a pointer from virtio_gpu_ctrl_command, Marc-André Lureau, 2016/09/04
- [Qemu-devel] [PATCH 14/18] virtio-gpu: batch virtio_notify when using a data-plane, Marc-André Lureau, 2016/09/04
- [Qemu-devel] [PATCH 13/18] virtio-gpu: add a virgl data-plane, Marc-André Lureau, 2016/09/04
- [Qemu-devel] [PATCH 16/18] virtio-gpu: use virgl thread sync with the data-plane, Marc-André Lureau, 2016/09/04