Re: [Qemu-devel] [PATCH qemu] vmstate: Define VARRAY with VMS_ALLOC

2016-03-21 Thread Alexey Kardashevskiy

On 03/15/2016 02:17 PM, Alexey Kardashevskiy wrote:

This allows dynamic allocation for migrating arrays.

Already existing VMSTATE_VARRAY_UINT32 requires an array to be
pre-allocated, however there are cases when the size is not known in
advance and there is no real need to enforce it.

This defines another variant of VMSTATE_VARRAY_UINT32 with WMS_ALLOC
flag which tells the receiving side to allocate memory for the array
before receiving the data.

The first user of it is the "pseries" machine (POWER8) with
dynamic DMA windows which existence and size are totally dynamic.

Signed-off-by: Alexey Kardashevskiy 
Reviewed-by: David Gibson 
Reviewed-by: Thomas Huth 
---


As David suggested, I am posting it alone (separately from the DDW patchset).

It would be nice either to get "ack" to get this pulled via the powerpc
tree or get it pulled to the upstream via some other tree. Thanks!



So what is about this patch? Ack, nack? Thanks!





---
  include/migration/vmstate.h | 10 ++
  1 file changed, 10 insertions(+)

diff --git a/include/migration/vmstate.h b/include/migration/vmstate.h
index 84ee355..1622638 100644
--- a/include/migration/vmstate.h
+++ b/include/migration/vmstate.h
@@ -386,6 +386,16 @@ extern const VMStateInfo vmstate_info_bitmap;
  .offset = vmstate_offset_pointer(_state, _field, _type), \
  }

+#define VMSTATE_VARRAY_UINT32_ALLOC(_field, _state, _field_num, _version, 
_info, _type) {\
+.name   = (stringify(_field)),   \
+.version_id = (_version),\
+.num_offset = vmstate_offset_value(_state, _field_num, uint32_t),\
+.info   = &(_info),  \
+.size   = sizeof(_type), \
+.flags  = VMS_VARRAY_UINT32|VMS_POINTER|VMS_ALLOC,   \
+.offset = vmstate_offset_pointer(_state, _field, _type), \
+}
+
  #define VMSTATE_VARRAY_UINT16_UNSAFE(_field, _state, _field_num, _version, 
_info, _type) {\
  .name   = (stringify(_field)),   \
  .version_id = (_version),\




--
Alexey



Re: [Qemu-devel] [PATCH qemu] vmstate: Define VARRAY with VMS_ALLOC

2016-03-19 Thread David Gibson
On Wed, Mar 16, 2016 at 09:07:59AM +, Dr. David Alan Gilbert wrote:
> * David Gibson (da...@gibson.dropbear.id.au) wrote:
> > On Tue, Mar 15, 2016 at 12:01:04PM +, Dr. David Alan Gilbert wrote:
> > > * Alexey Kardashevskiy (a...@ozlabs.ru) wrote:
> > > > This allows dynamic allocation for migrating arrays.
> > > > 
> > > > Already existing VMSTATE_VARRAY_UINT32 requires an array to be
> > > > pre-allocated, however there are cases when the size is not known in
> > > > advance and there is no real need to enforce it.
> > > > 
> > > > This defines another variant of VMSTATE_VARRAY_UINT32 with WMS_ALLOC
> > > > flag which tells the receiving side to allocate memory for the array
> > > > before receiving the data.
> > > > 
> > > > The first user of it is the "pseries" machine (POWER8) with
> > > > dynamic DMA windows which existence and size are totally dynamic.
> > > 
> > > You say totally dynamic, how big do they get out of interest?
> > 
> > They're basically used to map all guest RAM.  Typically we'd be
> > looking at one 64-bit TCE per 64K guest page, so we'd be looking at
> > 1/8192th of RAM size.
> > 
> > Since we can in theory have guests in the 1T+ range, that might start
> > getting pretty big, so we probably should look at incremental transfer
> > of the TCE tables at some point.
> 
> OK, you probably need to bump up MAX_VM_CMD_PACKAGED_SIZE (sysemu.h)
> which is an arbitrary size limit for postcopies device data; it's currently
> 16MB.  It's just there to stop anything silly, so just turn it up a bit.
> 
> However, if it is fixed at one 64-bit TCE per guest page, why do you
> need to dynamically allocate it during migration load, can't you
> statically allocate once you know guests memory size?

So, guest memory size is what it will be in practice (with Linux
guests), but that's under the guest's control, not ours; at least in
theory it can be different.

-- 
David Gibson| I'll have my music baroque, and my code
david AT gibson.dropbear.id.au  | minimalist, thank you.  NOT _the_ _other_
| _way_ _around_!
http://www.ozlabs.org/~dgibson


signature.asc
Description: PGP signature


Re: [Qemu-devel] [PATCH qemu] vmstate: Define VARRAY with VMS_ALLOC

2016-03-16 Thread Dr. David Alan Gilbert
* David Gibson (da...@gibson.dropbear.id.au) wrote:
> On Tue, Mar 15, 2016 at 12:01:04PM +, Dr. David Alan Gilbert wrote:
> > * Alexey Kardashevskiy (a...@ozlabs.ru) wrote:
> > > This allows dynamic allocation for migrating arrays.
> > > 
> > > Already existing VMSTATE_VARRAY_UINT32 requires an array to be
> > > pre-allocated, however there are cases when the size is not known in
> > > advance and there is no real need to enforce it.
> > > 
> > > This defines another variant of VMSTATE_VARRAY_UINT32 with WMS_ALLOC
> > > flag which tells the receiving side to allocate memory for the array
> > > before receiving the data.
> > > 
> > > The first user of it is the "pseries" machine (POWER8) with
> > > dynamic DMA windows which existence and size are totally dynamic.
> > 
> > You say totally dynamic, how big do they get out of interest?
> 
> They're basically used to map all guest RAM.  Typically we'd be
> looking at one 64-bit TCE per 64K guest page, so we'd be looking at
> 1/8192th of RAM size.
> 
> Since we can in theory have guests in the 1T+ range, that might start
> getting pretty big, so we probably should look at incremental transfer
> of the TCE tables at some point.

OK, you probably need to bump up MAX_VM_CMD_PACKAGED_SIZE (sysemu.h)
which is an arbitrary size limit for postcopies device data; it's currently
16MB.  It's just there to stop anything silly, so just turn it up a bit.

However, if it is fixed at one 64-bit TCE per guest page, why do you
need to dynamically allocate it during migration load, can't you
statically allocate once you know guests memory size?

Dave

> 
> > 
> > Dave
> > 
> > > 
> > > Signed-off-by: Alexey Kardashevskiy 
> > > Reviewed-by: David Gibson 
> > > Reviewed-by: Thomas Huth 
> > > ---
> > > 
> > > 
> > > As David suggested, I am posting it alone (separately from the DDW 
> > > patchset).
> > > 
> > > It would be nice either to get "ack" to get this pulled via the powerpc
> > > tree or get it pulled to the upstream via some other tree. Thanks!
> > > 
> > > 
> > > 
> > > ---
> > >  include/migration/vmstate.h | 10 ++
> > >  1 file changed, 10 insertions(+)
> > > 
> > > diff --git a/include/migration/vmstate.h b/include/migration/vmstate.h
> > > index 84ee355..1622638 100644
> > > --- a/include/migration/vmstate.h
> > > +++ b/include/migration/vmstate.h
> > > @@ -386,6 +386,16 @@ extern const VMStateInfo vmstate_info_bitmap;
> > >  .offset = vmstate_offset_pointer(_state, _field, _type), \
> > >  }
> > >  
> > > +#define VMSTATE_VARRAY_UINT32_ALLOC(_field, _state, _field_num, 
> > > _version, _info, _type) {\
> > > +.name   = (stringify(_field)),   \
> > > +.version_id = (_version),\
> > > +.num_offset = vmstate_offset_value(_state, _field_num, uint32_t),\
> > > +.info   = &(_info),  \
> > > +.size   = sizeof(_type), \
> > > +.flags  = VMS_VARRAY_UINT32|VMS_POINTER|VMS_ALLOC,   \
> > > +.offset = vmstate_offset_pointer(_state, _field, _type), \
> > > +}
> > > +
> > >  #define VMSTATE_VARRAY_UINT16_UNSAFE(_field, _state, _field_num, 
> > > _version, _info, _type) {\
> > >  .name   = (stringify(_field)),   \
> > >  .version_id = (_version),\
> 
> -- 
> David Gibson  | I'll have my music baroque, and my code
> david AT gibson.dropbear.id.au| minimalist, thank you.  NOT _the_ 
> _other_
>   | _way_ _around_!
> http://www.ozlabs.org/~dgibson


--
Dr. David Alan Gilbert / dgilb...@redhat.com / Manchester, UK



Re: [Qemu-devel] [PATCH qemu] vmstate: Define VARRAY with VMS_ALLOC

2016-03-15 Thread David Gibson
On Tue, Mar 15, 2016 at 12:01:04PM +, Dr. David Alan Gilbert wrote:
> * Alexey Kardashevskiy (a...@ozlabs.ru) wrote:
> > This allows dynamic allocation for migrating arrays.
> > 
> > Already existing VMSTATE_VARRAY_UINT32 requires an array to be
> > pre-allocated, however there are cases when the size is not known in
> > advance and there is no real need to enforce it.
> > 
> > This defines another variant of VMSTATE_VARRAY_UINT32 with WMS_ALLOC
> > flag which tells the receiving side to allocate memory for the array
> > before receiving the data.
> > 
> > The first user of it is the "pseries" machine (POWER8) with
> > dynamic DMA windows which existence and size are totally dynamic.
> 
> You say totally dynamic, how big do they get out of interest?

They're basically used to map all guest RAM.  Typically we'd be
looking at one 64-bit TCE per 64K guest page, so we'd be looking at
1/8192th of RAM size.

Since we can in theory have guests in the 1T+ range, that might start
getting pretty big, so we probably should look at incremental transfer
of the TCE tables at some point.

> 
> Dave
> 
> > 
> > Signed-off-by: Alexey Kardashevskiy 
> > Reviewed-by: David Gibson 
> > Reviewed-by: Thomas Huth 
> > ---
> > 
> > 
> > As David suggested, I am posting it alone (separately from the DDW 
> > patchset).
> > 
> > It would be nice either to get "ack" to get this pulled via the powerpc
> > tree or get it pulled to the upstream via some other tree. Thanks!
> > 
> > 
> > 
> > ---
> >  include/migration/vmstate.h | 10 ++
> >  1 file changed, 10 insertions(+)
> > 
> > diff --git a/include/migration/vmstate.h b/include/migration/vmstate.h
> > index 84ee355..1622638 100644
> > --- a/include/migration/vmstate.h
> > +++ b/include/migration/vmstate.h
> > @@ -386,6 +386,16 @@ extern const VMStateInfo vmstate_info_bitmap;
> >  .offset = vmstate_offset_pointer(_state, _field, _type), \
> >  }
> >  
> > +#define VMSTATE_VARRAY_UINT32_ALLOC(_field, _state, _field_num, _version, 
> > _info, _type) {\
> > +.name   = (stringify(_field)),   \
> > +.version_id = (_version),\
> > +.num_offset = vmstate_offset_value(_state, _field_num, uint32_t),\
> > +.info   = &(_info),  \
> > +.size   = sizeof(_type), \
> > +.flags  = VMS_VARRAY_UINT32|VMS_POINTER|VMS_ALLOC,   \
> > +.offset = vmstate_offset_pointer(_state, _field, _type), \
> > +}
> > +
> >  #define VMSTATE_VARRAY_UINT16_UNSAFE(_field, _state, _field_num, _version, 
> > _info, _type) {\
> >  .name   = (stringify(_field)),   \
> >  .version_id = (_version),\

-- 
David Gibson| I'll have my music baroque, and my code
david AT gibson.dropbear.id.au  | minimalist, thank you.  NOT _the_ _other_
| _way_ _around_!
http://www.ozlabs.org/~dgibson


signature.asc
Description: PGP signature


Re: [Qemu-devel] [PATCH qemu] vmstate: Define VARRAY with VMS_ALLOC

2016-03-15 Thread Dr. David Alan Gilbert
* Alexey Kardashevskiy (a...@ozlabs.ru) wrote:
> This allows dynamic allocation for migrating arrays.
> 
> Already existing VMSTATE_VARRAY_UINT32 requires an array to be
> pre-allocated, however there are cases when the size is not known in
> advance and there is no real need to enforce it.
> 
> This defines another variant of VMSTATE_VARRAY_UINT32 with WMS_ALLOC
> flag which tells the receiving side to allocate memory for the array
> before receiving the data.
> 
> The first user of it is the "pseries" machine (POWER8) with
> dynamic DMA windows which existence and size are totally dynamic.

You say totally dynamic, how big do they get out of interest?

Dave

> 
> Signed-off-by: Alexey Kardashevskiy 
> Reviewed-by: David Gibson 
> Reviewed-by: Thomas Huth 
> ---
> 
> 
> As David suggested, I am posting it alone (separately from the DDW patchset).
> 
> It would be nice either to get "ack" to get this pulled via the powerpc
> tree or get it pulled to the upstream via some other tree. Thanks!
> 
> 
> 
> ---
>  include/migration/vmstate.h | 10 ++
>  1 file changed, 10 insertions(+)
> 
> diff --git a/include/migration/vmstate.h b/include/migration/vmstate.h
> index 84ee355..1622638 100644
> --- a/include/migration/vmstate.h
> +++ b/include/migration/vmstate.h
> @@ -386,6 +386,16 @@ extern const VMStateInfo vmstate_info_bitmap;
>  .offset = vmstate_offset_pointer(_state, _field, _type), \
>  }
>  
> +#define VMSTATE_VARRAY_UINT32_ALLOC(_field, _state, _field_num, _version, 
> _info, _type) {\
> +.name   = (stringify(_field)),   \
> +.version_id = (_version),\
> +.num_offset = vmstate_offset_value(_state, _field_num, uint32_t),\
> +.info   = &(_info),  \
> +.size   = sizeof(_type), \
> +.flags  = VMS_VARRAY_UINT32|VMS_POINTER|VMS_ALLOC,   \
> +.offset = vmstate_offset_pointer(_state, _field, _type), \
> +}
> +
>  #define VMSTATE_VARRAY_UINT16_UNSAFE(_field, _state, _field_num, _version, 
> _info, _type) {\
>  .name   = (stringify(_field)),   \
>  .version_id = (_version),\
> -- 
> 2.5.0.rc3
> 
> 
--
Dr. David Alan Gilbert / dgilb...@redhat.com / Manchester, UK



[Qemu-devel] [PATCH qemu] vmstate: Define VARRAY with VMS_ALLOC

2016-03-14 Thread Alexey Kardashevskiy
This allows dynamic allocation for migrating arrays.

Already existing VMSTATE_VARRAY_UINT32 requires an array to be
pre-allocated, however there are cases when the size is not known in
advance and there is no real need to enforce it.

This defines another variant of VMSTATE_VARRAY_UINT32 with WMS_ALLOC
flag which tells the receiving side to allocate memory for the array
before receiving the data.

The first user of it is the "pseries" machine (POWER8) with
dynamic DMA windows which existence and size are totally dynamic.

Signed-off-by: Alexey Kardashevskiy 
Reviewed-by: David Gibson 
Reviewed-by: Thomas Huth 
---


As David suggested, I am posting it alone (separately from the DDW patchset).

It would be nice either to get "ack" to get this pulled via the powerpc
tree or get it pulled to the upstream via some other tree. Thanks!



---
 include/migration/vmstate.h | 10 ++
 1 file changed, 10 insertions(+)

diff --git a/include/migration/vmstate.h b/include/migration/vmstate.h
index 84ee355..1622638 100644
--- a/include/migration/vmstate.h
+++ b/include/migration/vmstate.h
@@ -386,6 +386,16 @@ extern const VMStateInfo vmstate_info_bitmap;
 .offset = vmstate_offset_pointer(_state, _field, _type), \
 }
 
+#define VMSTATE_VARRAY_UINT32_ALLOC(_field, _state, _field_num, _version, 
_info, _type) {\
+.name   = (stringify(_field)),   \
+.version_id = (_version),\
+.num_offset = vmstate_offset_value(_state, _field_num, uint32_t),\
+.info   = &(_info),  \
+.size   = sizeof(_type), \
+.flags  = VMS_VARRAY_UINT32|VMS_POINTER|VMS_ALLOC,   \
+.offset = vmstate_offset_pointer(_state, _field, _type), \
+}
+
 #define VMSTATE_VARRAY_UINT16_UNSAFE(_field, _state, _field_num, _version, 
_info, _type) {\
 .name   = (stringify(_field)),   \
 .version_id = (_version),\
-- 
2.5.0.rc3