mirror of https://github.com/proxmox/mirror_qemu
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: Gerd Hoffmann <kraxel@redhat.com>master
parent
dfa9c2a0f4
commit
0b2824e5e4
|
@ -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)
|
||||||
|
|
||||||
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)
|
||||||
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 {
|
||||||
/* 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,
|
||||||
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,
|
||||||
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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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)
|
||||||
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) {
|
||||||
|
|
Loading…
Reference in New Issue