From: "Andreas Färber" <afaerber@suse.de>
To: Igor Mitsyanko <i.mitsyanko@samsung.com>
Cc: peter.maydell@linaro.org, e.voevodin@samsung.com,
quintela@redhat.com, qemu-devel@nongnu.org,
kyungmin.park@samsung.com, d.solodkiy@samsung.com,
m.kozlov@samsung.com
Subject: Re: [Qemu-devel] [PATCH V2 5/5] vmstate: introduce get_bufsize entry in VMStateField
Date: Wed, 14 Mar 2012 13:55:58 +0100 [thread overview]
Message-ID: <4F60955E.6060204@suse.de> (raw)
In-Reply-To: <1330936245-2570-6-git-send-email-i.mitsyanko@samsung.com>
Am 05.03.2012 09:30, schrieb Igor Mitsyanko:
> New get_bufsize field in VMStateField is supposed to help us easily add save/restore
> support of dynamically allocated buffers in device's states.
> There are some cases when information about size of dynamically allocated buffer is
> already presented in specific device's state structure, but in such a form that
> can not be used with existing VMStateField interface. Currently, we either can get size from
> another variable in device's state as it is with VMSTATE_VBUFFER_* macros, or we can
> also multiply value kept in a variable by a constant with VMSTATE_BUFFER_MULTIPLY
> macro. If we need to perform any other action, we're forced to add additional
> variable with size information to device state structure with the only intention
> to use it in VMStateDescription. This approach is not very pretty. Adding extra
> flags to VMStateFlags enum for every other possible operation with size field
> seems redundant, and still it would't cover cases when we need to perform a set of
> operations to get size value.
> With get_bufsize callback we can calculate size of dynamic array in whichever
> way we need. We don't need .size_offset field anymore, so we can remove it from
> VMState Field structure to compensate for extra memory consuption because of
> get_bufsize addition. Macros VMSTATE_VBUFFER* are modified to use new callback
> instead of .size_offset. Macro VMSTATE_BUFFER_MULTIPLY and VMFlag VMS_MULTIPLY
> are removed completely as they are now redundant.
>
> Signed-off-by: Igor Mitsyanko <i.mitsyanko@samsung.com>
Apart from this commit message being an overwhelmingly huge block of
text ;) (maybe insert an empty line or two?) this had touched on the
overall discussion of whether to pursue a declarative or imperative
approach for VMState.
So, what about adding this as a new, optional mechanism and leaving
VBUFFER / BUFFER_MULTIPLY users untouched?
Andreas
[...]
> diff --git a/vmstate.h b/vmstate.h
> index 9d3c49c..a210e08 100644
> --- a/vmstate.h
> +++ b/vmstate.h
> @@ -73,8 +73,7 @@ enum VMStateFlags {
> VMS_BUFFER = 0x020, /* static sized buffer */
> VMS_ARRAY_OF_POINTER = 0x040,
> VMS_VARRAY_UINT16 = 0x080, /* Array with size in uint16_t field */
> - VMS_VBUFFER = 0x100, /* Buffer with size in int32_t field */
> - VMS_MULTIPLY = 0x200, /* multiply "size" field by field_size */
> + VMS_VBUFFER = 0x100, /* Buffer with dynamically calculated size */
> VMS_VARRAY_UINT8 = 0x400, /* Array with size in uint8_t field*/
> VMS_VARRAY_UINT32 = 0x800, /* Array with size in uint32_t field*/
> };
> @@ -86,12 +85,12 @@ typedef struct {
> size_t start;
> int num;
> size_t num_offset;
> - size_t size_offset;
> const VMStateInfo *info;
> enum VMStateFlags flags;
> const VMStateDescription *vmsd;
> int version_id;
> bool (*field_exists)(void *opaque, int version_id);
> + size_t (*get_bufsize)(void *opaque, int version_id);
> } VMStateField;
>
> typedef struct VMStateSubsection {
> @@ -354,34 +353,11 @@ extern const VMStateInfo vmstate_info_unused_buffer;
> .offset = vmstate_offset_buffer(_state, _field) + _start, \
> }
>
> -#define VMSTATE_BUFFER_MULTIPLY(_field, _state, _version, _test, _start, _field_size, _multiply) { \
> +#define VMSTATE_VBUFFER(_field, _state, _version, _test, _start, _get_bufsize) { \
> .name = (stringify(_field)), \
> .version_id = (_version), \
> .field_exists = (_test), \
> - .size_offset = vmstate_offset_value(_state, _field_size, uint32_t),\
> - .size = (_multiply), \
> - .info = &vmstate_info_buffer, \
> - .flags = VMS_VBUFFER|VMS_MULTIPLY, \
> - .offset = offsetof(_state, _field), \
> - .start = (_start), \
> -}
> -
> -#define VMSTATE_VBUFFER(_field, _state, _version, _test, _start, _field_size) { \
> - .name = (stringify(_field)), \
> - .version_id = (_version), \
> - .field_exists = (_test), \
> - .size_offset = vmstate_offset_value(_state, _field_size, int32_t),\
> - .info = &vmstate_info_buffer, \
> - .flags = VMS_VBUFFER|VMS_POINTER, \
> - .offset = offsetof(_state, _field), \
> - .start = (_start), \
> -}
> -
> -#define VMSTATE_VBUFFER_UINT32(_field, _state, _version, _test, _start, _field_size) { \
> - .name = (stringify(_field)), \
> - .version_id = (_version), \
> - .field_exists = (_test), \
> - .size_offset = vmstate_offset_value(_state, _field_size, uint32_t),\
> + .get_bufsize = (_get_bufsize), \
> .info = &vmstate_info_buffer, \
> .flags = VMS_VBUFFER|VMS_POINTER, \
> .offset = offsetof(_state, _field), \
> @@ -570,14 +546,11 @@ extern const VMStateInfo vmstate_info_unused_buffer;
> #define VMSTATE_BUFFER_START_MIDDLE(_f, _s, _start) \
> VMSTATE_STATIC_BUFFER(_f, _s, 0, NULL, _start, sizeof(typeof_field(_s, _f)))
>
> -#define VMSTATE_PARTIAL_VBUFFER(_f, _s, _size) \
> - VMSTATE_VBUFFER(_f, _s, 0, NULL, 0, _size)
> -
> -#define VMSTATE_PARTIAL_VBUFFER_UINT32(_f, _s, _size) \
> - VMSTATE_VBUFFER_UINT32(_f, _s, 0, NULL, 0, _size)
> +#define VMSTATE_PARTIAL_VBUFFER(_f, _s, _get_bufsize) \
> + VMSTATE_VBUFFER(_f, _s, 0, NULL, 0, _get_bufsize)
>
> -#define VMSTATE_SUB_VBUFFER(_f, _s, _start, _size) \
> - VMSTATE_VBUFFER(_f, _s, 0, NULL, _start, _size)
> +#define VMSTATE_SUB_VBUFFER(_f, _s, _start, _get_bufsize) \
> + VMSTATE_VBUFFER(_f, _s, 0, NULL, _start, _get_bufsize)
>
> #define VMSTATE_BUFFER_TEST(_f, _s, _test) \
> VMSTATE_STATIC_BUFFER(_f, _s, 0, _test, 0, sizeof(typeof_field(_s, _f)))
--
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany
GF: Jeff Hawn, Jennifer Guild, Felix Imendörffer; HRB 16746 AG Nürnberg
next prev parent reply other threads:[~2012-03-14 12:56 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-03-05 8:30 [Qemu-devel] [PATCH V2 0/5] VMState cleanups Igor Mitsyanko
2012-03-05 8:30 ` [Qemu-devel] [PATCH V2 1/5] target-alpha/machine.c: use VMSTATE_UINT64* instead of VMSTATE_UINTTL* Igor Mitsyanko
2012-03-05 8:30 ` [Qemu-devel] [PATCH V2 2/5] hw/pxa2xx_dma.c: drop target_phys_addr_t usage in device state Igor Mitsyanko
2012-03-14 12:42 ` Andreas Färber
2012-03-14 17:11 ` Michael Roth
2012-03-05 8:30 ` [Qemu-devel] [PATCH V2 3/5] hw/pxa2xx_lcd.c: " Igor Mitsyanko
2012-03-14 12:48 ` Andreas Färber
2012-03-05 8:30 ` [Qemu-devel] [PATCH V2 4/5] vmstate: move VMSTATE_UINTTL* macros definitions to cpu-defs.h Igor Mitsyanko
2012-03-05 8:30 ` [Qemu-devel] [PATCH V2 5/5] vmstate: introduce get_bufsize entry in VMStateField Igor Mitsyanko
2012-03-14 12:55 ` Andreas Färber [this message]
2012-03-14 14:07 ` Igor Mitsyanko
2012-03-14 12:30 ` [Qemu-devel] [PATCH V2 0/5] VMState cleanups Peter Maydell
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=4F60955E.6060204@suse.de \
--to=afaerber@suse.de \
--cc=d.solodkiy@samsung.com \
--cc=e.voevodin@samsung.com \
--cc=i.mitsyanko@samsung.com \
--cc=kyungmin.park@samsung.com \
--cc=m.kozlov@samsung.com \
--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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).