[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 02/27] Only try and read a VMDescription if it should
From: |
Juan Quintela |
Subject: |
[Qemu-devel] [PULL 02/27] Only try and read a VMDescription if it should be there |
Date: |
Thu, 2 Jul 2015 18:09:50 +0200 |
From: "Dr. David Alan Gilbert" <address@hidden>
The VMDescription section maybe after the EOF mark, the current code
does a 'qemu_get_byte' and either gets the header byte identifying the
description or an error (which it ignores). Doing the 'get' upsets
RDMA which hangs on old machine types without the VMDescription.
Just avoid reading the VMDescription if we wouldn't send it.
Signed-off-by: Dr. David Alan Gilbert <address@hidden>
Signed-off-by: Juan Quintela <address@hidden>
---
migration/savevm.c | 35 +++++++++++++++++++++++++++--------
1 file changed, 27 insertions(+), 8 deletions(-)
diff --git a/migration/savevm.c b/migration/savevm.c
index 9e0e286..1a9b00b 100644
--- a/migration/savevm.c
+++ b/migration/savevm.c
@@ -1127,16 +1127,35 @@ int qemu_loadvm_state(QEMUFile *f)
* Try to read in the VMDESC section as well, so that dumping tools that
* intercept our migration stream have the chance to see it.
*/
- if (qemu_get_byte(f) == QEMU_VM_VMDESCRIPTION) {
- uint32_t size = qemu_get_be32(f);
- uint8_t *buf = g_malloc(0x1000);
- while (size > 0) {
- uint32_t read_chunk = MIN(size, 0x1000);
- qemu_get_buffer(f, buf, read_chunk);
- size -= read_chunk;
+ /* We've got to be careful; if we don't read the data and just shut the fd
+ * then the sender can error if we close while it's still sending.
+ * We also mustn't read data that isn't there; some transports (RDMA)
+ * will stall waiting for that data when the source has already closed.
+ */
+ if (should_send_vmdesc()) {
+ uint8_t *buf;
+ uint32_t size;
+ section_type = qemu_get_byte(f);
+
+ if (section_type != QEMU_VM_VMDESCRIPTION) {
+ error_report("Expected vmdescription section, but got %d",
+ section_type);
+ /*
+ * It doesn't seem worth failing at this point since
+ * we apparently have an otherwise valid VM state
+ */
+ } else {
+ buf = g_malloc(0x1000);
+ size = qemu_get_be32(f);
+
+ while (size > 0) {
+ uint32_t read_chunk = MIN(size, 0x1000);
+ qemu_get_buffer(f, buf, read_chunk);
+ size -= read_chunk;
+ }
+ g_free(buf);
}
- g_free(buf);
}
cpu_synchronize_all_post_init();
--
2.4.3
- [Qemu-devel] [PULL v2 00/27] Migration pull request, Juan Quintela, 2015/07/02
- [Qemu-devel] [PULL 01/27] rdma: fix memory leak, Juan Quintela, 2015/07/02
- [Qemu-devel] [PULL 02/27] Only try and read a VMDescription if it should be there,
Juan Quintela <=
- [Qemu-devel] [PULL 03/27] rdma typos, Juan Quintela, 2015/07/02
- [Qemu-devel] [PULL 04/27] Store block name in local blocks structure, Juan Quintela, 2015/07/02
- [Qemu-devel] [PULL 07/27] Allow rdma_delete_block to work without the hash, Juan Quintela, 2015/07/02
- [Qemu-devel] [PULL 06/27] Rework ram_control_load_hook to hook during block load, Juan Quintela, 2015/07/02
- [Qemu-devel] [PULL 08/27] Rework ram block hash, Juan Quintela, 2015/07/02
- [Qemu-devel] [PULL 05/27] Translate offsets to destination address space, Juan Quintela, 2015/07/02
- [Qemu-devel] [PULL 10/27] Sanity check RDMA remote data, Juan Quintela, 2015/07/02
- [Qemu-devel] [PULL 09/27] Sort destination RAMBlocks to be the same as the source, Juan Quintela, 2015/07/02
- [Qemu-devel] [PULL 11/27] Fail more cleanly in mismatched RAM cases, Juan Quintela, 2015/07/02
- [Qemu-devel] [PULL 12/27] Fix older machine type compatibility on power with section footers, Juan Quintela, 2015/07/02