cpu_physical_memory_sync_dirty_bitmap: Another alignment fix
commitaa777e297c8408ee5bebc4f6a2e00071224e4a64
authorDr. David Alan Gilbert <dgilbert@redhat.com>
Wed, 3 Jan 2018 18:33:36 +0000 (3 18:33 +0000)
committerPaolo Bonzini <pbonzini@redhat.com>
Tue, 16 Jan 2018 13:54:52 +0000 (16 14:54 +0100)
tree4aebe0060032d37684d58a4c68189d3cc81bb678
parentf4bdc13e492208f4f9cad0ff1c14247dea1cd197
cpu_physical_memory_sync_dirty_bitmap: Another alignment fix

This code has an optimised, word aligned version, and a boring
unaligned version. My commit f70d345 fixed one alignment issue, but
there's another.

The optimised version operates on 'longs' dealing with (typically) 64
pages at a time, replacing the whole long by a 0 and counting the bits.
If the Ramblock is less than 64bits in length that long can contain bits
representing two different RAMBlocks, but the code will update the
bmap belinging to the 1st RAMBlock only while having updated the total
dirty page count for both.

This probably didn't matter prior to 6b6712ef which split the dirty
bitmap by RAMBlock, but now they're separate RAMBlocks we end up
with a count that doesn't match the state in the bitmaps.

Symptom:
  Migration showing a few dirty pages left to be sent constantly
  Seen on aarch64 and x86 with x86+ovmf

Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
Reported-by: Wei Huang <wei@redhat.com>
Fixes: 6b6712efccd383b48a909bee0b29e079a57601ec
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
include/exec/ram_addr.h