qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH 03/17] savevm: Implement VMS_DIVIDE flag


From: Anthony Liguori
Subject: Re: [Qemu-devel] [PATCH 03/17] savevm: Implement VMS_DIVIDE flag
Date: Mon, 08 Jul 2013 13:27:05 -0500
User-agent: Notmuch/0.15.2+202~g0c4b8aa (http://notmuchmail.org) Emacs/23.3.1 (x86_64-pc-linux-gnu)

Alexey Kardashevskiy <address@hidden> writes:

> From: David Gibson <address@hidden>
>
> The vmstate infrastructure includes a VMS_MULTIPY flag, and associated
> VMSTATE_VBUFFER_MULTIPLY helper macro.  These can be used to save a
> variably sized buffer where the size in bytes of the buffer isn't directly
> accessible as a structure field, but an element count from which the size
> can be derived is.

Why?  What's the point of sending the total size vs. the element count?

It's not like we have legacy that we have to support here...

Regards,

Anthony Liguori

>
> This patch adds an analogous VMS_DIVIDE option, which handles a variably
> sized buffer whose size is a submultiple of a field, rather than a
> multiple.  For example a buffer containing per-page structures whose size
> is derived from a field storing the total address space described by the
> structures could use this construct.
>
> Signed-off-by: David Gibson <address@hidden>
> Signed-off-by: Alexey Kardashevskiy <address@hidden>
> ---
>  include/migration/vmstate.h |   13 +++++++++++++
>  savevm.c                    |    8 ++++++++
>  2 files changed, 21 insertions(+)
>
> diff --git a/include/migration/vmstate.h b/include/migration/vmstate.h
> index ebc4d09..787f1cb 100644
> --- a/include/migration/vmstate.h
> +++ b/include/migration/vmstate.h
> @@ -98,6 +98,7 @@ enum VMStateFlags {
>      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*/
> +    VMS_DIVIDE           = 0x1000, /* divide "size" field by field_size */
>  };
>  
>  typedef struct {
> @@ -420,6 +421,18 @@ extern const VMStateInfo vmstate_info_bitmap;
>      .start        = (_start),                                        \
>  }
>  
> +#define VMSTATE_VBUFFER_DIVIDE(_field, _state, _version, _test, _start, 
> _field_size, _divide) { \
> +    .name         = (stringify(_field)),                             \
> +    .version_id   = (_version),                                      \
> +    .field_exists = (_test),                                         \
> +    .size_offset  = vmstate_offset_value(_state, _field_size, uint32_t),\
> +    .size         = (_divide),                                       \
> +    .info         = &vmstate_info_buffer,                            \
> +    .flags        = VMS_VBUFFER|VMS_POINTER|VMS_DIVIDE,              \
> +    .offset       = offsetof(_state, _field),                        \
> +    .start        = (_start),                                        \
> +}
> +
>  #define VMSTATE_VBUFFER(_field, _state, _version, _test, _start, 
> _field_size) { \
>      .name         = (stringify(_field)),                             \
>      .version_id   = (_version),                                      \
> diff --git a/savevm.c b/savevm.c
> index 48cc2a9..c0fb4a3 100644
> --- a/savevm.c
> +++ b/savevm.c
> @@ -1658,6 +1658,10 @@ int vmstate_load_state(QEMUFile *f, const 
> VMStateDescription *vmsd,
>                  if (field->flags & VMS_MULTIPLY) {
>                      size *= field->size;
>                  }
> +                if (field->flags & VMS_DIVIDE) {
> +                    assert((size % field->size) == 0);
> +                    size /= field->size;
> +                }
>              }
>              if (field->flags & VMS_ARRAY) {
>                  n_elems = field->num;
> @@ -1722,6 +1726,10 @@ void vmstate_save_state(QEMUFile *f, const 
> VMStateDescription *vmsd,
>                  if (field->flags & VMS_MULTIPLY) {
>                      size *= field->size;
>                  }
> +                if (field->flags & VMS_DIVIDE) {
> +                    assert((size % field->size) == 0);
> +                    size /= field->size;
> +                }
>              }
>              if (field->flags & VMS_ARRAY) {
>                  n_elems = field->num;
> -- 
> 1.7.10.4




reply via email to

[Prev in Thread] Current Thread [Next in Thread]