On Wed, Dec 18, 2024 at 05:14:11PM +0800, Yuan Liu wrote: > When compression is enabled on the migration channel and > the pages processed are all zero pages, these pages will > not be sent and updated on the target side, resulting in > incorrect memory data on the source and target sides. > > The root cause is that all compression methods call > multifd_send_prepare_common to determine whether to compress > dirty pages, but multifd_send_prepare_common does not update > the IOV of MultiFDPacket_t when all dirty pages are zero pages. > > The solution is to always update the IOV of MultiFDPacket_t > regardless of whether the dirty pages are all zero pages. > > Signed-off-by: Yuan Liu <yuan1....@intel.com> > Reviewed-by: Jason Zeng <jason.z...@intel.com>
Ouch.. thanks for digging this out. Reviewed-by: Peter Xu <pet...@redhat.com> Is this the correct Fixes tag (and copy stable for 9.0+)? Fixes: 303e6f54f9 ("migration/multifd: Implement zero page transmission on the multifd thread.") > --- > migration/multifd-nocomp.c | 3 +-- > 1 file changed, 1 insertion(+), 2 deletions(-) > > diff --git a/migration/multifd-nocomp.c b/migration/multifd-nocomp.c > index 55191152f9..2e4aaac285 100644 > --- a/migration/multifd-nocomp.c > +++ b/migration/multifd-nocomp.c > @@ -362,6 +362,7 @@ int multifd_ram_flush_and_sync(void) > bool multifd_send_prepare_common(MultiFDSendParams *p) > { > MultiFDPages_t *pages = &p->data->u.ram; > + multifd_send_prepare_header(p); > multifd_send_zero_page_detect(p); > > if (!pages->normal_num) { > @@ -369,8 +370,6 @@ bool multifd_send_prepare_common(MultiFDSendParams *p) > return false; > } > > - multifd_send_prepare_header(p); > - > return true; > } > > -- > 2.43.0 > -- Peter Xu