From: Igor Mitsyanko <i.mitsyanko@samsung.com>
To: Peter Maydell <peter.maydell@linaro.org>
Cc: Juan Quintela <quintela@redhat.com>,
qemu-devel@nongnu.org, patches@linaro.org
Subject: Re: [Qemu-devel] [PATCH] vmstate: Add support for saving/loading bitmaps
Date: Fri, 10 Aug 2012 20:22:15 +0400 [thread overview]
Message-ID: <50253537.1070003@samsung.com> (raw)
In-Reply-To: <1344513263-22971-1-git-send-email-peter.maydell@linaro.org>
On 08/09/2012 03:54 PM, Peter Maydell wrote:
> Add support for saving/loading bitmap.h bitmaps in vmstate.
>
> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
> ---
> This will be needed for saving/restoring the bitmap in sd.c which
> is introduced by Igor's latest patchset; the relevant VMSTATE line is:
> VMSTATE_BITMAP(wp_groups, SDState, 1, wpgrps_size),
> (and you'll need to make wpgrps_size an int32_t, not uint32_t).
>
> Igor: I've only tested this fairly lightly, you'll probably want to
> do things like testing save on 32 bit and load on 64 bit and
> vice-versa.
>
> savevm.c | 41 +++++++++++++++++++++++++++++++++++++++++
> vmstate.h | 13 +++++++++++++
> 2 files changed, 54 insertions(+)
>
> diff --git a/savevm.c b/savevm.c
> index 6e82b2d..0e2de97 100644
> --- a/savevm.c
> +++ b/savevm.c
> @@ -86,6 +86,7 @@
> #include "memory.h"
> #include "qmp-commands.h"
> #include "trace.h"
> +#include "bitops.h"
>
> #define SELF_ANNOUNCE_ROUNDS 5
>
> @@ -1159,6 +1160,46 @@ const VMStateInfo vmstate_info_unused_buffer = {
> .put = put_unused_buffer,
> };
>
> +/* bitmaps (as defined by bitmap.h). Note that size here is the size
> + * of the bitmap in bits. The on-the-wire format of a bitmap is 64
> + * bit words with the bits in big endian order. The in-memory format
> + * is an array of 'unsigned long', which may be either 32 or 64 bits.
> + */
> +/* This is the number of 64 bit words sent over the wire */
> +#define BITS_TO_U64S(nr) DIV_ROUND_UP(nr, 64)
> +static int get_bitmap(QEMUFile *f, void *pv, size_t size)
> +{
> + unsigned long *bmp = pv;
> + int i, idx = 0;
> + for (i = 0; i < BITS_TO_U64S(size); i++) {
> + uint64_t w = qemu_get_be64(f);
> + bmp[idx++] = w;
> + if (sizeof(unsigned long) == 4 && idx < BITS_TO_LONGS(size)) {
> + bmp[idx++] = w >> 32;
> + }
> + }
> + return 0;
> +}
> +
> +static void put_bitmap(QEMUFile *f, void *pv, size_t size)
> +{
> + unsigned long *bmp = pv;
> + int i, idx = 0;
> + for (i = 0; i < BITS_TO_U64S(size); i++) {
> + uint64_t w = bmp[idx++];
> + if (sizeof(unsigned long) == 4 && idx < BITS_TO_LONGS(size)) {
> + w |= ((uint64_t)bmp[idx++]) << 32;
> + }
> + qemu_put_be64(f, w);
> + }
> +}
> +
> +const VMStateInfo vmstate_info_bitmap = {
> + .name = "bitmap",
> + .get = get_bitmap,
> + .put = put_bitmap,
> +};
> +
> typedef struct CompatEntry {
> char idstr[256];
> int instance_id;
> diff --git a/vmstate.h b/vmstate.h
> index 5bd2b76..c45f46e 100644
> --- a/vmstate.h
> +++ b/vmstate.h
> @@ -139,6 +139,7 @@ extern const VMStateInfo vmstate_info_uint64;
> extern const VMStateInfo vmstate_info_timer;
> extern const VMStateInfo vmstate_info_buffer;
> extern const VMStateInfo vmstate_info_unused_buffer;
> +extern const VMStateInfo vmstate_info_bitmap;
>
> #define type_check_array(t1,t2,n) ((t1(*)[n])0 - (t2*)0)
> #define type_check_pointer(t1,t2) ((t1**)0 - (t2*)0)
> @@ -411,6 +412,18 @@ extern const VMStateInfo vmstate_info_unused_buffer;
> .flags = VMS_BUFFER, \
> }
>
> +/* _field_size should be a uint32_t field in the _state struct giving the
"..should be an int32_t.."
> + * size of the bitmap _field in bits.
> + */
> +#define VMSTATE_BITMAP(_field, _state, _version, _field_size) { \
> + .name = (stringify(_field)), \
> + .version_id = (_version), \
> + .size_offset = vmstate_offset_value(_state, _field_size, int32_t),\
> + .info = &vmstate_info_bitmap, \
> + .flags = VMS_VBUFFER|VMS_POINTER, \
> + .offset = offsetof(_state, _field), \
> +}
> +
> /* _f : field name
> _f_n : num of elements field_name
> _n : num of elements
I've successfully tested this patch with migration from 32bit to 64bit
little endian host and vice versa. Haven’t tested with
bigendian-littleendian migration since I don't have a bigendian machine
at my disposal.
Tested-by: Igor Mitsyanko <i.mitsyanko@samsung.com>
next prev parent reply other threads:[~2012-08-10 16:22 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-08-09 11:54 [Qemu-devel] [PATCH] vmstate: Add support for saving/loading bitmaps Peter Maydell
2012-08-10 16:22 ` Igor Mitsyanko [this message]
2012-08-10 16:30 ` Peter Maydell
2012-08-10 16:35 ` Igor Mitsyanko
2012-08-13 11:12 ` Juan Quintela
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=50253537.1070003@samsung.com \
--to=i.mitsyanko@samsung.com \
--cc=patches@linaro.org \
--cc=peter.maydell@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=quintela@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.