提交 0b2824e5 编写于 作者: G Gerd Hoffmann

spice: use bottom half instead of refresh timer for cursor updates

Calling directly doesn't work due to the qxl-render code running in
spice server thread context.  Meanwhile bottom half scheduling is
thread-safe though, so we can use that to kick a cursor update in
main i/o thread context.

Cc: Marc-André Lureau <marcandre.lureau@gmail.com>
Signed-off-by: NGerd Hoffmann <kraxel@redhat.com>
上级 dfa9c2a0
...@@ -283,12 +283,14 @@ int qxl_render_cursor(PCIQXLDevice *qxl, QXLCommandExt *ext) ...@@ -283,12 +283,14 @@ int qxl_render_cursor(PCIQXLDevice *qxl, QXLCommandExt *ext)
qxl->ssd.mouse_x = cmd->u.set.position.x; qxl->ssd.mouse_x = cmd->u.set.position.x;
qxl->ssd.mouse_y = cmd->u.set.position.y; qxl->ssd.mouse_y = cmd->u.set.position.y;
qemu_mutex_unlock(&qxl->ssd.lock); qemu_mutex_unlock(&qxl->ssd.lock);
qemu_bh_schedule(qxl->ssd.cursor_bh);
break; break;
case QXL_CURSOR_MOVE: case QXL_CURSOR_MOVE:
qemu_mutex_lock(&qxl->ssd.lock); qemu_mutex_lock(&qxl->ssd.lock);
qxl->ssd.mouse_x = cmd->u.position.x; qxl->ssd.mouse_x = cmd->u.position.x;
qxl->ssd.mouse_y = cmd->u.position.y; qxl->ssd.mouse_y = cmd->u.position.y;
qemu_mutex_unlock(&qxl->ssd.lock); qemu_mutex_unlock(&qxl->ssd.lock);
qemu_bh_schedule(qxl->ssd.cursor_bh);
break; break;
} }
return 0; return 0;
......
...@@ -1861,10 +1861,6 @@ static void display_refresh(DisplayChangeListener *dcl) ...@@ -1861,10 +1861,6 @@ static void display_refresh(DisplayChangeListener *dcl)
if (qxl->mode == QXL_MODE_VGA) { if (qxl->mode == QXL_MODE_VGA) {
qemu_spice_display_refresh(&qxl->ssd); qemu_spice_display_refresh(&qxl->ssd);
} else {
qemu_mutex_lock(&qxl->ssd.lock);
qemu_spice_cursor_refresh_unlocked(&qxl->ssd);
qemu_mutex_unlock(&qxl->ssd.lock);
} }
} }
...@@ -2025,6 +2021,7 @@ static int qxl_init_common(PCIQXLDevice *qxl) ...@@ -2025,6 +2021,7 @@ static int qxl_init_common(PCIQXLDevice *qxl)
qxl_reset_state(qxl); qxl_reset_state(qxl);
qxl->update_area_bh = qemu_bh_new(qxl_render_update_area_bh, qxl); qxl->update_area_bh = qemu_bh_new(qxl_render_update_area_bh, qxl);
qxl->ssd.cursor_bh = qemu_bh_new(qemu_spice_cursor_refresh_bh, &qxl->ssd);
return 0; return 0;
} }
......
...@@ -102,6 +102,7 @@ struct SimpleSpiceDisplay { ...@@ -102,6 +102,7 @@ struct SimpleSpiceDisplay {
/* cursor (with qxl): qxl local renderer -> displaychangelistener */ /* cursor (with qxl): qxl local renderer -> displaychangelistener */
QEMUCursor *cursor; QEMUCursor *cursor;
int mouse_x, mouse_y; int mouse_x, mouse_y;
QEMUBH *cursor_bh;
}; };
struct SimpleSpiceUpdate { struct SimpleSpiceUpdate {
...@@ -134,7 +135,7 @@ void qemu_spice_display_update(SimpleSpiceDisplay *ssd, ...@@ -134,7 +135,7 @@ void qemu_spice_display_update(SimpleSpiceDisplay *ssd,
void qemu_spice_display_switch(SimpleSpiceDisplay *ssd, void qemu_spice_display_switch(SimpleSpiceDisplay *ssd,
DisplaySurface *surface); DisplaySurface *surface);
void qemu_spice_display_refresh(SimpleSpiceDisplay *ssd); void qemu_spice_display_refresh(SimpleSpiceDisplay *ssd);
void qemu_spice_cursor_refresh_unlocked(SimpleSpiceDisplay *ssd); void qemu_spice_cursor_refresh_bh(void *opaque);
void qemu_spice_add_memslot(SimpleSpiceDisplay *ssd, QXLDevMemSlot *memslot, void qemu_spice_add_memslot(SimpleSpiceDisplay *ssd, QXLDevMemSlot *memslot,
qxl_async_io async); qxl_async_io async);
......
...@@ -438,7 +438,7 @@ void qemu_spice_display_switch(SimpleSpiceDisplay *ssd, ...@@ -438,7 +438,7 @@ void qemu_spice_display_switch(SimpleSpiceDisplay *ssd,
ssd->notify++; ssd->notify++;
} }
void qemu_spice_cursor_refresh_unlocked(SimpleSpiceDisplay *ssd) static void qemu_spice_cursor_refresh_unlocked(SimpleSpiceDisplay *ssd)
{ {
if (ssd->cursor) { if (ssd->cursor) {
assert(ssd->dcl.con); assert(ssd->dcl.con);
...@@ -454,6 +454,15 @@ void qemu_spice_cursor_refresh_unlocked(SimpleSpiceDisplay *ssd) ...@@ -454,6 +454,15 @@ void qemu_spice_cursor_refresh_unlocked(SimpleSpiceDisplay *ssd)
} }
} }
void qemu_spice_cursor_refresh_bh(void *opaque)
{
SimpleSpiceDisplay *ssd = opaque;
qemu_mutex_lock(&ssd->lock);
qemu_spice_cursor_refresh_unlocked(ssd);
qemu_mutex_unlock(&ssd->lock);
}
void qemu_spice_display_refresh(SimpleSpiceDisplay *ssd) void qemu_spice_display_refresh(SimpleSpiceDisplay *ssd)
{ {
dprint(3, "%s/%d:\n", __func__, ssd->qxl.id); dprint(3, "%s/%d:\n", __func__, ssd->qxl.id);
...@@ -464,7 +473,6 @@ void qemu_spice_display_refresh(SimpleSpiceDisplay *ssd) ...@@ -464,7 +473,6 @@ void qemu_spice_display_refresh(SimpleSpiceDisplay *ssd)
qemu_spice_create_update(ssd); qemu_spice_create_update(ssd);
ssd->notify++; ssd->notify++;
} }
qemu_spice_cursor_refresh_unlocked(ssd);
qemu_mutex_unlock(&ssd->lock); qemu_mutex_unlock(&ssd->lock);
if (ssd->notify) { if (ssd->notify) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册