From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:33246) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UpPBT-0007zR-8P for qemu-devel@nongnu.org; Wed, 19 Jun 2013 16:40:52 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1UpPBQ-0004cX-W9 for qemu-devel@nongnu.org; Wed, 19 Jun 2013 16:40:51 -0400 Received: from e7.ny.us.ibm.com ([32.97.182.137]:48172) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UpPBQ-0004cO-Jt for qemu-devel@nongnu.org; Wed, 19 Jun 2013 16:40:48 -0400 Received: from /spool/local by e7.ny.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Wed, 19 Jun 2013 16:40:48 -0400 From: Anthony Liguori Date: Wed, 19 Jun 2013 15:40:24 -0500 Message-Id: <1371674435-14973-2-git-send-email-aliguori@us.ibm.com> In-Reply-To: <1371674435-14973-1-git-send-email-aliguori@us.ibm.com> References: <1371674435-14973-1-git-send-email-aliguori@us.ibm.com> Subject: [Qemu-devel] [PATCH 01/12] chardev: ringbuf: add optional save parameter to save state List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Anthony Liguori , Alexey Kardashevskiy , Alex Graf , qemu-ppc@nongnu.org, Paul Mackerras , Andreas Faerber It is very useful to use the ringbuf chardev for writing test cases and even more useful if the state of the ringbuf is migrated with the guest. Otherwise it's hard to detect data loss in a test case. Signed-off-by: Anthony Liguori --- qapi-schema.json | 3 ++- qemu-char.c | 45 +++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 45 insertions(+), 3 deletions(-) diff --git a/qapi-schema.json b/qapi-schema.json index a80ee40..90602d1 100644 --- a/qapi-schema.json +++ b/qapi-schema.json @@ -3280,10 +3280,11 @@ # Configuration info for memory chardevs # # @size: #optional Ringbuffer size, must be power of two, default is 65536 +# @save: #optional Register a savevm handler, default false # # Since: 1.5 ## -{ 'type': 'ChardevMemory', 'data': { '*size' : 'int' } } +{ 'type': 'ChardevMemory', 'data': { '*size' : 'int', '*save': 'bool' } } ## # @ChardevBackend: diff --git a/qemu-char.c b/qemu-char.c index 2c3cfe6..87ba24f 100644 --- a/qemu-char.c +++ b/qemu-char.c @@ -2793,7 +2793,32 @@ static void ringbuf_chr_close(struct CharDriverState *chr) chr->opaque = NULL; } -static CharDriverState *qemu_chr_open_memory(ChardevMemory *opts, +static void ringbuf_save(QEMUFile *f, void *opaque) +{ + CharDriverState *chr = opaque; + RingBufCharDriver *d = chr->opaque; + + qemu_put_be32(f, d->prod); + qemu_put_be32(f, d->cons); + qemu_put_be32(f, d->size); + qemu_put_buffer(f, d->cbuf, d->size); +} + +static int ringbuf_load(QEMUFile *f, void *opaque, int version_id) +{ + CharDriverState *chr = opaque; + RingBufCharDriver *d = chr->opaque; + + d->prod = qemu_get_be32(f); + d->cons = qemu_get_be32(f); + d->size = qemu_get_be32(f); + qemu_get_buffer(f, d->cbuf, d->size); + + return 0; +} + +static CharDriverState *qemu_chr_open_memory(const char *id, + ChardevMemory *opts, Error **errp) { CharDriverState *chr; @@ -2804,6 +2829,14 @@ static CharDriverState *qemu_chr_open_memory(ChardevMemory *opts, d->size = opts->has_size ? opts->size : 65536; + if (opts->has_save && opts->save) { + char *idstr; + + g_assert(id != NULL); + idstr = g_strdup_printf("memchar-%s", id); + register_savevm(NULL, idstr, 0, 1, ringbuf_save, ringbuf_load, chr); + } + /* The size must be power of 2 */ if (d->size & (d->size - 1)) { error_setg(errp, "size of memory chardev must be power of two"); @@ -3120,6 +3153,11 @@ static void qemu_chr_parse_memory(QemuOpts *opts, ChardevBackend *backend, backend->memory->has_size = true; backend->memory->size = val; } + + if (qemu_opt_get_bool(opts, "save", false)) { + backend->memory->has_save = true; + backend->memory->save = true; + } } typedef struct CharDriver { @@ -3489,6 +3527,9 @@ QemuOptsList qemu_chardev_opts = { },{ .name = "size", .type = QEMU_OPT_SIZE, + }, { + .name = "save", + .type = QEMU_OPT_BOOL, }, { /* end of list */ } }, @@ -3711,7 +3752,7 @@ ChardevReturn *qmp_chardev_add(const char *id, ChardevBackend *backend, chr = vc_init(backend->vc); break; case CHARDEV_BACKEND_KIND_MEMORY: - chr = qemu_chr_open_memory(backend->memory, errp); + chr = qemu_chr_open_memory(id, backend->memory, errp); break; default: error_setg(errp, "unknown chardev backend (%d)", backend->kind); -- 1.8.0