From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:52953) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UwGE4-0007z5-65 for qemu-devel@nongnu.org; Mon, 08 Jul 2013 14:31:54 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1UwGE2-0000eS-UN for qemu-devel@nongnu.org; Mon, 08 Jul 2013 14:31:52 -0400 Received: from e32.co.us.ibm.com ([32.97.110.150]:35202) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UwGE2-0000eK-Oq for qemu-devel@nongnu.org; Mon, 08 Jul 2013 14:31:50 -0400 Received: from /spool/local by e32.co.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Mon, 8 Jul 2013 12:31:41 -0600 From: Anthony Liguori In-Reply-To: <1372315560-5478-4-git-send-email-aik@ozlabs.ru> References: <1372315560-5478-1-git-send-email-aik@ozlabs.ru> <1372315560-5478-4-git-send-email-aik@ozlabs.ru> Date: Mon, 08 Jul 2013 13:27:05 -0500 Message-ID: <877gh029hi.fsf@codemonkey.ws> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Subject: Re: [Qemu-devel] [PATCH 03/17] savevm: Implement VMS_DIVIDE flag List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Alexey Kardashevskiy , qemu-devel@nongnu.org Cc: Alexander Graf , qemu-ppc@nongnu.org, Paolo Bonzini , Paul Mackerras , David Gibson Alexey Kardashevskiy writes: > From: David Gibson > > 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 > Signed-off-by: Alexey Kardashevskiy > --- > 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