diff mbox series

[for-5.0] vl.c: fix migration failure for 3.1 and older machine types

Message ID 20200304172748.15338-1-imammedo@redhat.com (mailing list archive)
State New, archived
Headers show
Series [for-5.0] vl.c: fix migration failure for 3.1 and older machine types | expand

Commit Message

Igor Mammedov March 4, 2020, 5:27 p.m. UTC
Migration from QEMU(v4.0) fails when using 3.1 or older machine
type. For example if one attempts to migrate
QEMU-2.12 started as
  qemu-system-ppc64 -nodefaults -M pseries-2.12 -m 4096 -mem-path /tmp/
to current master, it will fail with
  qemu-system-ppc64: Unknown ramblock "ppc_spapr.ram", cannot accept migration
  qemu-system-ppc64: error while loading state for instance 0x0 of device 'ram'
  qemu-system-ppc64: load of migration failed: Invalid argument

Caused by 900c0ba373 commit which switches main RAM allocation to
memory backends and the fact in 3.1 and older QEMU, backends used
full[***] QOM path as memory region name instead of backend's name.
That was changed after 3.1 to use prefix-less names by default
(fa0cb34d22) for new machine types.
*** effectively makes main RAM memory region names defined by
MachineClass::default_ram_id being altered with '/objects/' prefix
and therefore migration fails as old QEMU sends prefix-less
name while new QEMU expects name with prefix when using 3.1 and
older machine types.

Fix it by forcing implicit[1] memory backend to always use
prefix-less names for its memory region by setting
  'x-use-canonical-path-for-ramblock-id'
property to false.

1) i.e. memory backend created by compat glue which maps
-m/-mem-path/-mem-prealloc/default RAM size into
appropriate backend type/options to match old CLI format.

Fixes: 900c0ba373
Signed-off-by: Igor Mammedov <imammedo@redhat.com>
Reported-by: Lukáš Doktor <ldoktor@redhat.com>
---
CC: ldoktor@redhat.com
CC: marcandre.lureau@redhat.com
CC: dgilbert@redhat.com
---
 softmmu/vl.c | 3 +++
 1 file changed, 3 insertions(+)

Comments

Lukáš Doktor March 8, 2020, 10:18 a.m. UTC | #1
Dne 04. 03. 20 v 18:27 Igor Mammedov napsal(a):
> Migration from QEMU(v4.0) fails when using 3.1 or older machine
> type. For example if one attempts to migrate
> QEMU-2.12 started as
>   qemu-system-ppc64 -nodefaults -M pseries-2.12 -m 4096 -mem-path /tmp/
> to current master, it will fail with
>   qemu-system-ppc64: Unknown ramblock "ppc_spapr.ram", cannot accept migration
>   qemu-system-ppc64: error while loading state for instance 0x0 of device 'ram'
>   qemu-system-ppc64: load of migration failed: Invalid argument
> 
> Caused by 900c0ba373 commit which switches main RAM allocation to
> memory backends and the fact in 3.1 and older QEMU, backends used
> full[***] QOM path as memory region name instead of backend's name.
> That was changed after 3.1 to use prefix-less names by default
> (fa0cb34d22) for new machine types.
> *** effectively makes main RAM memory region names defined by
> MachineClass::default_ram_id being altered with '/objects/' prefix
> and therefore migration fails as old QEMU sends prefix-less
> name while new QEMU expects name with prefix when using 3.1 and
> older machine types.
> 
> Fix it by forcing implicit[1] memory backend to always use
> prefix-less names for its memory region by setting
>   'x-use-canonical-path-for-ramblock-id'
> property to false.
> 
> 1) i.e. memory backend created by compat glue which maps
> -m/-mem-path/-mem-prealloc/default RAM size into
> appropriate backend type/options to match old CLI format.
> 
> Fixes: 900c0ba373
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> Reported-by: Lukáš Doktor <ldoktor@redhat.com>
> ---
> CC: ldoktor@redhat.com
> CC: marcandre.lureau@redhat.com
> CC: dgilbert@redhat.com
> ---
>  softmmu/vl.c | 3 +++
>  1 file changed, 3 insertions(+)
> 
> diff --git a/softmmu/vl.c b/softmmu/vl.c
> index 5549f4b619..1101b1cb41 100644
> --- a/softmmu/vl.c
> +++ b/softmmu/vl.c
> @@ -2800,6 +2800,9 @@ static void create_default_memdev(MachineState *ms, const char *path)
>      object_property_set_int(obj, ms->ram_size, "size", &error_fatal);
>      object_property_add_child(object_get_objects_root(), mc->default_ram_id,
>                                obj, &error_fatal);
> +    /* Ensure backend's memory region name is equal to mc->default_ram_id */
> +    object_property_set_bool(obj, false, "x-use-canonical-path-for-ramblock-id",
> +                             &error_fatal);
>      user_creatable_complete(USER_CREATABLE(obj), &error_fatal);
>      object_unref(obj);
>      object_property_set_str(OBJECT(ms), mc->default_ram_id, "memory-backend",
> 

Tested-by: Lukáš Doktor <ldoktor@redhat.com> 

I can't say anything about the code, but functional-wise it addresses the issue and fixes post_copy hugepages migration in my mini-CI (variants 2.10, 2.12, 3.0, 3.1, 4.0 -> master and vice-versa are failing with master and passing with this patch).

Regards,
Lukáš
Marc-André Lureau March 9, 2020, 3:14 p.m. UTC | #2
Hi

On Wed, Mar 4, 2020 at 6:28 PM Igor Mammedov <imammedo@redhat.com> wrote:
>
> Migration from QEMU(v4.0) fails when using 3.1 or older machine
> type. For example if one attempts to migrate
> QEMU-2.12 started as
>   qemu-system-ppc64 -nodefaults -M pseries-2.12 -m 4096 -mem-path /tmp/
> to current master, it will fail with
>   qemu-system-ppc64: Unknown ramblock "ppc_spapr.ram", cannot accept migration
>   qemu-system-ppc64: error while loading state for instance 0x0 of device 'ram'
>   qemu-system-ppc64: load of migration failed: Invalid argument
>
> Caused by 900c0ba373 commit which switches main RAM allocation to
> memory backends and the fact in 3.1 and older QEMU, backends used
> full[***] QOM path as memory region name instead of backend's name.
> That was changed after 3.1 to use prefix-less names by default
> (fa0cb34d22) for new machine types.
> *** effectively makes main RAM memory region names defined by
> MachineClass::default_ram_id being altered with '/objects/' prefix
> and therefore migration fails as old QEMU sends prefix-less
> name while new QEMU expects name with prefix when using 3.1 and
> older machine types.
>
> Fix it by forcing implicit[1] memory backend to always use
> prefix-less names for its memory region by setting
>   'x-use-canonical-path-for-ramblock-id'
> property to false.

ahah, ok. If main RAM allocation was always using prefix-less name,
then that should be good enough:
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>


>
> 1) i.e. memory backend created by compat glue which maps
> -m/-mem-path/-mem-prealloc/default RAM size into
> appropriate backend type/options to match old CLI format.
>
> Fixes: 900c0ba373
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> Reported-by: Lukáš Doktor <ldoktor@redhat.com>
> ---
> CC: ldoktor@redhat.com
> CC: marcandre.lureau@redhat.com
> CC: dgilbert@redhat.com
> ---
>  softmmu/vl.c | 3 +++
>  1 file changed, 3 insertions(+)
>
> diff --git a/softmmu/vl.c b/softmmu/vl.c
> index 5549f4b619..1101b1cb41 100644
> --- a/softmmu/vl.c
> +++ b/softmmu/vl.c
> @@ -2800,6 +2800,9 @@ static void create_default_memdev(MachineState *ms, const char *path)
>      object_property_set_int(obj, ms->ram_size, "size", &error_fatal);
>      object_property_add_child(object_get_objects_root(), mc->default_ram_id,
>                                obj, &error_fatal);
> +    /* Ensure backend's memory region name is equal to mc->default_ram_id */
> +    object_property_set_bool(obj, false, "x-use-canonical-path-for-ramblock-id",
> +                             &error_fatal);
>      user_creatable_complete(USER_CREATABLE(obj), &error_fatal);
>      object_unref(obj);
>      object_property_set_str(OBJECT(ms), mc->default_ram_id, "memory-backend",
> --
> 2.18.1
>
>
Igor Mammedov March 17, 2020, 4:52 p.m. UTC | #3
On Wed,  4 Mar 2020 12:27:48 -0500
Igor Mammedov <imammedo@redhat.com> wrote:

> Migration from QEMU(v4.0) fails when using 3.1 or older machine
> type. For example if one attempts to migrate
> QEMU-2.12 started as
>   qemu-system-ppc64 -nodefaults -M pseries-2.12 -m 4096 -mem-path /tmp/
> to current master, it will fail with
>   qemu-system-ppc64: Unknown ramblock "ppc_spapr.ram", cannot accept migration
>   qemu-system-ppc64: error while loading state for instance 0x0 of device 'ram'
>   qemu-system-ppc64: load of migration failed: Invalid argument
> 
> Caused by 900c0ba373 commit which switches main RAM allocation to
> memory backends and the fact in 3.1 and older QEMU, backends used
> full[***] QOM path as memory region name instead of backend's name.
> That was changed after 3.1 to use prefix-less names by default
> (fa0cb34d22) for new machine types.
> *** effectively makes main RAM memory region names defined by
> MachineClass::default_ram_id being altered with '/objects/' prefix
> and therefore migration fails as old QEMU sends prefix-less
> name while new QEMU expects name with prefix when using 3.1 and
> older machine types.
> 
> Fix it by forcing implicit[1] memory backend to always use
> prefix-less names for its memory region by setting
>   'x-use-canonical-path-for-ramblock-id'
> property to false.
> 
> 1) i.e. memory backend created by compat glue which maps
> -m/-mem-path/-mem-prealloc/default RAM size into
> appropriate backend type/options to match old CLI format.
> 
> Fixes: 900c0ba373
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> Reported-by: Lukáš Doktor <ldoktor@redhat.com>


ping,

so we don't forget to merge it

> ---
> CC: ldoktor@redhat.com
> CC: marcandre.lureau@redhat.com
> CC: dgilbert@redhat.com
> ---
>  softmmu/vl.c | 3 +++
>  1 file changed, 3 insertions(+)
> 
> diff --git a/softmmu/vl.c b/softmmu/vl.c
> index 5549f4b619..1101b1cb41 100644
> --- a/softmmu/vl.c
> +++ b/softmmu/vl.c
> @@ -2800,6 +2800,9 @@ static void create_default_memdev(MachineState *ms, const char *path)
>      object_property_set_int(obj, ms->ram_size, "size", &error_fatal);
>      object_property_add_child(object_get_objects_root(), mc->default_ram_id,
>                                obj, &error_fatal);
> +    /* Ensure backend's memory region name is equal to mc->default_ram_id */
> +    object_property_set_bool(obj, false, "x-use-canonical-path-for-ramblock-id",
> +                             &error_fatal);
>      user_creatable_complete(USER_CREATABLE(obj), &error_fatal);
>      object_unref(obj);
>      object_property_set_str(OBJECT(ms), mc->default_ram_id, "memory-backend",
Dr. David Alan Gilbert March 24, 2020, 6:59 p.m. UTC | #4
* Igor Mammedov (imammedo@redhat.com) wrote:
> On Wed,  4 Mar 2020 12:27:48 -0500
> Igor Mammedov <imammedo@redhat.com> wrote:
> 
> > Migration from QEMU(v4.0) fails when using 3.1 or older machine
> > type. For example if one attempts to migrate
> > QEMU-2.12 started as
> >   qemu-system-ppc64 -nodefaults -M pseries-2.12 -m 4096 -mem-path /tmp/
> > to current master, it will fail with
> >   qemu-system-ppc64: Unknown ramblock "ppc_spapr.ram", cannot accept migration
> >   qemu-system-ppc64: error while loading state for instance 0x0 of device 'ram'
> >   qemu-system-ppc64: load of migration failed: Invalid argument
> > 
> > Caused by 900c0ba373 commit which switches main RAM allocation to
> > memory backends and the fact in 3.1 and older QEMU, backends used
> > full[***] QOM path as memory region name instead of backend's name.
> > That was changed after 3.1 to use prefix-less names by default
> > (fa0cb34d22) for new machine types.
> > *** effectively makes main RAM memory region names defined by
> > MachineClass::default_ram_id being altered with '/objects/' prefix
> > and therefore migration fails as old QEMU sends prefix-less
> > name while new QEMU expects name with prefix when using 3.1 and
> > older machine types.
> > 
> > Fix it by forcing implicit[1] memory backend to always use
> > prefix-less names for its memory region by setting
> >   'x-use-canonical-path-for-ramblock-id'
> > property to false.
> > 
> > 1) i.e. memory backend created by compat glue which maps
> > -m/-mem-path/-mem-prealloc/default RAM size into
> > appropriate backend type/options to match old CLI format.
> > 
> > Fixes: 900c0ba373
> > Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> > Reported-by: Lukáš Doktor <ldoktor@redhat.com>
> 
> 
> ping,
> 
> so we don't forget to merge it

I'm queueing this.

> > ---
> > CC: ldoktor@redhat.com
> > CC: marcandre.lureau@redhat.com
> > CC: dgilbert@redhat.com
> > ---
> >  softmmu/vl.c | 3 +++
> >  1 file changed, 3 insertions(+)
> > 
> > diff --git a/softmmu/vl.c b/softmmu/vl.c
> > index 5549f4b619..1101b1cb41 100644
> > --- a/softmmu/vl.c
> > +++ b/softmmu/vl.c
> > @@ -2800,6 +2800,9 @@ static void create_default_memdev(MachineState *ms, const char *path)
> >      object_property_set_int(obj, ms->ram_size, "size", &error_fatal);
> >      object_property_add_child(object_get_objects_root(), mc->default_ram_id,
> >                                obj, &error_fatal);
> > +    /* Ensure backend's memory region name is equal to mc->default_ram_id */
> > +    object_property_set_bool(obj, false, "x-use-canonical-path-for-ramblock-id",
> > +                             &error_fatal);
> >      user_creatable_complete(USER_CREATABLE(obj), &error_fatal);
> >      object_unref(obj);
> >      object_property_set_str(OBJECT(ms), mc->default_ram_id, "memory-backend",
> 
> 
--
Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK
diff mbox series

Patch

diff --git a/softmmu/vl.c b/softmmu/vl.c
index 5549f4b619..1101b1cb41 100644
--- a/softmmu/vl.c
+++ b/softmmu/vl.c
@@ -2800,6 +2800,9 @@  static void create_default_memdev(MachineState *ms, const char *path)
     object_property_set_int(obj, ms->ram_size, "size", &error_fatal);
     object_property_add_child(object_get_objects_root(), mc->default_ram_id,
                               obj, &error_fatal);
+    /* Ensure backend's memory region name is equal to mc->default_ram_id */
+    object_property_set_bool(obj, false, "x-use-canonical-path-for-ramblock-id",
+                             &error_fatal);
     user_creatable_complete(USER_CREATABLE(obj), &error_fatal);
     object_unref(obj);
     object_property_set_str(OBJECT(ms), mc->default_ram_id, "memory-backend",