From: Fabiano Rosas <farosas@suse.de>
To: Shameer Kolothum <shameerali.kolothum.thodi@huawei.com>,
peterx@redhat.com, yuan1.liu@intel.com
Cc: qemu-devel@nongnu.org, linuxarm@huawei.com,
linwenkai6@hisilicon.com, zhangfei.gao@linaro.org,
huangchenghai2@huawei.com
Subject: Re: [PATCH 4/7] migration/multifd: Add UADK initialization
Date: Wed, 05 Jun 2024 11:58:02 -0300 [thread overview]
Message-ID: <87zfrzfnd1.fsf@suse.de> (raw)
In-Reply-To: <20240529094435.11140-5-shameerali.kolothum.thodi@huawei.com>
Shameer Kolothum via <qemu-devel@nongnu.org> writes:
> Initialize UADK session and allocate buffers required. The actual
> compression/decompression will only be done in a subsequent patch.
>
> Signed-off-by: Shameer Kolothum <shameerali.kolothum.thodi@huawei.com>
> ---
> migration/multifd-uadk.c | 207 ++++++++++++++++++++++++++++++++++++++-
> 1 file changed, 206 insertions(+), 1 deletion(-)
>
> diff --git a/migration/multifd-uadk.c b/migration/multifd-uadk.c
> index c2bb07535b..3172e4d5ca 100644
> --- a/migration/multifd-uadk.c
> +++ b/migration/multifd-uadk.c
> @@ -12,9 +12,214 @@
>
> #include "qemu/osdep.h"
> #include "qemu/module.h"
> +#include "qapi/error.h"
> +#include "migration.h"
> +#include "multifd.h"
> +#include "options.h"
> +#include "uadk/wd_comp.h"
> +#include "uadk/wd_sched.h"
> +
> +struct wd_data {
> + handle_t handle;
> + uint8_t *buf;
> + uint32_t *buf_hdr;
> +};
> +
> +static bool uadk_hw_initialised(void)
The first time this is called it will actually do the initialization,
no? If so, it should be uadk_hw_init().
> +{
> + char alg[] = "zlib";
> + int ret;
> +
> + ret = wd_comp_init2(alg, SCHED_POLICY_RR, TASK_HW);
> + if (ret && ret != -WD_EEXIST) {
> + return false;
> + } else {
> + return true;
> + }
> +}
> +
> +static struct wd_data *multifd_uadk_init_sess(uint32_t count,
> + uint32_t page_size,
> + bool compress, Error **errp)
> +{
> + struct wd_comp_sess_setup ss = {0};
> + struct sched_params param = {0};
> + uint32_t size = count * page_size;
> + struct wd_data *wd;
> +
> + if (!uadk_hw_initialised()) {
> + error_setg(errp, "multifd: UADK hardware not available");
Does the lib provide a software fallback path that we could use like QPL
does?
> + return NULL;
> + }
> +
> + wd = g_new0(struct wd_data, 1);
> + ss.alg_type = WD_ZLIB;
> + if (compress) {
> + ss.op_type = WD_DIR_COMPRESS;
> + /* Add an additional page for handling output > input */
> + size += page_size;
> + } else {
> + ss.op_type = WD_DIR_DECOMPRESS;
> + }
> + param.type = ss.op_type;
> + ss.sched_param = ¶m;
What about window size and compression level? Don't we need to set them
here? What do they default to?
> +
> + wd->handle = wd_comp_alloc_sess(&ss);
> + if (!wd->handle) {
> + error_setg(errp, "multifd: failed wd_comp_alloc_sess");
> + goto out;
> + }
> +
> + wd->buf = g_try_malloc(size);
> + if (!wd->buf) {
> + error_setg(errp, "multifd: out of mem for uadk buf");
> + goto out_free_sess;
> + }
> + wd->buf_hdr = g_new0(uint32_t, count);
> + return wd;
> +
> +out_free_sess:
> + wd_comp_free_sess(wd->handle);
> +out:
> + wd_comp_uninit2();
> + g_free(wd);
> + return NULL;
> +}
> +
> +static void multifd_uadk_uninit_sess(struct wd_data *wd)
> +{
> + wd_comp_free_sess(wd->handle);
> + wd_comp_uninit2();
> + g_free(wd->buf);
> + g_free(wd->buf_hdr);
> + g_free(wd);
> +}
> +
> +/**
> + * multifd_uadk_send_setup: setup send side
> + *
> + * Returns 0 for success or -1 for error
> + *
> + * @p: Params for the channel that we are using
> + * @errp: pointer to an error
> + */
> +static int multifd_uadk_send_setup(MultiFDSendParams *p, Error **errp)
> +{
> + struct wd_data *wd;
> +
> + wd = multifd_uadk_init_sess(p->page_count, p->page_size, true, errp);
> + if (!wd) {
> + return -1;
> + }
> +
> + p->compress_data = wd;
> + assert(p->iov == NULL);
> + /*
> + * Each page will be compressed independently and sent using an IOV. The
> + * additional two IOVs are used to store packet header and compressed data
> + * length
> + */
> +
> + p->iov = g_new0(struct iovec, p->page_count + 2);
> + return 0;
> +}
> +
> +/**
> + * multifd_uadk_send_cleanup: cleanup send side
> + *
> + * Close the channel and return memory.
> + *
> + * @p: Params for the channel that we are using
> + * @errp: pointer to an error
> + */
> +static void multifd_uadk_send_cleanup(MultiFDSendParams *p, Error **errp)
> +{
> + struct wd_data *wd = p->compress_data;
> +
> + multifd_uadk_uninit_sess(wd);
> + p->compress_data = NULL;
> +}
> +
> +/**
> + * multifd_uadk_send_prepare: prepare data to be able to send
> + *
> + * Create a compressed buffer with all the pages that we are going to
> + * send.
> + *
> + * Returns 0 for success or -1 for error
> + *
> + * @p: Params for the channel that we are using
> + * @errp: pointer to an error
> + */
> +static int multifd_uadk_send_prepare(MultiFDSendParams *p, Error **errp)
> +{
> + return -1;
> +}
> +
> +/**
> + * multifd_uadk_recv_setup: setup receive side
> + *
> + * Create the compressed channel and buffer.
> + *
> + * Returns 0 for success or -1 for error
> + *
> + * @p: Params for the channel that we are using
> + * @errp: pointer to an error
> + */
> +static int multifd_uadk_recv_setup(MultiFDRecvParams *p, Error **errp)
> +{
> + struct wd_data *wd;
> +
> + wd = multifd_uadk_init_sess(p->page_count, p->page_size, false, errp);
> + if (!wd) {
> + return -1;
> + }
> + p->compress_data = wd;
> + return 0;
> +}
> +
> +/**
> + * multifd_uadk_recv_cleanup: setup receive side
> + *
> + * For no compression this function does nothing.
This line makes no sense here.
> + *
> + * @p: Params for the channel that we are using
> + */
> +static void multifd_uadk_recv_cleanup(MultiFDRecvParams *p)
> +{
> + struct wd_data *wd = p->compress_data;
> +
> + multifd_uadk_uninit_sess(wd);
> + p->compress_data = NULL;
> +}
> +
> +/**
> + * multifd_uadk_recv: read the data from the channel into actual pages
> + *
> + * Read the compressed buffer, and uncompress it into the actual
> + * pages.
> + *
> + * Returns 0 for success or -1 for error
> + *
> + * @p: Params for the channel that we are using
> + * @errp: pointer to an error
> + */
> +static int multifd_uadk_recv(MultiFDRecvParams *p, Error **errp)
> +{
> + return -1;
> +}
> +
> +static MultiFDMethods multifd_uadk_ops = {
> + .send_setup = multifd_uadk_send_setup,
> + .send_cleanup = multifd_uadk_send_cleanup,
> + .send_prepare = multifd_uadk_send_prepare,
> + .recv_setup = multifd_uadk_recv_setup,
> + .recv_cleanup = multifd_uadk_recv_cleanup,
> + .recv = multifd_uadk_recv,
> +};
>
> static void multifd_uadk_register(void)
> {
> - /* noop for now */
> + multifd_register_ops(MULTIFD_COMPRESSION_UADK, &multifd_uadk_ops);
> }
> migration_init(multifd_uadk_register);
next prev parent reply other threads:[~2024-06-05 14:58 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-05-29 9:44 [PATCH 0/7] Live migration acceleration with UADK Shameer Kolothum via
2024-05-29 9:44 ` [PATCH 1/7] docs/migration: add uadk compression feature Shameer Kolothum via
2024-05-30 13:25 ` Liu, Yuan1
2024-05-30 14:01 ` Shameerali Kolothum Thodi via
2024-05-30 14:13 ` Liu, Yuan1
2024-06-05 18:59 ` Fabiano Rosas
2024-05-29 9:44 ` [PATCH 2/7] configure: Add uadk option Shameer Kolothum via
2024-06-04 21:25 ` Fabiano Rosas
2024-05-29 9:44 ` [PATCH 3/7] migration/multifd: add uadk compression framework Shameer Kolothum via
2024-05-29 11:10 ` Markus Armbruster
2024-05-30 6:56 ` Shameerali Kolothum Thodi via
2024-06-04 21:24 ` Fabiano Rosas
2024-05-29 9:44 ` [PATCH 4/7] migration/multifd: Add UADK initialization Shameer Kolothum via
2024-06-05 14:58 ` Fabiano Rosas [this message]
2024-06-05 15:17 ` Shameerali Kolothum Thodi via
2024-05-29 9:44 ` [PATCH 5/7] migration/multifd: Add UADK based compression and decompression Shameer Kolothum via
2024-06-05 18:57 ` Fabiano Rosas
2024-06-06 7:11 ` Shameerali Kolothum Thodi via
2024-05-29 9:44 ` [PATCH 6/7] migration/multifd: Switch to no compression when no hardware support Shameer Kolothum via
2024-06-05 19:08 ` Fabiano Rosas
2024-05-29 9:44 ` [PATCH 7/7] tests/migration-test: add uadk compression test Shameer Kolothum via
2024-06-05 19:18 ` Fabiano Rosas
2024-06-04 20:59 ` [PATCH 0/7] Live migration acceleration with UADK Peter Xu
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=87zfrzfnd1.fsf@suse.de \
--to=farosas@suse.de \
--cc=huangchenghai2@huawei.com \
--cc=linuxarm@huawei.com \
--cc=linwenkai6@hisilicon.com \
--cc=peterx@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=shameerali.kolothum.thodi@huawei.com \
--cc=yuan1.liu@intel.com \
--cc=zhangfei.gao@linaro.org \
/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.