提交 dfebfcf0 编写于 作者: A Anthony Liguori

Merge remote-tracking branch 'spice/spice.v50' into staging

* spice/spice.v50:
  spice: fix broken initialization
  hw/qxl.c: Fix compilation failures on 32 bit hosts
  qxl/qxl_render.c: add trace events
  qxl: switch qxl.c to trace-events
  qxl: init_pipe_signaling: exit on failure
  monitor: fix client_migrate_info error handling
  spice: set spice uuid and name
...@@ -31,11 +31,10 @@ static void qxl_blit(PCIQXLDevice *qxl, QXLRect *rect) ...@@ -31,11 +31,10 @@ static void qxl_blit(PCIQXLDevice *qxl, QXLRect *rect)
return; return;
} }
if (!qxl->guest_primary.data) { if (!qxl->guest_primary.data) {
dprint(qxl, 1, "%s: initializing guest_primary.data\n", __func__); trace_qxl_render_blit_guest_primary_initialized();
qxl->guest_primary.data = memory_region_get_ram_ptr(&qxl->vga.vram); qxl->guest_primary.data = memory_region_get_ram_ptr(&qxl->vga.vram);
} }
dprint(qxl, 2, "%s: stride %d, [%d, %d, %d, %d]\n", __func__, trace_qxl_render_blit(qxl->guest_primary.qxl_stride,
qxl->guest_primary.qxl_stride,
rect->left, rect->right, rect->top, rect->bottom); rect->left, rect->right, rect->top, rect->bottom);
src = qxl->guest_primary.data; src = qxl->guest_primary.data;
if (qxl->guest_primary.qxl_stride < 0) { if (qxl->guest_primary.qxl_stride < 0) {
...@@ -107,8 +106,7 @@ static void qxl_render_update_area_unlocked(PCIQXLDevice *qxl) ...@@ -107,8 +106,7 @@ static void qxl_render_update_area_unlocked(PCIQXLDevice *qxl)
qxl->guest_primary.data = memory_region_get_ram_ptr(&qxl->vga.vram); qxl->guest_primary.data = memory_region_get_ram_ptr(&qxl->vga.vram);
qxl_set_rect_to_surface(qxl, &qxl->dirty[0]); qxl_set_rect_to_surface(qxl, &qxl->dirty[0]);
qxl->num_dirty_rects = 1; qxl->num_dirty_rects = 1;
dprint(qxl, 1, "%s: %dx%d, stride %d, bpp %d, depth %d\n", trace_qxl_render_guest_primary_resized(
__FUNCTION__,
qxl->guest_primary.surface.width, qxl->guest_primary.surface.width,
qxl->guest_primary.surface.height, qxl->guest_primary.surface.height,
qxl->guest_primary.qxl_stride, qxl->guest_primary.qxl_stride,
...@@ -118,8 +116,6 @@ static void qxl_render_update_area_unlocked(PCIQXLDevice *qxl) ...@@ -118,8 +116,6 @@ static void qxl_render_update_area_unlocked(PCIQXLDevice *qxl)
if (surface->width != qxl->guest_primary.surface.width || if (surface->width != qxl->guest_primary.surface.width ||
surface->height != qxl->guest_primary.surface.height) { surface->height != qxl->guest_primary.surface.height) {
if (qxl->guest_primary.qxl_stride > 0) { if (qxl->guest_primary.qxl_stride > 0) {
dprint(qxl, 1, "%s: using guest_primary for displaysurface\n",
__func__);
qemu_free_displaysurface(vga->ds); qemu_free_displaysurface(vga->ds);
qemu_create_displaysurface_from(qxl->guest_primary.surface.width, qemu_create_displaysurface_from(qxl->guest_primary.surface.width,
qxl->guest_primary.surface.height, qxl->guest_primary.surface.height,
...@@ -127,8 +123,6 @@ static void qxl_render_update_area_unlocked(PCIQXLDevice *qxl) ...@@ -127,8 +123,6 @@ static void qxl_render_update_area_unlocked(PCIQXLDevice *qxl)
qxl->guest_primary.abs_stride, qxl->guest_primary.abs_stride,
qxl->guest_primary.data); qxl->guest_primary.data);
} else { } else {
dprint(qxl, 1, "%s: resizing displaysurface to guest_primary\n",
__func__);
qemu_resize_displaysurface(vga->ds, qemu_resize_displaysurface(vga->ds,
qxl->guest_primary.surface.width, qxl->guest_primary.surface.width,
qxl->guest_primary.surface.height); qxl->guest_primary.surface.height);
...@@ -187,6 +181,7 @@ void qxl_render_update_area_bh(void *opaque) ...@@ -187,6 +181,7 @@ void qxl_render_update_area_bh(void *opaque)
void qxl_render_update_area_done(PCIQXLDevice *qxl, QXLCookie *cookie) void qxl_render_update_area_done(PCIQXLDevice *qxl, QXLCookie *cookie)
{ {
qemu_mutex_lock(&qxl->ssd.lock); qemu_mutex_lock(&qxl->ssd.lock);
trace_qxl_render_update_area_done(cookie);
qemu_bh_schedule(qxl->update_area_bh); qemu_bh_schedule(qxl->update_area_bh);
qxl->render_update_cookie_num--; qxl->render_update_cookie_num--;
qemu_mutex_unlock(&qxl->ssd.lock); qemu_mutex_unlock(&qxl->ssd.lock);
......
此差异已折叠。
...@@ -880,6 +880,11 @@ static int client_migrate_info(Monitor *mon, const QDict *qdict, ...@@ -880,6 +880,11 @@ static int client_migrate_info(Monitor *mon, const QDict *qdict,
return -1; return -1;
} }
if (port == -1 && tls_port == -1) {
qerror_report(QERR_MISSING_PARAMETER, "port/tls-port");
return -1;
}
ret = qemu_spice_migrate_info(hostname, port, tls_port, subject, ret = qemu_spice_migrate_info(hostname, port, tls_port, subject,
cb, opaque); cb, opaque);
if (ret != 0) { if (ret != 0) {
......
...@@ -722,3 +722,69 @@ displaysurface_resize(void *display_state, void *display_surface, int width, int ...@@ -722,3 +722,69 @@ displaysurface_resize(void *display_state, void *display_surface, int width, int
# vga.c # vga.c
ppm_save(const char *filename, void *display_surface) "%s surface=%p" ppm_save(const char *filename, void *display_surface) "%s surface=%p"
# hw/qxl.c
disable qxl_interface_set_mm_time(int qid, uint32_t mm_time) "%d %d"
disable qxl_io_write_vga(int qid, const char *mode, uint32_t addr, uint32_t val) "%d %s addr=%u val=%u"
qxl_create_guest_primary(int qid, uint32_t width, uint32_t height, uint64_t mem, uint32_t format, uint32_t position) "%d %dx%d mem=%lx %d,%d"
qxl_create_guest_primary_rest(int qid, int32_t stride, uint32_t type, uint32_t flags) "%d %d,%d,%d"
qxl_destroy_primary(int qid) "%d"
qxl_enter_vga_mode(int qid) "%d"
qxl_exit_vga_mode(int qid) "%d"
qxl_hard_reset(int qid, int64_t loadvm) "%d loadvm=%"PRId64""
qxl_interface_async_complete_io(int qid, uint32_t current_async, void *cookie) "%d current=%d cookie=%p"
qxl_interface_attach_worker(int qid) "%d"
qxl_interface_get_init_info(int qid) "%d"
qxl_interface_set_compression_level(int qid, int64_t level) "%d %"PRId64
qxl_interface_update_area_complete(int qid, uint32_t surface_id, uint32_t dirty_left, uint32_t dirty_right, uint32_t dirty_top, uint32_t dirty_bottom) "%d surface=%d [%d,%d,%d,%d]"
qxl_interface_update_area_complete_rest(int qid, uint32_t num_updated_rects) "%d #=%d"
qxl_interface_update_area_complete_overflow(int qid, int max) "%d max=%d"
qxl_interface_update_area_complete_schedule_bh(int qid, uint32_t num_dirty) "%d #dirty=%d"
qxl_io_destroy_primary_ignored(int qid, const char *mode) "%d %s"
qxl_io_read_unexpected(int qid) "%d"
qxl_io_unexpected_vga_mode(int qid, uint32_t io_port, const char *desc) "%d 0x%x (%s)"
qxl_io_write(int qid, const char *mode, uint64_t addr, uint64_t val, unsigned size, int async) "%d %s addr=%"PRIu64 " val=%"PRIu64" size=%u async=%d"
qxl_memslot_add_guest(int qid, uint32_t slot_id, uint64_t guest_start, uint64_t guest_end) "%d %u: guest phys 0x%"PRIx64 " - 0x%" PRIx64
qxl_post_load(int qid, const char *mode) "%d %s"
qxl_pre_load(int qid) "%d"
qxl_pre_save(int qid) "%d"
qxl_reset_surfaces(int qid) "%d"
qxl_ring_command_check(int qid, const char *mode) "%d %s"
qxl_ring_command_get(int qid, const char *mode) "%d %s"
qxl_ring_command_req_notification(int qid) "%d"
qxl_ring_cursor_check(int qid, const char *mode) "%d %s"
qxl_ring_cursor_get(int qid, const char *mode) "%d %s"
qxl_ring_cursor_req_notification(int qid) "%d"
qxl_ring_res_push(int qid, const char *mode, uint32_t surface_count, uint32_t free_res, void *last_release, const char *notify) "%d %s s#=%d res#=%d last=%p notify=%s"
qxl_ring_res_push_rest(int qid, uint32_t ring_has, uint32_t ring_size, uint32_t prod, uint32_t cons) "%d ring %d/%d [%d,%d]"
qxl_ring_res_put(int qid, uint32_t free_res) "%d #res=%d"
qxl_set_mode(int qid, int modenr, uint32_t x_res, uint32_t y_res, uint32_t bits, uint64_t devmem) "%d mode=%d [ x=%d y=%d @ bpp=%d devmem=0x%" PRIx64 " ]"
qxl_soft_reset(int qid) "%d"
qemu_spice_add_memslot(int qid, uint32_t slot_id, unsigned long virt_start, unsigned long virt_end, int async) "%d %u: host virt 0x%lx - 0x%lx async=%d"
qemu_spice_del_memslot(int qid, uint32_t gid, uint32_t slot_id) "%d gid=%u sid=%u"
qemu_spice_create_primary_surface(int qid, uint32_t sid, void *surface, int async) "%d sid=%u surface=%p async=%d"
qemu_spice_destroy_primary_surface(int qid, uint32_t sid, int async) "%d sid=%u async=%d"
qemu_spice_wakeup(uint32_t qid) "%d"
qemu_spice_start(uint32_t qid) "%d"
qemu_spice_stop(uint32_t qid) "%d"
qemu_spice_create_update(uint32_t left, uint32_t right, uint32_t top, uint32_t bottom) "lr %d -> %d, tb -> %d -> %d"
qxl_spice_destroy_surfaces_complete(int qid) "%d"
qxl_spice_destroy_surfaces(int qid, int async) "%d async=%d"
qxl_spice_destroy_surface_wait_complete(int qid, uint32_t id) "%d sid=%d"
qxl_spice_destroy_surface_wait(int qid, uint32_t id, int async) "%d sid=%d async=%d"
qxl_spice_flush_surfaces_async(int qid, uint32_t surface_count, uint32_t num_free_res) "%d s#=%d, res#=%d"
qxl_spice_loadvm_commands(int qid, void *ext, uint32_t count) "%d ext=%p count=%d"
qxl_spice_oom(int qid) "%d"
qxl_spice_reset_cursor(int qid) "%d"
qxl_spice_reset_image_cache(int qid) "%d"
qxl_spice_reset_memslots(int qid) "%d"
qxl_spice_update_area(int qid, uint32_t surface_id, uint32_t left, uint32_t right, uint32_t top, uint32_t bottom) "%d sid=%d [%d,%d,%d,%d]"
qxl_spice_update_area_rest(int qid, uint32_t num_dirty_rects, uint32_t clear_dirty_region) "%d #d=%d clear=%d"
qxl_surfaces_dirty(int qid, int surface, int offset, int size) "%d surface=%d offset=%d size=%d"
qxl_vga_ioport_while_not_in_vga_mode(int qid) "%d (int qid, reset to VGA mode because of VGA io)"
# hw/qxl-render.c
qxl_render_blit_guest_primary_initialized(void) ""
qxl_render_blit(int32_t stride, int32_t left, int32_t right, int32_t top, int32_t bottom) "stride=%d [%d, %d, %d, %d]"
qxl_render_guest_primary_resized(int32_t width, int32_t height, int32_t stride, int32_t bytes_pp, int32_t bits_pp) "%dx%d, stride %d, bpp %d, depth %d"
qxl_render_update_area_done(void *cookie) "%p"
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
#include <spice-experimental.h> #include <spice-experimental.h>
#include <netdb.h> #include <netdb.h>
#include "sysemu.h"
#include "qemu-common.h" #include "qemu-common.h"
#include "qemu-spice.h" #include "qemu-spice.h"
...@@ -553,7 +554,7 @@ void qemu_spice_init(void) ...@@ -553,7 +554,7 @@ void qemu_spice_init(void)
qemu_thread_get_self(&me); qemu_thread_get_self(&me);
if (!opts) { if (!opts) {
return; return;
} }
port = qemu_opt_get_number(opts, "port", 0); port = qemu_opt_get_number(opts, "port", 0);
...@@ -688,6 +689,11 @@ void qemu_spice_init(void) ...@@ -688,6 +689,11 @@ void qemu_spice_init(void)
qemu_opt_foreach(opts, add_channel, &tls_port, 0); qemu_opt_foreach(opts, add_channel, &tls_port, 0);
#if SPICE_SERVER_VERSION >= 0x000a02 /* 0.10.2 */
spice_server_set_name(spice_server, qemu_name);
spice_server_set_uuid(spice_server, qemu_uuid);
#endif
if (0 != spice_server_init(spice_server, &core_interface)) { if (0 != spice_server_init(spice_server, &core_interface)) {
error_report("failed to initialize spice server"); error_report("failed to initialize spice server");
exit(1); exit(1);
...@@ -781,10 +787,3 @@ static void spice_register_config(void) ...@@ -781,10 +787,3 @@ static void spice_register_config(void)
qemu_add_opts(&qemu_spice_opts); qemu_add_opts(&qemu_spice_opts);
} }
machine_init(spice_register_config); machine_init(spice_register_config);
static void spice_register_types(void)
{
qemu_spice_init();
}
type_init(spice_register_types)
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
#include "monitor.h" #include "monitor.h"
#include "console.h" #include "console.h"
#include "sysemu.h" #include "sysemu.h"
#include "trace.h"
#include "spice-display.h" #include "spice-display.h"
...@@ -73,6 +74,10 @@ QXLCookie *qxl_cookie_new(int type, uint64_t io) ...@@ -73,6 +74,10 @@ QXLCookie *qxl_cookie_new(int type, uint64_t io)
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)
{ {
trace_qemu_spice_add_memslot(ssd->qxl.id, memslot->slot_id,
memslot->virt_start, memslot->virt_end,
async);
if (async != QXL_SYNC) { if (async != QXL_SYNC) {
spice_qxl_add_memslot_async(&ssd->qxl, memslot, spice_qxl_add_memslot_async(&ssd->qxl, memslot,
(uint64_t)qxl_cookie_new(QXL_COOKIE_TYPE_IO, (uint64_t)qxl_cookie_new(QXL_COOKIE_TYPE_IO,
...@@ -84,6 +89,7 @@ void qemu_spice_add_memslot(SimpleSpiceDisplay *ssd, QXLDevMemSlot *memslot, ...@@ -84,6 +89,7 @@ void qemu_spice_add_memslot(SimpleSpiceDisplay *ssd, QXLDevMemSlot *memslot,
void qemu_spice_del_memslot(SimpleSpiceDisplay *ssd, uint32_t gid, uint32_t sid) void qemu_spice_del_memslot(SimpleSpiceDisplay *ssd, uint32_t gid, uint32_t sid)
{ {
trace_qemu_spice_del_memslot(ssd->qxl.id, gid, sid);
ssd->worker->del_memslot(ssd->worker, gid, sid); ssd->worker->del_memslot(ssd->worker, gid, sid);
} }
...@@ -91,6 +97,7 @@ void qemu_spice_create_primary_surface(SimpleSpiceDisplay *ssd, uint32_t id, ...@@ -91,6 +97,7 @@ void qemu_spice_create_primary_surface(SimpleSpiceDisplay *ssd, uint32_t id,
QXLDevSurfaceCreate *surface, QXLDevSurfaceCreate *surface,
qxl_async_io async) qxl_async_io async)
{ {
trace_qemu_spice_create_primary_surface(ssd->qxl.id, id, surface, async);
if (async != QXL_SYNC) { if (async != QXL_SYNC) {
spice_qxl_create_primary_surface_async(&ssd->qxl, id, surface, spice_qxl_create_primary_surface_async(&ssd->qxl, id, surface,
(uint64_t)qxl_cookie_new(QXL_COOKIE_TYPE_IO, (uint64_t)qxl_cookie_new(QXL_COOKIE_TYPE_IO,
...@@ -100,10 +107,10 @@ void qemu_spice_create_primary_surface(SimpleSpiceDisplay *ssd, uint32_t id, ...@@ -100,10 +107,10 @@ void qemu_spice_create_primary_surface(SimpleSpiceDisplay *ssd, uint32_t id,
} }
} }
void qemu_spice_destroy_primary_surface(SimpleSpiceDisplay *ssd, void qemu_spice_destroy_primary_surface(SimpleSpiceDisplay *ssd,
uint32_t id, qxl_async_io async) uint32_t id, qxl_async_io async)
{ {
trace_qemu_spice_destroy_primary_surface(ssd->qxl.id, id, async);
if (async != QXL_SYNC) { if (async != QXL_SYNC) {
spice_qxl_destroy_primary_surface_async(&ssd->qxl, id, spice_qxl_destroy_primary_surface_async(&ssd->qxl, id,
(uint64_t)qxl_cookie_new(QXL_COOKIE_TYPE_IO, (uint64_t)qxl_cookie_new(QXL_COOKIE_TYPE_IO,
...@@ -115,16 +122,19 @@ void qemu_spice_destroy_primary_surface(SimpleSpiceDisplay *ssd, ...@@ -115,16 +122,19 @@ void qemu_spice_destroy_primary_surface(SimpleSpiceDisplay *ssd,
void qemu_spice_wakeup(SimpleSpiceDisplay *ssd) void qemu_spice_wakeup(SimpleSpiceDisplay *ssd)
{ {
trace_qemu_spice_wakeup(ssd->qxl.id);
ssd->worker->wakeup(ssd->worker); ssd->worker->wakeup(ssd->worker);
} }
void qemu_spice_start(SimpleSpiceDisplay *ssd) void qemu_spice_start(SimpleSpiceDisplay *ssd)
{ {
trace_qemu_spice_start(ssd->qxl.id);
ssd->worker->start(ssd->worker); ssd->worker->start(ssd->worker);
} }
void qemu_spice_stop(SimpleSpiceDisplay *ssd) void qemu_spice_stop(SimpleSpiceDisplay *ssd)
{ {
trace_qemu_spice_stop(ssd->qxl.id);
ssd->worker->stop(ssd->worker); ssd->worker->stop(ssd->worker);
} }
...@@ -142,7 +152,7 @@ static SimpleSpiceUpdate *qemu_spice_create_update(SimpleSpiceDisplay *ssd) ...@@ -142,7 +152,7 @@ static SimpleSpiceUpdate *qemu_spice_create_update(SimpleSpiceDisplay *ssd)
return NULL; return NULL;
}; };
dprint(2, "%s: lr %d -> %d, tb -> %d -> %d\n", __FUNCTION__, trace_qemu_spice_create_update(
ssd->dirty.left, ssd->dirty.right, ssd->dirty.left, ssd->dirty.right,
ssd->dirty.top, ssd->dirty.bottom); ssd->dirty.top, ssd->dirty.bottom);
......
...@@ -3369,6 +3369,11 @@ int main(int argc, char **argv, char **envp) ...@@ -3369,6 +3369,11 @@ int main(int argc, char **argv, char **envp)
exit(1); exit(1);
} }
#ifdef CONFIG_SPICE
/* spice needs the timers to be initialized by this point */
qemu_spice_init();
#endif
if (icount_option && (kvm_enabled() || xen_enabled())) { if (icount_option && (kvm_enabled() || xen_enabled())) {
fprintf(stderr, "-icount is not allowed with kvm or xen\n"); fprintf(stderr, "-icount is not allowed with kvm or xen\n");
exit(1); exit(1);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册