mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-06 01:03:55 -06:00
multifd: Use normal pages array on the send side
We are only sending normal pages through multifd channels. Later on this series, we are going to also send zero pages. We are going to detect if a page is zero or non zero in the multifd channel thread, not on the main thread. So we receive an array of pages page->offset[N] And we will end with: p->normal[N - zero_pages] p->zero[zero_pages]. In this patch, we just copy all the pages in offset to normal. for (i = 0; i < pages->num; i++) { p->narmal[p->normal_num] = pages->offset[i]; p->normal_num++: } Later in the series this becomes: for (i = 0; i < pages->num; i++) { if (buffer_is_zero(page->offset[i])) { p->zerol[p->zero_num] = pages->offset[i]; p->zero_num++: } else { p->narmal[p->normal_num] = pages->offset[i]; p->normal_num++: } } Signed-off-by: Juan Quintela <quintela@redhat.com> Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com> --- Improving comment (dave) Renaming num_normal_pages to total_normal_pages (peter)
This commit is contained in:
parent
c27779a215
commit
815956f039
5 changed files with 33 additions and 21 deletions
|
@ -89,13 +89,13 @@ static int nocomp_send_prepare(MultiFDSendParams *p, Error **errp)
|
|||
MultiFDPages_t *pages = p->pages;
|
||||
size_t page_size = qemu_target_page_size();
|
||||
|
||||
for (int i = 0; i < p->pages->num; i++) {
|
||||
p->iov[p->iovs_num].iov_base = pages->block->host + pages->offset[i];
|
||||
for (int i = 0; i < p->normal_num; i++) {
|
||||
p->iov[p->iovs_num].iov_base = pages->block->host + p->normal[i];
|
||||
p->iov[p->iovs_num].iov_len = page_size;
|
||||
p->iovs_num++;
|
||||
}
|
||||
|
||||
p->next_packet_size = p->pages->num * page_size;
|
||||
p->next_packet_size = p->normal_num * page_size;
|
||||
p->flags |= MULTIFD_FLAG_NOCOMP;
|
||||
return 0;
|
||||
}
|
||||
|
@ -262,7 +262,7 @@ static void multifd_send_fill_packet(MultiFDSendParams *p)
|
|||
|
||||
packet->flags = cpu_to_be32(p->flags);
|
||||
packet->pages_alloc = cpu_to_be32(p->pages->allocated);
|
||||
packet->pages_used = cpu_to_be32(p->pages->num);
|
||||
packet->pages_used = cpu_to_be32(p->normal_num);
|
||||
packet->next_packet_size = cpu_to_be32(p->next_packet_size);
|
||||
packet->packet_num = cpu_to_be64(p->packet_num);
|
||||
|
||||
|
@ -270,9 +270,9 @@ static void multifd_send_fill_packet(MultiFDSendParams *p)
|
|||
strncpy(packet->ramblock, p->pages->block->idstr, 256);
|
||||
}
|
||||
|
||||
for (i = 0; i < p->pages->num; i++) {
|
||||
for (i = 0; i < p->normal_num; i++) {
|
||||
/* there are architectures where ram_addr_t is 32 bit */
|
||||
uint64_t temp = p->pages->offset[i];
|
||||
uint64_t temp = p->normal[i];
|
||||
|
||||
packet->offset[i] = cpu_to_be64(temp);
|
||||
}
|
||||
|
@ -559,6 +559,8 @@ void multifd_save_cleanup(void)
|
|||
p->packet = NULL;
|
||||
g_free(p->iov);
|
||||
p->iov = NULL;
|
||||
g_free(p->normal);
|
||||
p->normal = NULL;
|
||||
multifd_send_state->ops->send_cleanup(p, &local_err);
|
||||
if (local_err) {
|
||||
migrate_set_error(migrate_get_current(), local_err);
|
||||
|
@ -643,12 +645,17 @@ static void *multifd_send_thread(void *opaque)
|
|||
qemu_mutex_lock(&p->mutex);
|
||||
|
||||
if (p->pending_job) {
|
||||
uint32_t used = p->pages->num;
|
||||
uint64_t packet_num = p->packet_num;
|
||||
uint32_t flags = p->flags;
|
||||
p->iovs_num = 1;
|
||||
p->normal_num = 0;
|
||||
|
||||
if (used) {
|
||||
for (int i = 0; i < p->pages->num; i++) {
|
||||
p->normal[p->normal_num] = p->pages->offset[i];
|
||||
p->normal_num++;
|
||||
}
|
||||
|
||||
if (p->normal_num) {
|
||||
ret = multifd_send_state->ops->send_prepare(p, &local_err);
|
||||
if (ret != 0) {
|
||||
qemu_mutex_unlock(&p->mutex);
|
||||
|
@ -658,12 +665,12 @@ static void *multifd_send_thread(void *opaque)
|
|||
multifd_send_fill_packet(p);
|
||||
p->flags = 0;
|
||||
p->num_packets++;
|
||||
p->num_pages += used;
|
||||
p->total_normal_pages += p->normal_num;
|
||||
p->pages->num = 0;
|
||||
p->pages->block = NULL;
|
||||
qemu_mutex_unlock(&p->mutex);
|
||||
|
||||
trace_multifd_send(p->id, packet_num, used, flags,
|
||||
trace_multifd_send(p->id, packet_num, p->normal_num, flags,
|
||||
p->next_packet_size);
|
||||
|
||||
p->iov[0].iov_len = p->packet_len;
|
||||
|
@ -713,7 +720,7 @@ out:
|
|||
qemu_mutex_unlock(&p->mutex);
|
||||
|
||||
rcu_unregister_thread();
|
||||
trace_multifd_send_thread_end(p->id, p->num_packets, p->num_pages);
|
||||
trace_multifd_send_thread_end(p->id, p->num_packets, p->total_normal_pages);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
@ -913,6 +920,7 @@ int multifd_save_setup(Error **errp)
|
|||
p->tls_hostname = g_strdup(s->hostname);
|
||||
/* We need one extra place for the packet header */
|
||||
p->iov = g_new0(struct iovec, page_count + 1);
|
||||
p->normal = g_new0(ram_addr_t, page_count);
|
||||
socket_send_channel_create(multifd_new_send_channel_async, p);
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue