qemu-devel
[Top][All Lists]
Advanced

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

[Qemu-devel] [RFC PATCH] vmstate: Enable custom migration block name che


From: Alexey Kardashevskiy
Subject: [Qemu-devel] [RFC PATCH] vmstate: Enable custom migration block name check
Date: Mon, 25 Aug 2014 20:22:01 +1000

This adds a callback to support custom names for migration blocks.

Signed-off-by: Alexey Kardashevskiy <address@hidden>
---

RFC! not a real patch!

There was a problem a while ago how to migrate sPAPR TCE tables - they
needed unique id + instance_id and there 2 approaches for that:

1. Put them on a virtual made-up TCE bus, LIOBN (logical bus number) is
an unique ID and this would give TCE tables unique names like
address@hidden/spapr_iommu, instance id would always be 0.

vmstate_spapr_tce_table would be registered via DeviceClass::vmsd pointer.

2. Do not register vmsd via DeviceClass and use explicit call of
vmstate_register() using LIOBN as an instance id. This way TCE tables would
get "spapr_iommu" name and unique id == LIOBN.

Approach 2 is used by upstream.

Both 1 and 2 were suggested by maintainers :) However with 1 month delay
and I started using 1) in our internal build of "powerkvm".

In the current version of our internal "powerkvm" thing I used 2) as this
is what upstream uses.


The proposed patch is a part of a hack to allow migration
address@hidden/spapr_iommu + 0  to   spapr_iommu + 80000000.


Is this too horrible to be considered as a patch for upstream?
I am not going to push the second part of the hack anyway.

Is there any other way to implement the hack I want without toching these files?

Thanks!


---
 include/migration/vmstate.h | 1 +
 savevm.c                    | 6 ++++++
 2 files changed, 7 insertions(+)

diff --git a/include/migration/vmstate.h b/include/migration/vmstate.h
index 2759908..86afd9a 100644
--- a/include/migration/vmstate.h
+++ b/include/migration/vmstate.h
@@ -134,6 +134,7 @@ struct VMStateDescription {
     int (*pre_load)(void *opaque);
     int (*post_load)(void *opaque, int version_id);
     void (*pre_save)(void *opaque);
+    bool (*compat_name)(void *opaque, const char *idstr, int instance_id);
     VMStateField *fields;
     const VMStateSubsection *subsections;
 };
diff --git a/savevm.c b/savevm.c
index 22123be..60e7dd8 100644
--- a/savevm.c
+++ b/savevm.c
@@ -731,6 +731,12 @@ static SaveStateEntry *find_se(const char *idstr, int 
instance_id)
                  instance_id == se->alias_id))
                 return se;
         }
+
+        /* Migrating from a weird custom version? */
+        if (se->vmsd && se->vmsd->compat_name &&
+            se->vmsd->compat_name(se->opaque, idstr, instance_id)) {
+            return se;
+        }
     }
     return NULL;
 }
-- 
2.0.0




reply via email to

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