All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Andreas Färber" <afaerber@suse.de>
To: quintela@redhat.com
Cc: peter.maydell@linaro.org,
	Mitsyanko Igor <i.mitsyanko@samsung.com>,
	e.voevodin@samsung.com, qemu-devel@nongnu.org,
	kyungmin.park@samsung.com, d.solodkiy@samsung.com,
	m.kozlov@samsung.com, jehyung.lee@samsung.com
Subject: Re: [Qemu-devel] [PATCH V3 1/5] vmstate: introduce get_bufsize entry in VMStateField
Date: Thu, 19 Jan 2012 14:40:23 +0100	[thread overview]
Message-ID: <4F181D47.4050402@suse.de> (raw)
In-Reply-To: <1325086342-25653-2-git-send-email-i.mitsyanko@samsung.com>

Am 28.12.2011 16:32, schrieb Mitsyanko Igor:
> 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: Mitsyanko Igor <i.mitsyanko@samsung.com>

Ping! Juan, what do you think?

Andreas

> ---
>  hw/g364fb.c    |    7 ++++++-
>  hw/hw.h        |   41 +++++++----------------------------------
>  hw/m48t59.c    |    7 ++++++-
>  hw/mac_nvram.c |    8 +++++++-
>  hw/onenand.c   |    7 ++++++-
>  savevm.c       |   10 ++--------
>  6 files changed, 34 insertions(+), 46 deletions(-)
> 
> diff --git a/hw/g364fb.c b/hw/g364fb.c
> index 34fb08c..1ab36c2 100644
> --- a/hw/g364fb.c
> +++ b/hw/g364fb.c
> @@ -495,6 +495,11 @@ static int g364fb_post_load(void *opaque, int version_id)
>      return 0;
>  }
>  
> +static int g364fb_get_vramsize(void *opaque, int version_id)
> +{
> +    return ((G364State *)opaque)->vram_size;
> +}
> +
>  static const VMStateDescription vmstate_g364fb = {
>      .name = "g364fb",
>      .version_id = 1,
> @@ -502,7 +507,7 @@ static const VMStateDescription vmstate_g364fb = {
>      .minimum_version_id_old = 1,
>      .post_load = g364fb_post_load,
>      .fields = (VMStateField[]) {
> -        VMSTATE_VBUFFER_UINT32(vram, G364State, 1, NULL, 0, vram_size),
> +        VMSTATE_VBUFFER(vram, G364State, 1, NULL, 0, g364fb_get_vramsize),
>          VMSTATE_BUFFER_UNSAFE(color_palette, G364State, 0, 256 * 3),
>          VMSTATE_BUFFER_UNSAFE(cursor_palette, G364State, 0, 9),
>          VMSTATE_UINT16_ARRAY(cursor, G364State, 512),
> diff --git a/hw/hw.h b/hw/hw.h
> index efa04d1..a2a43b6 100644
> --- a/hw/hw.h
> +++ b/hw/hw.h
> @@ -303,7 +303,6 @@ enum VMStateFlags {
>      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_VARRAY_UINT8     = 0x400,  /* Array with size in uint8_t field*/
>      VMS_VARRAY_UINT32    = 0x800,  /* Array with size in uint32_t field*/
>  };
> @@ -315,12 +314,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);
> +    int (*get_bufsize)(void *opaque, int version_id);
>  } VMStateField;
>  
>  typedef struct VMStateSubsection {
> @@ -584,34 +583,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),                        \
> @@ -891,14 +867,11 @@ extern const VMStateDescription vmstate_hid_ptr_device;
>  #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)))
> diff --git a/hw/m48t59.c b/hw/m48t59.c
> index c043996..4e4c9f3 100644
> --- a/hw/m48t59.c
> +++ b/hw/m48t59.c
> @@ -582,6 +582,11 @@ static const MemoryRegionOps nvram_ops = {
>      .endianness = DEVICE_NATIVE_ENDIAN,
>  };
>  
> +static int m48t59_get_bufsize(void *opaque, int version_id)
> +{
> +    return ((M48t59State *)opaque)->size;
> +}
> +
>  static const VMStateDescription vmstate_m48t59 = {
>      .name = "m48t59",
>      .version_id = 1,
> @@ -590,7 +595,7 @@ static const VMStateDescription vmstate_m48t59 = {
>      .fields      = (VMStateField[]) {
>          VMSTATE_UINT8(lock, M48t59State),
>          VMSTATE_UINT16(addr, M48t59State),
> -        VMSTATE_VBUFFER_UINT32(buffer, M48t59State, 0, NULL, 0, size),
> +        VMSTATE_VBUFFER(buffer, M48t59State, 0, NULL, 0, m48t59_get_bufsize),
>          VMSTATE_END_OF_LIST()
>      }
>  };
> diff --git a/hw/mac_nvram.c b/hw/mac_nvram.c
> index ed0a2b7..f4367f8 100644
> --- a/hw/mac_nvram.c
> +++ b/hw/mac_nvram.c
> @@ -100,13 +100,19 @@ static const MemoryRegionOps macio_nvram_ops = {
>      .endianness = DEVICE_NATIVE_ENDIAN,
>  };
>  
> +static int macio_nvram_get_datasize(void *opaque, int version_id)
> +{
> +    return ((MacIONVRAMState *)opaque)->size;
> +}
> +
>  static const VMStateDescription vmstate_macio_nvram = {
>      .name = "macio_nvram",
>      .version_id = 1,
>      .minimum_version_id = 1,
>      .minimum_version_id_old = 1,
>      .fields      = (VMStateField[]) {
> -        VMSTATE_VBUFFER_UINT32(data, MacIONVRAMState, 0, NULL, 0, size),
> +        VMSTATE_VBUFFER(data, MacIONVRAMState, 0, NULL, 0,
> +                macio_nvram_get_datasize),
>          VMSTATE_END_OF_LIST()
>      }
>  };
> diff --git a/hw/onenand.c b/hw/onenand.c
> index a9d8d67..3e2016b 100644
> --- a/hw/onenand.c
> +++ b/hw/onenand.c
> @@ -160,6 +160,11 @@ static int onenand_post_load(void *opaque, int version_id)
>      return 0;
>  }
>  
> +static int onenand_get_blockwpsize(void *opaque, int version_id)
> +{
> +    return ((OneNANDState *)opaque)->blocks;
> +}
> +
>  static const VMStateDescription vmstate_onenand = {
>      .name = "onenand",
>      .version_id = 1,
> @@ -181,7 +186,7 @@ static const VMStateDescription vmstate_onenand = {
>          VMSTATE_UINT16(intstatus, OneNANDState),
>          VMSTATE_UINT16(wpstatus, OneNANDState),
>          VMSTATE_INT32(secs_cur, OneNANDState),
> -        VMSTATE_PARTIAL_VBUFFER(blockwp, OneNANDState, blocks),
> +        VMSTATE_PARTIAL_VBUFFER(blockwp, OneNANDState, onenand_get_blockwpsize),
>          VMSTATE_UINT8(ecc.cp, OneNANDState),
>          VMSTATE_UINT16_ARRAY(ecc.lp, OneNANDState, 2),
>          VMSTATE_UINT16(ecc.count, OneNANDState),
> diff --git a/savevm.c b/savevm.c
> index f153c25..831c50a 100644
> --- a/savevm.c
> +++ b/savevm.c
> @@ -1412,10 +1412,7 @@ int vmstate_load_state(QEMUFile *f, const VMStateDescription *vmsd,
>              int size = field->size;
>  
>              if (field->flags & VMS_VBUFFER) {
> -                size = *(int32_t *)(opaque+field->size_offset);
> -                if (field->flags & VMS_MULTIPLY) {
> -                    size *= field->size;
> -                }
> +                size = field->get_bufsize(opaque, version_id);
>              }
>              if (field->flags & VMS_ARRAY) {
>                  n_elems = field->num;
> @@ -1476,10 +1473,7 @@ void vmstate_save_state(QEMUFile *f, const VMStateDescription *vmsd,
>              int size = field->size;
>  
>              if (field->flags & VMS_VBUFFER) {
> -                size = *(int32_t *)(opaque+field->size_offset);
> -                if (field->flags & VMS_MULTIPLY) {
> -                    size *= field->size;
> -                }
> +                size = field->get_bufsize(opaque, vmsd->version_id);
>              }
>              if (field->flags & VMS_ARRAY) {
>                  n_elems = field->num;

-- 
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany
GF: Jeff Hawn, Jennifer Guild, Felix Imendörffer; HRB 16746 AG Nürnberg

  reply	other threads:[~2012-01-19 13:42 UTC|newest]

Thread overview: 31+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-12-26 10:03 [Qemu-devel] [PATCH 0/3] Improve SD controllers emulation Mitsyanko Igor
2011-12-26 10:03 ` [Qemu-devel] [PATCH 1/3] vmstate: introduce calc_size VMStateField Mitsyanko Igor
2011-12-26 15:20   ` Peter Maydell
2011-12-27  8:11     ` Mitsyanko Igor
2011-12-27 13:10       ` Andreas Färber
2011-12-28  7:41         ` Mitsyanko Igor
2011-12-27  7:54   ` [Qemu-devel] [PATCH V2 1/3] vmstate: introduce get_bufsize entry in VMStateField Mitsyanko Igor
2011-12-26 10:03 ` [Qemu-devel] [PATCH 2/3] hw/sd.c: add SD card save/load support Mitsyanko Igor
2011-12-26 14:58   ` Peter Maydell
2011-12-27 11:27     ` Mitsyanko Igor
2011-12-27 13:27     ` Andreas Färber
2011-12-27 13:54       ` Mitsyanko Igor
2011-12-27 14:13     ` Avi Kivity
2011-12-27 21:30       ` Peter Maydell
2011-12-28  9:50         ` Avi Kivity
2011-12-26 10:03 ` [Qemu-devel] [PATCH 3/3] hw/: Introduce spec. ver. 2.00 compliant SD host controller Mitsyanko Igor
2011-12-26 11:35   ` malc
2011-12-28 12:08 ` [Qemu-devel] [PATCH V2 0/3] Improve SD controllers emulation Mitsyanko Igor
2011-12-28 12:08   ` [Qemu-devel] [PATCH V2 1/3] vmstate: introduce get_bufsize entry in VMStateField Mitsyanko Igor
2011-12-28 12:08   ` [Qemu-devel] [PATCH V2 2/3] hw/sd.c: add SD card save/load support Mitsyanko Igor
2011-12-28 13:26     ` Peter Maydell
2011-12-28 14:02       ` Mitsyanko Igor
2011-12-28 14:41         ` Peter Maydell
2011-12-28 12:08   ` [Qemu-devel] [PATCH V2 3/3] hw: Introduce spec. ver. 2.00 compliant SD host controller Mitsyanko Igor
2011-12-28 15:32 ` [Qemu-devel] [PATCH V3 0/5] Improve SD controllers emulation Mitsyanko Igor
2011-12-28 15:32   ` [Qemu-devel] [PATCH V3 1/5] vmstate: introduce get_bufsize entry in VMStateField Mitsyanko Igor
2012-01-19 13:40     ` Andreas Färber [this message]
2011-12-28 15:32   ` [Qemu-devel] [PATCH V3 2/5] hw/sd.c: add SD card save/load support Mitsyanko Igor
2011-12-28 15:32   ` [Qemu-devel] [PATCH V3 3/5] hw/sd.c: convert wp_groups, expecting_acmd and enable to bool Mitsyanko Igor
2011-12-28 15:32   ` [Qemu-devel] [PATCH V3 4/5] hw/sd.c: convert wp_switch and spi " Mitsyanko Igor
2011-12-28 15:32   ` [Qemu-devel] [PATCH V3 5/5] hw: Introduce spec. ver. 2.00 compliant SD host controller Mitsyanko Igor

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=4F181D47.4050402@suse.de \
    --to=afaerber@suse.de \
    --cc=d.solodkiy@samsung.com \
    --cc=e.voevodin@samsung.com \
    --cc=i.mitsyanko@samsung.com \
    --cc=jehyung.lee@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 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.