On Thu, Apr 25, 2024 at 02:21:13AM +0000, Hao Xiang wrote: > Multifd sender path gets an array of pages queued by the migration > thread. It performs zero page checking on every page in the array. > The pages are classfied as either a zero page or a normal page. This > change uses Intel DSA to offload the zero page checking from CPU to > the DSA accelerator. The sender thread submits a batch of pages to DSA > hardware and waits for the DSA completion thread to signal for work > completion. > > Signed-off-by: Hao Xiang <hao.xi...@linux.dev> > --- > migration/multifd-zero-page.c | 99 +++++++++++++++++++++++++++++++++-- > migration/multifd.c | 27 +++++++++- > migration/multifd.h | 1 + > 3 files changed, 120 insertions(+), 7 deletions(-) > > diff --git a/migration/multifd-zero-page.c b/migration/multifd-zero-page.c > index e1b8370f88..4f426289e4 100644 > --- a/migration/multifd-zero-page.c > +++ b/migration/multifd-zero-page.c
> diff --git a/migration/multifd.c b/migration/multifd.c > index cfd3a92f6c..7316643d0a 100644 > --- a/migration/multifd.c > +++ b/migration/multifd.c > @@ -818,6 +818,8 @@ void multifd_send_shutdown(void) > > multifd_send_terminate_threads(); > > + dsa_cleanup(); > + > for (i = 0; i < migrate_multifd_channels(); i++) { > MultiFDSendParams *p = &multifd_send_state->params[i]; > Error *local_err = NULL; > @@ -1155,11 +1157,20 @@ bool multifd_send_setup(void) > uint32_t page_count = MULTIFD_PACKET_SIZE / qemu_target_page_size(); > bool use_packets = multifd_use_packets(); > uint8_t i; > + const char *dsa_parameter = migrate_multifd_dsa_accel(); > > if (!migrate_multifd()) { > return true; > } > > + if (dsa_init(dsa_parameter)) { > + error_setg(&local_err, "multifd: Sender failed to initialize DSA."); > + error_report_err(local_err); > + return false; > + } This is an example of why all the dsa functions need to report a via an "Error **err" parameter. The error reported here is useless as it lacks any meaningful information of what went wrong. The multifd_send_setup method itself needs a "Error **errp" param so it can pass it back up to be reoprted too. > + > + dsa_start(); > + > thread_count = migrate_multifd_channels(); > multifd_send_state = g_malloc0(sizeof(*multifd_send_state)); > multifd_send_state->params = g_new0(MultiFDSendParams, thread_count); > @@ -1393,6 +1404,7 @@ void multifd_recv_cleanup(void) > qemu_thread_join(&p->thread); > } > } > + dsa_cleanup(); > for (i = 0; i < migrate_multifd_channels(); i++) { > multifd_recv_cleanup_channel(&multifd_recv_state->params[i]); > } > @@ -1568,6 +1580,9 @@ int multifd_recv_setup(Error **errp) > uint32_t page_count = MULTIFD_PACKET_SIZE / qemu_target_page_size(); > bool use_packets = multifd_use_packets(); > uint8_t i; > + const char *dsa_parameter = migrate_multifd_dsa_accel(); > + int ret; > + Error *local_err = NULL; > > /* > * Return successfully if multiFD recv state is already initialised > @@ -1577,6 +1592,15 @@ int multifd_recv_setup(Error **errp) > return 0; > } > > + ret = dsa_init(dsa_parameter); > + if (ret != 0) { > + error_setg(&local_err, "multifd: Receiver failed to initialize > DSA."); > + error_propagate(errp, local_err); > + return ret; > + } > + > + dsa_start(); > + > thread_count = migrate_multifd_channels(); > multifd_recv_state = g_malloc0(sizeof(*multifd_recv_state)); > multifd_recv_state->params = g_new0(MultiFDRecvParams, thread_count); > @@ -1616,13 +1640,12 @@ int multifd_recv_setup(Error **errp) > > for (i = 0; i < thread_count; i++) { > MultiFDRecvParams *p = &multifd_recv_state->params[i]; > - int ret; > - > ret = multifd_recv_state->ops->recv_setup(p, errp); > if (ret) { > return ret; > } > } > + > return 0; > } > > diff --git a/migration/multifd.h b/migration/multifd.h > index 16e27db5e9..b3717fae24 100644 > --- a/migration/multifd.h > +++ b/migration/multifd.h > @@ -14,6 +14,7 @@ > #define QEMU_MIGRATION_MULTIFD_H > > #include "ram.h" > +#include "qemu/dsa.h" > > typedef struct MultiFDRecvData MultiFDRecvData; > > -- > 2.30.2 > > With regards, Daniel -- |: https://berrange.com -o- https://www.flickr.com/photos/dberrange :| |: https://libvirt.org -o- https://fstop138.berrange.com :| |: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|