| From ab6262bd4829e3bd6437fe32737209df2af2d141 Mon Sep 17 00:00:00 2001 |
| From: Juan Quintela <quintela@redhat.com> |
| Date: Wed, 18 May 2022 02:52:23 -0300 |
| Subject: [PATCH 08/37] multifd: Make zstd compression method not use iovs |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| RH-Author: Leonardo Brás <leobras@redhat.com> |
| RH-MergeRequest: 191: MSG_ZEROCOPY + Multifd @ rhel8.7 |
| RH-Commit: [8/26] 010579fa73b5a4c6fd631dc9fbaf6f974974bc99 |
| RH-Bugzilla: 2072049 |
| RH-Acked-by: Peter Xu <peterx@redhat.com> |
| RH-Acked-by: Daniel P. Berrangé <berrange@redhat.com> |
| RH-Acked-by: Dr. David Alan Gilbert <dgilbert@redhat.com> |
| |
| Signed-off-by: Juan Quintela <quintela@redhat.com> |
| Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com> |
| (cherry picked from commit f5ff548774c22b34a0c0e2fef85f1be11160d774) |
| Signed-off-by: Leonardo Bras <leobras@redhat.com> |
| |
| migration/multifd-zstd.c | 20 ++++++++++---------- |
| 1 file changed, 10 insertions(+), 10 deletions(-) |
| |
| diff --git a/migration/multifd-zstd.c b/migration/multifd-zstd.c |
| index f0d1105792..d9ed42622b 100644 |
| |
| |
| @@ -13,6 +13,7 @@ |
| #include "qemu/osdep.h" |
| #include <zstd.h> |
| #include "qemu/rcu.h" |
| +#include "exec/ramblock.h" |
| #include "exec/target_page.h" |
| #include "qapi/error.h" |
| #include "migration.h" |
| @@ -113,8 +114,8 @@ static void zstd_send_cleanup(MultiFDSendParams *p, Error **errp) |
| */ |
| static int zstd_send_prepare(MultiFDSendParams *p, Error **errp) |
| { |
| - struct iovec *iov = p->pages->iov; |
| struct zstd_data *z = p->data; |
| + size_t page_size = qemu_target_page_size(); |
| int ret; |
| uint32_t i; |
| |
| @@ -128,8 +129,8 @@ static int zstd_send_prepare(MultiFDSendParams *p, Error **errp) |
| if (i == p->pages->num - 1) { |
| flush = ZSTD_e_flush; |
| } |
| - z->in.src = iov[i].iov_base; |
| - z->in.size = iov[i].iov_len; |
| + z->in.src = p->pages->block->host + p->pages->offset[i]; |
| + z->in.size = page_size; |
| z->in.pos = 0; |
| |
| /* |
| @@ -261,7 +262,8 @@ static int zstd_recv_pages(MultiFDRecvParams *p, Error **errp) |
| { |
| uint32_t in_size = p->next_packet_size; |
| uint32_t out_size = 0; |
| - uint32_t expected_size = p->pages->num * qemu_target_page_size(); |
| + size_t page_size = qemu_target_page_size(); |
| + uint32_t expected_size = p->pages->num * page_size; |
| uint32_t flags = p->flags & MULTIFD_FLAG_COMPRESSION_MASK; |
| struct zstd_data *z = p->data; |
| int ret; |
| @@ -283,10 +285,8 @@ static int zstd_recv_pages(MultiFDRecvParams *p, Error **errp) |
| z->in.pos = 0; |
| |
| for (i = 0; i < p->pages->num; i++) { |
| - struct iovec *iov = &p->pages->iov[i]; |
| - |
| - z->out.dst = iov->iov_base; |
| - z->out.size = iov->iov_len; |
| + z->out.dst = p->pages->block->host + p->pages->offset[i]; |
| + z->out.size = page_size; |
| z->out.pos = 0; |
| |
| /* |
| @@ -300,8 +300,8 @@ static int zstd_recv_pages(MultiFDRecvParams *p, Error **errp) |
| do { |
| ret = ZSTD_decompressStream(z->zds, &z->out, &z->in); |
| } while (ret > 0 && (z->in.size - z->in.pos > 0) |
| - && (z->out.pos < iov->iov_len)); |
| - if (ret > 0 && (z->out.pos < iov->iov_len)) { |
| + && (z->out.pos < page_size)); |
| + if (ret > 0 && (z->out.pos < page_size)) { |
| error_setg(errp, "multifd %d: decompressStream buffer too small", |
| p->id); |
| return -1; |
| -- |
| 2.35.3 |
| |