migration/multifd: Reduce access to p->pages

I'm about to replace the p->pages pointer with an opaque pointer, so
do a cleanup now to reduce direct accesses to p->page, which makes the
next diffs cleaner.

Reviewed-by: Peter Xu <peterx@redhat.com>
Signed-off-by: Fabiano Rosas <farosas@suse.de>
This commit is contained in:
Fabiano Rosas 2024-08-27 14:45:48 -03:00
parent 854f67fa38
commit bc112a6c90
5 changed files with 19 additions and 15 deletions

View file

@ -404,13 +404,14 @@ retry:
static void multifd_qpl_compress_pages_slow_path(MultiFDSendParams *p) static void multifd_qpl_compress_pages_slow_path(MultiFDSendParams *p)
{ {
QplData *qpl = p->compress_data; QplData *qpl = p->compress_data;
MultiFDPages_t *pages = p->pages;
uint32_t size = p->page_size; uint32_t size = p->page_size;
qpl_job *job = qpl->sw_job; qpl_job *job = qpl->sw_job;
uint8_t *zbuf = qpl->zbuf; uint8_t *zbuf = qpl->zbuf;
uint8_t *buf; uint8_t *buf;
for (int i = 0; i < p->pages->normal_num; i++) { for (int i = 0; i < pages->normal_num; i++) {
buf = p->pages->block->host + p->pages->offset[i]; buf = pages->block->host + pages->offset[i];
multifd_qpl_prepare_comp_job(job, buf, zbuf, size); multifd_qpl_prepare_comp_job(job, buf, zbuf, size);
if (qpl_execute_job(job) == QPL_STS_OK) { if (qpl_execute_job(job) == QPL_STS_OK) {
multifd_qpl_fill_packet(i, p, zbuf, job->total_out); multifd_qpl_fill_packet(i, p, zbuf, job->total_out);
@ -498,6 +499,7 @@ static void multifd_qpl_compress_pages(MultiFDSendParams *p)
static int multifd_qpl_send_prepare(MultiFDSendParams *p, Error **errp) static int multifd_qpl_send_prepare(MultiFDSendParams *p, Error **errp)
{ {
QplData *qpl = p->compress_data; QplData *qpl = p->compress_data;
MultiFDPages_t *pages = p->pages;
uint32_t len = 0; uint32_t len = 0;
if (!multifd_send_prepare_common(p)) { if (!multifd_send_prepare_common(p)) {
@ -505,7 +507,7 @@ static int multifd_qpl_send_prepare(MultiFDSendParams *p, Error **errp)
} }
/* The first IOV is used to store the compressed page lengths */ /* The first IOV is used to store the compressed page lengths */
len = p->pages->normal_num * sizeof(uint32_t); len = pages->normal_num * sizeof(uint32_t);
multifd_qpl_fill_iov(p, (uint8_t *) qpl->zlen, len); multifd_qpl_fill_iov(p, (uint8_t *) qpl->zlen, len);
if (qpl->hw_avail) { if (qpl->hw_avail) {
multifd_qpl_compress_pages(p); multifd_qpl_compress_pages(p);

View file

@ -174,19 +174,20 @@ static int multifd_uadk_send_prepare(MultiFDSendParams *p, Error **errp)
uint32_t hdr_size; uint32_t hdr_size;
uint8_t *buf = uadk_data->buf; uint8_t *buf = uadk_data->buf;
int ret = 0; int ret = 0;
MultiFDPages_t *pages = p->pages;
if (!multifd_send_prepare_common(p)) { if (!multifd_send_prepare_common(p)) {
goto out; goto out;
} }
hdr_size = p->pages->normal_num * sizeof(uint32_t); hdr_size = pages->normal_num * sizeof(uint32_t);
/* prepare the header that stores the lengths of all compressed data */ /* prepare the header that stores the lengths of all compressed data */
prepare_next_iov(p, uadk_data->buf_hdr, hdr_size); prepare_next_iov(p, uadk_data->buf_hdr, hdr_size);
for (int i = 0; i < p->pages->normal_num; i++) { for (int i = 0; i < pages->normal_num; i++) {
struct wd_comp_req creq = { struct wd_comp_req creq = {
.op_type = WD_DIR_COMPRESS, .op_type = WD_DIR_COMPRESS,
.src = p->pages->block->host + p->pages->offset[i], .src = pages->block->host + pages->offset[i],
.src_len = p->page_size, .src_len = p->page_size,
.dst = buf, .dst = buf,
/* Set dst_len to double the src in case compressed out >= page_size */ /* Set dst_len to double the src in case compressed out >= page_size */
@ -214,7 +215,7 @@ static int multifd_uadk_send_prepare(MultiFDSendParams *p, Error **errp)
*/ */
if (!uadk_data->handle || creq.dst_len >= p->page_size) { if (!uadk_data->handle || creq.dst_len >= p->page_size) {
uadk_data->buf_hdr[i] = cpu_to_be32(p->page_size); uadk_data->buf_hdr[i] = cpu_to_be32(p->page_size);
prepare_next_iov(p, p->pages->block->host + p->pages->offset[i], prepare_next_iov(p, pages->block->host + pages->offset[i],
p->page_size); p->page_size);
buf += p->page_size; buf += p->page_size;
} }

View file

@ -147,7 +147,7 @@ static int zlib_send_prepare(MultiFDSendParams *p, Error **errp)
* with compression. zlib does not guarantee that this is safe, * with compression. zlib does not guarantee that this is safe,
* therefore copy the page before calling deflate(). * therefore copy the page before calling deflate().
*/ */
memcpy(z->buf, p->pages->block->host + pages->offset[i], p->page_size); memcpy(z->buf, pages->block->host + pages->offset[i], p->page_size);
zs->avail_in = p->page_size; zs->avail_in = p->page_size;
zs->next_in = z->buf; zs->next_in = z->buf;

View file

@ -138,7 +138,7 @@ static int zstd_send_prepare(MultiFDSendParams *p, Error **errp)
if (i == pages->normal_num - 1) { if (i == pages->normal_num - 1) {
flush = ZSTD_e_flush; flush = ZSTD_e_flush;
} }
z->in.src = p->pages->block->host + pages->offset[i]; z->in.src = pages->block->host + pages->offset[i];
z->in.size = p->page_size; z->in.size = p->page_size;
z->in.pos = 0; z->in.pos = 0;

View file

@ -114,11 +114,11 @@ static void multifd_set_file_bitmap(MultiFDSendParams *p)
assert(pages->block); assert(pages->block);
for (int i = 0; i < p->pages->normal_num; i++) { for (int i = 0; i < pages->normal_num; i++) {
ramblock_set_file_bmap_atomic(pages->block, pages->offset[i], true); ramblock_set_file_bmap_atomic(pages->block, pages->offset[i], true);
} }
for (int i = p->pages->normal_num; i < p->pages->num; i++) { for (int i = pages->normal_num; i < pages->num; i++) {
ramblock_set_file_bmap_atomic(pages->block, pages->offset[i], false); ramblock_set_file_bmap_atomic(pages->block, pages->offset[i], false);
} }
} }
@ -417,7 +417,7 @@ void multifd_send_fill_packet(MultiFDSendParams *p)
int i; int i;
packet->flags = cpu_to_be32(p->flags); packet->flags = cpu_to_be32(p->flags);
packet->pages_alloc = cpu_to_be32(p->pages->allocated); packet->pages_alloc = cpu_to_be32(pages->allocated);
packet->normal_pages = cpu_to_be32(pages->normal_num); packet->normal_pages = cpu_to_be32(pages->normal_num);
packet->zero_pages = cpu_to_be32(zero_num); packet->zero_pages = cpu_to_be32(zero_num);
packet->next_packet_size = cpu_to_be32(p->next_packet_size); packet->next_packet_size = cpu_to_be32(p->next_packet_size);
@ -953,7 +953,7 @@ static void *multifd_send_thread(void *opaque)
if (migrate_mapped_ram()) { if (migrate_mapped_ram()) {
ret = file_write_ramblock_iov(p->c, p->iov, p->iovs_num, ret = file_write_ramblock_iov(p->c, p->iov, p->iovs_num,
p->pages->block, &local_err); pages->block, &local_err);
} else { } else {
ret = qio_channel_writev_full_all(p->c, p->iov, p->iovs_num, ret = qio_channel_writev_full_all(p->c, p->iov, p->iovs_num,
NULL, 0, p->write_flags, NULL, 0, p->write_flags,
@ -969,7 +969,7 @@ static void *multifd_send_thread(void *opaque)
stat64_add(&mig_stats.normal_pages, pages->normal_num); stat64_add(&mig_stats.normal_pages, pages->normal_num);
stat64_add(&mig_stats.zero_pages, pages->num - pages->normal_num); stat64_add(&mig_stats.zero_pages, pages->num - pages->normal_num);
multifd_pages_reset(p->pages); multifd_pages_reset(pages);
p->next_packet_size = 0; p->next_packet_size = 0;
/* /*
@ -1690,9 +1690,10 @@ void multifd_recv_new_channel(QIOChannel *ioc, Error **errp)
bool multifd_send_prepare_common(MultiFDSendParams *p) bool multifd_send_prepare_common(MultiFDSendParams *p)
{ {
MultiFDPages_t *pages = p->pages;
multifd_send_zero_page_detect(p); multifd_send_zero_page_detect(p);
if (!p->pages->normal_num) { if (!pages->normal_num) {
p->next_packet_size = 0; p->next_packet_size = 0;
return false; return false;
} }