On Mon, Jul 04, 2022 at 05:23:15PM -0300, Leonardo Bras wrote: > Some errors, like the lack of Scatter-Gather support by the network > interface(NETIF_F_SG) may cause sendmsg(...,MSG_ZEROCOPY) to fail on using > zero-copy, which causes it to fall back to the default copying mechanism. > > After each full dirty-bitmap scan there should be a zero-copy flush > happening, which checks for errors each of the previous calls to > sendmsg(...,MSG_ZEROCOPY). If all of them failed to use zero-copy, then > increment dirty_sync_missed_zero_copy migration stat to let the user know > about it. > > Signed-off-by: Leonardo Bras <leob...@redhat.com> > --- > migration/ram.h | 2 ++ > migration/multifd.c | 2 ++ > migration/ram.c | 5 +++++ > 3 files changed, 9 insertions(+) > > diff --git a/migration/ram.h b/migration/ram.h > index ded0a3a086..d3c7eb96f5 100644 > --- a/migration/ram.h > +++ b/migration/ram.h > @@ -87,4 +87,6 @@ void ram_write_tracking_prepare(void); > int ram_write_tracking_start(void); > void ram_write_tracking_stop(void); > > +void dirty_sync_missed_zero_copy(void); > + > #endif > diff --git a/migration/multifd.c b/migration/multifd.c > index 684c014c86..3909b34967 100644 > --- a/migration/multifd.c > +++ b/migration/multifd.c > @@ -624,6 +624,8 @@ int multifd_send_sync_main(QEMUFile *f) > if (ret < 0) { > error_report_err(err); > return -1; > + } else if (ret == 1) { > + dirty_sync_missed_zero_copy(); > } > } > }
I know that Juan is working on some patch to only do multifd_send_sync_main() for each dirty sync, but that's not landed, right? Can we name it without "dirty-sync" at all (so it'll work before/after Juan's patch will be applied)? Something like "zero-copy-send-fallbacks"? The other thing is the subject may need to be touched up as right now with the field we don't warn the user anymore on zero-copy-send fallbacks. Thanks, > diff --git a/migration/ram.c b/migration/ram.c > index 01f9cc1d72..db948c4787 100644 > --- a/migration/ram.c > +++ b/migration/ram.c > @@ -407,6 +407,11 @@ static void ram_transferred_add(uint64_t bytes) > ram_counters.transferred += bytes; > } > > +void dirty_sync_missed_zero_copy(void) > +{ > + ram_counters.dirty_sync_missed_zero_copy++; > +} > + > /* used by the search for pages to send */ > struct PageSearchStatus { > /* Current block being searched */ > -- > 2.36.1 > -- Peter Xu