aboutsummaryrefslogtreecommitdiff
path: root/scripts/analyze-migration.py
diff options
context:
space:
mode:
authorFabiano Rosas <farosas@suse.de>2025-01-09 15:52:45 -0300
committerFabiano Rosas <farosas@suse.de>2025-01-09 17:39:33 -0300
commit69d1f784569fdb950f2923c3b6d00d7c1b71acc1 (patch)
treeffa4a3edb803bf0c6b9d5a3a495f8809bbeaaa7d /scripts/analyze-migration.py
parent2aead53d39b828f8d9d0769ffa3579dadd64d846 (diff)
downloadqemu-69d1f784569fdb950f2923c3b6d00d7c1b71acc1.zip
qemu-69d1f784569fdb950f2923c3b6d00d7c1b71acc1.tar.gz
qemu-69d1f784569fdb950f2923c3b6d00d7c1b71acc1.tar.bz2
migration: Fix parsing of s390 stream
The parsing for the S390StorageAttributes section is currently leaving an unconsumed token that is later interpreted by the generic code as QEMU_VM_EOF, cutting the parsing short. The migration will issue a STATTR_FLAG_DONE between iterations, which the script consumes correctly, but there's a final STATTR_FLAG_EOS at .save_complete that the script is ignoring. Since the EOS flag is a u64 0x1ULL and the stream is big endian, on little endian hosts a byte read from it will be 0x0, the same as QEMU_VM_EOF. Fixes: 81c2c9dd5d ("tests/qtest/migration-test: Fix analyze-migration.py for s390x") Reviewed-by: Peter Xu <peterx@redhat.com> Message-Id: <20250109185249.23952-4-farosas@suse.de> Signed-off-by: Fabiano Rosas <farosas@suse.de>
Diffstat (limited to 'scripts/analyze-migration.py')
-rwxr-xr-xscripts/analyze-migration.py18
1 files changed, 17 insertions, 1 deletions
diff --git a/scripts/analyze-migration.py b/scripts/analyze-migration.py
index f2457b1..fcda11f 100755
--- a/scripts/analyze-migration.py
+++ b/scripts/analyze-migration.py
@@ -65,6 +65,9 @@ class MigrationFile(object):
def tell(self):
return self.file.tell()
+ def seek(self, a, b):
+ return self.file.seek(a, b)
+
# The VMSD description is at the end of the file, after EOF. Look for
# the last NULL byte, then for the beginning brace of JSON.
def read_migration_debug_json(self):
@@ -272,11 +275,24 @@ class S390StorageAttributes(object):
self.section_key = section_key
def read(self):
+ pos = 0
while True:
addr_flags = self.file.read64()
flags = addr_flags & 0xfff
- if (flags & (self.STATTR_FLAG_DONE | self.STATTR_FLAG_EOS)):
+
+ if flags & self.STATTR_FLAG_DONE:
+ pos = self.file.tell()
+ continue
+ elif flags & self.STATTR_FLAG_EOS:
return
+ else:
+ # No EOS came after DONE, that's OK, but rewind the
+ # stream because this is not our data.
+ if pos:
+ self.file.seek(pos, os.SEEK_SET)
+ return
+ raise Exception("Unknown flags %x", flags)
+
if (flags & self.STATTR_FLAG_ERROR):
raise Exception("Error in migration stream")
count = self.file.read64()