On Tue, Feb 20, 2024 at 07:41:17PM -0300, Fabiano Rosas wrote: > Implement the outgoing migration side for the 'fixed-ram' capability. > > A bitmap is introduced to track which pages have been written in the > migration file. Pages are written at a fixed location for every > ramblock. Zero pages are ignored as they'd be zero in the destination > migration as well. > > The migration stream is altered to put the dirty pages for a ramblock > after its header instead of having a sequential stream of pages that > follow the ramblock headers. > > Without fixed-ram (current): With fixed-ram (new): > > --------------------- -------------------------------- > | ramblock 1 header | | ramblock 1 header | > --------------------- -------------------------------- > | ramblock 2 header | | ramblock 1 fixed-ram header | > --------------------- -------------------------------- > | ... | | padding to next 1MB boundary | > --------------------- | ... | > | ramblock n header | -------------------------------- > --------------------- | ramblock 1 pages | > | RAM_SAVE_FLAG_EOS | | ... | > --------------------- -------------------------------- > | stream of pages | | ramblock 2 header | > | (iter 1) | -------------------------------- > | ... | | ramblock 2 fixed-ram header | > --------------------- -------------------------------- > | RAM_SAVE_FLAG_EOS | | padding to next 1MB boundary | > --------------------- | ... | > | stream of pages | -------------------------------- > | (iter 2) | | ramblock 2 pages | > | ... | | ... | > --------------------- -------------------------------- > | ... | | ... | > --------------------- -------------------------------- > | RAM_SAVE_FLAG_EOS | > -------------------------------- > | ... | > -------------------------------- > > where: > - ramblock header: the generic information for a ramblock, such as > idstr, used_len, etc. > > - ramblock fixed-ram header: the new information added by this > feature: bitmap of pages written, bitmap size and offset of pages > in the migration file. > > Signed-off-by: Nikolay Borisov <nbori...@suse.com> > Signed-off-by: Fabiano Rosas <faro...@suse.de>
Reviewed-by: Peter Xu <pet...@redhat.com> Still one comment below: [...] > @@ -3187,6 +3288,18 @@ static int ram_save_complete(QEMUFile *f, void *opaque) > return ret; > } > > + if (migrate_fixed_ram()) { > + ram_save_file_bmap(f); > + > + if (qemu_file_get_error(f)) { > + Error *local_err = NULL; > + int err = qemu_file_get_error_obj(f, &local_err); > + > + error_reportf_err(local_err, "Failed to write bitmap to file: "); We always do error report if we set s->error. Ideally I think we should have Error** passed to the caller and set s->error there, instead of report here. But the whole error handling is still a bit of a mess, so I guess we can do anything on top. > + return -err; > + } > + } -- Peter Xu