"Dr. David Alan Gilbert" <dgilb...@redhat.com> wrote: > * Juan Quintela (quint...@redhat.com) wrote: >> This patch adds counters and similar. Logic will be added on the >> following patch. >> >> Signed-off-by: Juan Quintela <quint...@redhat.com> >> --- >> migration/multifd.h | 13 ++++++++++++- >> migration/multifd.c | 22 +++++++++++++++++++--- >> migration/trace-events | 2 +- >> 3 files changed, 32 insertions(+), 5 deletions(-) >> >> diff --git a/migration/multifd.h b/migration/multifd.h >> index 39e55d7f05..973315b545 100644 >> --- a/migration/multifd.h >> +++ b/migration/multifd.h >> @@ -49,7 +49,10 @@ typedef struct { >> /* size of the next packet that contains pages */ >> uint32_t next_packet_size; >> uint64_t packet_num; >> - uint64_t unused[4]; /* Reserved for future use */ >> + /* zero pages */ >> + uint32_t zero_pages; > > Had you considered just adding a flag, MULTIFD_FLAG_ZERO to the packet?
I *have* to also add the flag. I was waiting for 7.0 to get out, because I still have to do the compatibility bits. Otherwise you can't migrate to an old multifd version. > >> + uint32_t unused32[1]; /* Reserved for future use */ >> + uint64_t unused64[3]; /* Reserved for future use */ >> char ramblock[256]; >> uint64_t offset[]; >> } __attribute__((packed)) MultiFDPacket_t; >> @@ -117,6 +120,10 @@ typedef struct { >> ram_addr_t *normal; >> /* num of non zero pages */ >> uint32_t normal_num; >> + /* Pages that are zero */ >> + ram_addr_t *zero; >> + /* num of zero pages */ >> + uint32_t zero_num; >> /* used for compression methods */ >> void *data; >> } MultiFDSendParams; >> @@ -162,6 +169,10 @@ typedef struct { >> ram_addr_t *normal; >> /* num of non zero pages */ >> uint32_t normal_num; >> + /* Pages that are zero */ >> + ram_addr_t *zero; >> + /* num of zero pages */ >> + uint32_t zero_num; >> /* used for de-compression methods */ >> void *data; >> } MultiFDRecvParams; >> diff --git a/migration/multifd.c b/migration/multifd.c >> index d1ab823f98..2e4dffd6c6 100644 >> --- a/migration/multifd.c >> +++ b/migration/multifd.c >> @@ -265,6 +265,7 @@ static void multifd_send_fill_packet(MultiFDSendParams >> *p) >> packet->normal_pages = 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); >> + packet->zero_pages = cpu_to_be32(p->zero_num); >> >> if (p->pages->block) { >> strncpy(packet->ramblock, p->pages->block->idstr, 256); >> @@ -327,7 +328,15 @@ static int multifd_recv_unfill_packet(MultiFDRecvParams >> *p, Error **errp) >> p->next_packet_size = be32_to_cpu(packet->next_packet_size); >> p->packet_num = be64_to_cpu(packet->packet_num); >> >> - if (p->normal_num == 0) { >> + p->zero_num = be32_to_cpu(packet->zero_pages); >> + if (p->zero_num > packet->pages_alloc - p->normal_num) { >> + error_setg(errp, "multifd: received packet " >> + "with %d zero pages and expected maximum pages are %d", >> + p->normal_num, packet->pages_alloc - p->zero_num) ; > > should that be p->zero_num, packet->pages_alloc - p->normal_num ? > (and be %u) Copy and paste error. You are right on both cases. Thanks.