[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH COLO-Frame v13 31/39] savevm: Introduce two helper f
From: |
zhanghailiang |
Subject: |
[Qemu-devel] [PATCH COLO-Frame v13 31/39] savevm: Introduce two helper functions for save/find loadvm_handlers entry |
Date: |
Tue, 29 Dec 2015 15:09:27 +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>
---
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 dcfb473..7ceec2d 100644
--- a/migration/savevm.c
+++ b/migration/savevm.c
@@ -1710,6 +1710,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)
{
@@ -1745,16 +1776,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);
@@ -1777,12 +1804,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 v13 30/39] savevm: Split load vm state function qemu_loadvm_state, (continued)
- [Qemu-devel] [PATCH COLO-Frame v13 30/39] savevm: Split load vm state function qemu_loadvm_state, zhanghailiang, 2015/12/29
- [Qemu-devel] [PATCH COLO-Frame v13 39/39] COLO: Add block replication into colo process, zhanghailiang, 2015/12/29
- [Qemu-devel] [PATCH COLO-Frame v13 29/39] COLO: Update the global runstate after going into colo state, zhanghailiang, 2015/12/29
- [Qemu-devel] [PATCH COLO-Frame v13 03/39] COLO: migrate colo related info to secondary node, zhanghailiang, 2015/12/29
- [Qemu-devel] [PATCH COLO-Frame v13 35/39] filter-buffer: Accept zero interval, zhanghailiang, 2015/12/29
- [Qemu-devel] [PATCH COLO-Frame v13 37/39] filter-buffer: Introduce a helper function to release packets, zhanghailiang, 2015/12/29
- [Qemu-devel] [PATCH COLO-Frame v13 21/39] COLO failover: Introduce a new command to trigger a failover, zhanghailiang, 2015/12/29
- [Qemu-devel] [PATCH COLO-Frame v13 26/39] COLO failover: Shutdown related socket fd when do failover, zhanghailiang, 2015/12/29
- [Qemu-devel] [PATCH COLO-Frame v13 25/39] qmp event: Add COLO_EXIT event to notify users while exited from COLO, zhanghailiang, 2015/12/29
- [Qemu-devel] [PATCH COLO-Frame v13 34/39] net/filter-buffer: Add default filter-buffer for each netdev, zhanghailiang, 2015/12/29
- [Qemu-devel] [PATCH COLO-Frame v13 31/39] savevm: Introduce two helper functions for save/find loadvm_handlers entry,
zhanghailiang <=
- [Qemu-devel] [PATCH COLO-Frame v13 28/39] COLO: Process shutdown command for VM in COLO state, zhanghailiang, 2015/12/29
- [Qemu-devel] [PATCH COLO-Frame v13 36/39] filter-buffer: Introduce a helper function to enable/disable default filter, zhanghailiang, 2015/12/29
- [Qemu-devel] [PATCH COLO-Frame v13 38/39] colo: Use default buffer-filter to buffer and release packets, zhanghailiang, 2015/12/29
- [Qemu-devel] [PATCH COLO-Frame v13 06/39] migration: Integrate COLO checkpoint process into migration, zhanghailiang, 2015/12/29
- Re: [Qemu-devel] [PATCH COLO-Frame v13 00/39] COarse-grain LOck-stepping(COLO) Virtual Machines for Non-stop Service (FT), Hailiang Zhang, 2015/12/29