From: Yuan Liu <yuan1.liu@intel.com>
To: quintela@redhat.com, peterx@redhat.com, farosas@suse.de,
leobras@redhat.com
Cc: qemu-devel@nongnu.org, yuan1.liu@intel.com, nanhai.zou@intel.com
Subject: [PATCH v3 2/4] multifd: Implement multifd compression accelerator
Date: Wed, 3 Jan 2024 19:28:49 +0800 [thread overview]
Message-ID: <20240103112851.908082-3-yuan1.liu@intel.com> (raw)
In-Reply-To: <20240103112851.908082-1-yuan1.liu@intel.com>
when starting multifd live migration, if the compression method is
enabled, compression method can be accelerated using accelerators.
Signed-off-by: Yuan Liu <yuan1.liu@intel.com>
Reviewed-by: Nanhai Zou <nanhai.zou@intel.com>
Reviewed-by: Fabiano Rosas <farosas@suse.de>
---
migration/multifd.c | 40 ++++++++++++++++++++++++++++++++++++++--
migration/multifd.h | 8 ++++++++
2 files changed, 46 insertions(+), 2 deletions(-)
diff --git a/migration/multifd.c b/migration/multifd.c
index 1fe53d3b98..8ee083b691 100644
--- a/migration/multifd.c
+++ b/migration/multifd.c
@@ -165,6 +165,36 @@ static MultiFDMethods multifd_nocomp_ops = {
static MultiFDMethods *multifd_ops[MULTIFD_COMPRESSION__MAX] = {
[MULTIFD_COMPRESSION_NONE] = &multifd_nocomp_ops,
};
+static MultiFDAccelMethods *accel_multifd_ops[MULTIFD_COMPRESSION_ACCEL__MAX];
+
+static MultiFDMethods *get_multifd_ops(void)
+{
+ MultiFDCompression comp = migrate_multifd_compression();
+ MultiFDCompressionAccel accel = migrate_multifd_compression_accel();
+
+ assert(comp < MULTIFD_COMPRESSION__MAX);
+ assert(accel < MULTIFD_COMPRESSION_ACCEL__MAX);
+ if (comp == MULTIFD_COMPRESSION_NONE ||
+ accel == MULTIFD_COMPRESSION_ACCEL_NONE) {
+ return multifd_ops[comp];
+ }
+ if (accel == MULTIFD_COMPRESSION_ACCEL_AUTO) {
+ for (int i = 0; i < MULTIFD_COMPRESSION_ACCEL__MAX; i++) {
+ if (accel_multifd_ops[i] &&
+ accel_multifd_ops[i]->is_supported(comp)) {
+ return accel_multifd_ops[i]->get_multifd_methods();
+ }
+ }
+ return multifd_ops[comp];
+ }
+
+ /* Check if a specified accelerator is available */
+ if (accel_multifd_ops[accel] &&
+ accel_multifd_ops[accel]->is_supported(comp)) {
+ return accel_multifd_ops[accel]->get_multifd_methods();
+ }
+ return multifd_ops[comp];
+}
void multifd_register_ops(int method, MultiFDMethods *ops)
{
@@ -172,6 +202,12 @@ void multifd_register_ops(int method, MultiFDMethods *ops)
multifd_ops[method] = ops;
}
+void multifd_register_accel_ops(int accel, MultiFDAccelMethods *ops)
+{
+ assert(0 < accel && accel < MULTIFD_COMPRESSION_ACCEL__MAX);
+ accel_multifd_ops[accel] = ops;
+}
+
static int multifd_send_initial_packet(MultiFDSendParams *p, Error **errp)
{
MultiFDInit_t msg = {};
@@ -922,7 +958,7 @@ int multifd_save_setup(Error **errp)
multifd_send_state->pages = multifd_pages_init(page_count);
qemu_sem_init(&multifd_send_state->channels_ready, 0);
qatomic_set(&multifd_send_state->exiting, 0);
- multifd_send_state->ops = multifd_ops[migrate_multifd_compression()];
+ multifd_send_state->ops = get_multifd_ops();
for (i = 0; i < thread_count; i++) {
MultiFDSendParams *p = &multifd_send_state->params[i];
@@ -1180,7 +1216,7 @@ int multifd_load_setup(Error **errp)
multifd_recv_state->params = g_new0(MultiFDRecvParams, thread_count);
qatomic_set(&multifd_recv_state->count, 0);
qemu_sem_init(&multifd_recv_state->sem_sync, 0);
- multifd_recv_state->ops = multifd_ops[migrate_multifd_compression()];
+ multifd_recv_state->ops = get_multifd_ops();
for (i = 0; i < thread_count; i++) {
MultiFDRecvParams *p = &multifd_recv_state->params[i];
diff --git a/migration/multifd.h b/migration/multifd.h
index a835643b48..c40ff79443 100644
--- a/migration/multifd.h
+++ b/migration/multifd.h
@@ -206,7 +206,15 @@ typedef struct {
int (*recv_pages)(MultiFDRecvParams *p, Error **errp);
} MultiFDMethods;
+typedef struct {
+ /* Check if the compression method supports acceleration */
+ bool (*is_supported) (MultiFDCompression compression);
+ /* Get multifd methods of the accelerator */
+ MultiFDMethods* (*get_multifd_methods)(void);
+} MultiFDAccelMethods;
+
void multifd_register_ops(int method, MultiFDMethods *ops);
+void multifd_register_accel_ops(int accel, MultiFDAccelMethods *ops);
#endif
--
2.39.3
next prev parent reply other threads:[~2024-01-04 3:17 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-01-03 11:28 [PATCH v3 0/4] Live Migration Acceleration with IAA Compression Yuan Liu
2024-01-03 11:28 ` [PATCH v3 1/4] migration: Introduce multifd-compression-accel parameter Yuan Liu
2024-01-03 11:28 ` Yuan Liu [this message]
2024-01-03 11:28 ` [PATCH v3 3/4] configure: add qpl option Yuan Liu
2024-01-03 11:28 ` [PATCH v3 4/4] multifd: Introduce QPL compression accelerator Yuan Liu
2024-01-29 10:42 ` [PATCH v3 0/4] Live Migration Acceleration with IAA Compression Peter Xu
2024-01-30 3:56 ` Liu, Yuan1
2024-01-30 10:32 ` Peter Xu
2024-01-31 2:08 ` Liu, Yuan1
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240103112851.908082-3-yuan1.liu@intel.com \
--to=yuan1.liu@intel.com \
--cc=farosas@suse.de \
--cc=leobras@redhat.com \
--cc=nanhai.zou@intel.com \
--cc=peterx@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=quintela@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.