diff options
author | Anthony Liguori <aliguori@us.ibm.com> | 2013-04-16 10:28:51 -0500 |
---|---|---|
committer | Anthony Liguori <aliguori@us.ibm.com> | 2013-04-16 10:28:51 -0500 |
commit | 6f8111a16d9cb3744a7b05726df28ee8cb6d8d30 (patch) | |
tree | d12f2b812fa9df96b0418e04b2463e6f44294ced /hw | |
parent | 100c533220d70ae9732ba63142d71d1c48688f54 (diff) | |
parent | 75c439bc65c07d76f5e74c734ed5432bc6114a3b (diff) |
Merge remote-tracking branch 'spice/spice.v69' into staging
# By Hans de Goede (5) and others
# Via Gerd Hoffmann
* spice/spice.v69:
spice-qemu-char: vmc_write: Don't write more bytes then we're asked too
spice-qemu-char: Remove intermediate buffer
spice-qemu-char: Add watch support
spice-qemu-char: Remove #ifdef-ed code for old spice-server compat
virtio-console: Remove any pending watches on close
virtio-console: Also throttle when less was written then requested
spice: (32 bit only) fix surface cmd tracking destruction
qxl: add 2000x2000 and 2048x2048 video modes
qxl: add 4k + 8k resolutions
Message-id: 1366106194-28826-1-git-send-email-kraxel@redhat.com
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
Diffstat (limited to 'hw')
-rw-r--r-- | hw/char/virtio-console.c | 32 | ||||
-rw-r--r-- | hw/display/qxl.c | 8 |
2 files changed, 34 insertions, 6 deletions
diff --git a/hw/char/virtio-console.c b/hw/char/virtio-console.c index 50350303cd..6759e514a6 100644 --- a/hw/char/virtio-console.c +++ b/hw/char/virtio-console.c @@ -18,6 +18,7 @@ typedef struct VirtConsole { VirtIOSerialPort port; CharDriverState *chr; + guint watch; } VirtConsole; /* @@ -29,12 +30,14 @@ static gboolean chr_write_unblocked(GIOChannel *chan, GIOCondition cond, { VirtConsole *vcon = opaque; + vcon->watch = 0; virtio_serial_throttle_port(&vcon->port, false); return FALSE; } /* Callback function that's called when the guest sends us data */ -static ssize_t flush_buf(VirtIOSerialPort *port, const uint8_t *buf, size_t len) +static ssize_t flush_buf(VirtIOSerialPort *port, + const uint8_t *buf, ssize_t len) { VirtConsole *vcon = DO_UPCAST(VirtConsole, port, port); ssize_t ret; @@ -47,7 +50,7 @@ static ssize_t flush_buf(VirtIOSerialPort *port, const uint8_t *buf, size_t len) ret = qemu_chr_fe_write(vcon->chr, buf, len); trace_virtio_console_flush_buf(port->id, len, ret); - if (ret <= 0) { + if (ret < len) { VirtIOSerialPortClass *k = VIRTIO_SERIAL_PORT_GET_CLASS(port); /* @@ -56,11 +59,14 @@ static ssize_t flush_buf(VirtIOSerialPort *port, const uint8_t *buf, size_t len) * we had a finer-grained message, like -EPIPE, we could close * this connection. */ - ret = 0; + if (ret < 0) + ret = 0; if (!k->is_console) { virtio_serial_throttle_port(port, true); - qemu_chr_fe_add_watch(vcon->chr, G_IO_OUT, chr_write_unblocked, - vcon); + if (!vcon->watch) { + vcon->watch = qemu_chr_fe_add_watch(vcon->chr, G_IO_OUT, + chr_write_unblocked, vcon); + } } } return ret; @@ -104,6 +110,10 @@ static void chr_event(void *opaque, int event) virtio_serial_open(&vcon->port); break; case CHR_EVENT_CLOSED: + if (vcon->watch) { + g_source_remove(vcon->watch); + vcon->watch = 0; + } virtio_serial_close(&vcon->port); break; } @@ -128,6 +138,17 @@ static int virtconsole_initfn(VirtIOSerialPort *port) return 0; } +static int virtconsole_exitfn(VirtIOSerialPort *port) +{ + VirtConsole *vcon = DO_UPCAST(VirtConsole, port, port); + + if (vcon->watch) { + g_source_remove(vcon->watch); + } + + return 0; +} + static Property virtconsole_properties[] = { DEFINE_PROP_CHR("chardev", VirtConsole, chr), DEFINE_PROP_END_OF_LIST(), @@ -140,6 +161,7 @@ static void virtconsole_class_init(ObjectClass *klass, void *data) k->is_console = true; k->init = virtconsole_initfn; + k->exit = virtconsole_exitfn; k->have_data = flush_buf; k->set_guest_connected = set_guest_connected; dc->props = virtconsole_properties; diff --git a/hw/display/qxl.c b/hw/display/qxl.c index 437f8d0eee..e679830fed 100644 --- a/hw/display/qxl.c +++ b/hw/display/qxl.c @@ -109,13 +109,19 @@ static QXLMode qxl_modes[] = { /* these modes need more than 8 MB video memory */ QXL_MODE_EX(1920, 1200), QXL_MODE_EX(1920, 1440), + QXL_MODE_EX(2000, 2000), QXL_MODE_EX(2048, 1536), + QXL_MODE_EX(2048, 2048), QXL_MODE_EX(2560, 1440), QXL_MODE_EX(2560, 1600), /* these modes need more than 16 MB video memory */ QXL_MODE_EX(2560, 2048), QXL_MODE_EX(2800, 2100), QXL_MODE_EX(3200, 2400), + QXL_MODE_EX(3840, 2160), /* 4k mainstream */ + QXL_MODE_EX(4096, 2160), /* 4k */ + QXL_MODE_EX(7680, 4320), /* 8k mainstream */ + QXL_MODE_EX(8192, 4320), /* 8k */ }; static void qxl_send_events(PCIQXLDevice *d, uint32_t events); @@ -224,7 +230,7 @@ static void qxl_spice_destroy_surfaces_complete(PCIQXLDevice *qxl) trace_qxl_spice_destroy_surfaces_complete(qxl->id); qemu_mutex_lock(&qxl->track_lock); memset(qxl->guest_surfaces.cmds, 0, - sizeof(qxl->guest_surfaces.cmds) * qxl->ssd.num_surfaces); + sizeof(qxl->guest_surfaces.cmds[0]) * qxl->ssd.num_surfaces); qxl->guest_surfaces.count = 0; qemu_mutex_unlock(&qxl->track_lock); } |