[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH COLO-Frame v17 25/34] savevm: Introduce two helper f
From: |
zhanghailiang |
Subject: |
[Qemu-devel] [PATCH COLO-Frame v17 25/34] savevm: Introduce two helper functions for save/find loadvm_handlers entry |
Date: |
Fri, 3 Jun 2016 15:52:37 +0800 |
For COLO's checkpoint process, we will do savevm/loadvm repeatedly.
So every time we call qemu_loadvm_section_start_full(), we will
add all sections information into loadvm_handlers list for one time.
There will be many instances in loadvm_handlers for one section,
and this will lead to memory leak.
We need to check if we have the section info in loadvm_handlers list
before save it. For normal migration, it is harmless.
Signed-off-by: zhanghailiang <address@hidden>
Reviewed-by: Dr. David Alan Gilbert <address@hidden>
---
v14:
- Add Reviewed-by tag
-
v13:
- New patch
---
migration/savevm.c | 56 ++++++++++++++++++++++++++++++++++++++----------------
1 file changed, 40 insertions(+), 16 deletions(-)
diff --git a/migration/savevm.c b/migration/savevm.c
index 6c21231..fd3032d 100644
--- a/migration/savevm.c
+++ b/migration/savevm.c
@@ -1718,6 +1718,37 @@ void loadvm_free_handlers(MigrationIncomingState *mis)
}
}
+static LoadStateEntry *loadvm_save_section_entry(MigrationIncomingState *mis,
+ SaveStateEntry *se,
+ uint32_t section_id,
+ uint32_t version_id)
+{
+ LoadStateEntry *le;
+
+ /* Add entry */
+ le = g_malloc0(sizeof(*le));
+
+ le->se = se;
+ le->section_id = section_id;
+ le->version_id = version_id;
+ QLIST_INSERT_HEAD(&mis->loadvm_handlers, le, entry);
+ return le;
+}
+
+static LoadStateEntry *loadvm_find_section_entry(MigrationIncomingState *mis,
+ uint32_t section_id)
+{
+ LoadStateEntry *le;
+
+ QLIST_FOREACH(le, &mis->loadvm_handlers, entry) {
+ if (le->section_id == section_id) {
+ break;
+ }
+ }
+
+ return le;
+}
+
static int
qemu_loadvm_section_start_full(QEMUFile *f, MigrationIncomingState *mis)
{
@@ -1753,16 +1784,12 @@ qemu_loadvm_section_start_full(QEMUFile *f,
MigrationIncomingState *mis)
version_id, idstr, se->version_id);
return -EINVAL;
}
-
- /* Add entry */
- le = g_malloc0(sizeof(*le));
-
- le->se = se;
- le->section_id = section_id;
- le->version_id = version_id;
- QLIST_INSERT_HEAD(&mis->loadvm_handlers, le, entry);
-
- ret = vmstate_load(f, le->se, le->version_id);
+ /* Check if we have saved this section info before, if not, save it */
+ le = loadvm_find_section_entry(mis, section_id);
+ if (!le) {
+ le = loadvm_save_section_entry(mis, se, section_id, version_id);
+ }
+ ret = vmstate_load(f, se, version_id);
if (ret < 0) {
error_report("error while loading state for instance 0x%x of"
" device '%s'", instance_id, idstr);
@@ -1785,12 +1812,9 @@ qemu_loadvm_section_part_end(QEMUFile *f,
MigrationIncomingState *mis)
section_id = qemu_get_be32(f);
trace_qemu_loadvm_state_section_partend(section_id);
- QLIST_FOREACH(le, &mis->loadvm_handlers, entry) {
- if (le->section_id == section_id) {
- break;
- }
- }
- if (le == NULL) {
+
+ le = loadvm_find_section_entry(mis, section_id);
+ if (!le) {
error_report("Unknown savevm section %d", section_id);
return -EINVAL;
}
--
1.8.3.1
- [Qemu-devel] [PATCH COLO-Frame v17 08/34] COLO: Add a new RunState RUN_STATE_COLO, (continued)
- [Qemu-devel] [PATCH COLO-Frame v17 08/34] COLO: Add a new RunState RUN_STATE_COLO, zhanghailiang, 2016/06/03
- [Qemu-devel] [PATCH COLO-Frame v17 27/34] migration/savevm: Export two helper functions for savevm process, zhanghailiang, 2016/06/03
- [Qemu-devel] [PATCH COLO-Frame v17 10/34] COLO: Load PVM's dirty pages into SVM's RAM cache temporarily, zhanghailiang, 2016/06/03
- [Qemu-devel] [PATCH COLO-Frame v17 21/34] COLO failover: Shutdown related socket fd when do failover, zhanghailiang, 2016/06/03
- [Qemu-devel] [PATCH COLO-Frame v17 03/34] COLO: migrate colo related info to secondary node, zhanghailiang, 2016/06/03
- [Qemu-devel] [PATCH COLO-Frame v17 11/34] ram/COLO: Record the dirty pages that SVM received, zhanghailiang, 2016/06/03
- [Qemu-devel] [PATCH COLO-Frame v17 18/34] COLO: Implement failover work for Primary VM, zhanghailiang, 2016/06/03
- [Qemu-devel] [PATCH COLO-Frame v17 22/34] COLO failover: Don't do failover during loading VM's state, zhanghailiang, 2016/06/03
- [Qemu-devel] [PATCH COLO-Frame v17 29/34] COLO: Split qemu_savevm_state_begin out of checkpoint process, zhanghailiang, 2016/06/03
- [Qemu-devel] [PATCH COLO-Frame v17 28/34] COLO: Separate the process of saving/loading ram and device state, zhanghailiang, 2016/06/03
- [Qemu-devel] [PATCH COLO-Frame v17 25/34] savevm: Introduce two helper functions for save/find loadvm_handlers entry,
zhanghailiang <=
- [Qemu-devel] [PATCH COLO-Frame v17 19/34] COLO: Implement failover work for Secondary VM, zhanghailiang, 2016/06/03
- [Qemu-devel] [PATCH COLO-Frame v17 24/34] COLO: Update the global runstate after going into colo state, zhanghailiang, 2016/06/03
- [Qemu-devel] [PATCH COLO-Frame v17 05/34] migration: Integrate COLO checkpoint process into loadvm, zhanghailiang, 2016/06/03
- [Qemu-devel] [PATCH COLO-Frame v17 16/34] COLO failover: Introduce a new command to trigger a failover, zhanghailiang, 2016/06/03
- [Qemu-devel] [PATCH COLO-Frame v17 17/34] COLO failover: Introduce state to record failover process, zhanghailiang, 2016/06/03
- [Qemu-devel] [PATCH COLO-Frame v17 31/34] net: Add notifier/callback for netdev init, zhanghailiang, 2016/06/03
- [Qemu-devel] [PATCH COLO-Frame v17 34/34] COLO: Add block replication into colo process, zhanghailiang, 2016/06/03
- [Qemu-devel] [PATCH COLO-Frame v17 30/34] filter-buffer: Accept zero interval, zhanghailiang, 2016/06/03
- [Qemu-devel] [PATCH COLO-Frame v17 23/34] COLO: Process shutdown command for VM in COLO state, zhanghailiang, 2016/06/03
- [Qemu-devel] [PATCH COLO-Frame v17 20/34] qmp event: Add COLO_EXIT event to notify users while exited from COLO, zhanghailiang, 2016/06/03