Re: [Qemu-devel] [PATCH v5 12/17] migration: Send the fd number which we are going to use for this page
On 17/07/2017 15:42, Juan Quintela wrote: > We are still sending the page through the main channel, that would > change later in the series > > Signed-off-by: Juan Quintela > --- > migration/ram.c | 13 +++-- > 1 file changed, 11 insertions(+), 2 deletions(-) > > diff --git a/migration/ram.c b/migration/ram.c > index 90e1bcb..ac0742f 100644 > --- a/migration/ram.c > +++ b/migration/ram.c > @@ -568,7 +568,7 @@ static int multifd_send_page(uint8_t *address) > qemu_mutex_unlock(&p->mutex); > qemu_sem_post(&p->sem); > > -return 0; > +return i; > } > > struct MultiFDRecvParams { > @@ -1143,6 +1143,7 @@ static int ram_multifd_page(RAMState *rs, > PageSearchStatus *pss, > bool last_stage) > { > int pages; > +uint16_t fd_num; > uint8_t *p; > RAMBlock *block = pss->block; > ram_addr_t offset = pss->page << TARGET_PAGE_BITS; > @@ -1154,8 +1155,10 @@ static int ram_multifd_page(RAMState *rs, > PageSearchStatus *pss, > ram_counters.transferred += > save_page_header(rs, rs->f, block, > offset | RAM_SAVE_FLAG_MULTIFD_PAGE); > +fd_num = multifd_send_page(p); > +qemu_put_be16(rs->f, fd_num); > +ram_counters.transferred += 2; /* size of fd_num */ > qemu_put_buffer(rs->f, p, TARGET_PAGE_SIZE); > -multifd_send_page(p); > ram_counters.transferred += TARGET_PAGE_SIZE; > pages = 1; > ram_counters.normal++; > @@ -2905,6 +2908,7 @@ static int ram_load(QEMUFile *f, void *opaque, int > version_id) > while (!postcopy_running && !ret && !(flags & RAM_SAVE_FLAG_EOS)) { > ram_addr_t addr, total_ram_bytes; > void *host = NULL; > +uint16_t fd_num; > uint8_t ch; > > addr = qemu_get_be64(f); > @@ -3015,6 +3019,11 @@ static int ram_load(QEMUFile *f, void *opaque, int > version_id) > break; > > case RAM_SAVE_FLAG_MULTIFD_PAGE: > +fd_num = qemu_get_be16(f); > +if (fd_num != 0) { > +/* this is yet an unused variable, changed later */ > +fd_num = fd_num; > +} > qemu_get_buffer(f, host, TARGET_PAGE_SIZE); > break; > > I'm still not convinced of doing this instead of just treating all sockets equivalently (and flushing them all when the main socket is told that there is a new block). Paolo
Re: [Qemu-devel] [PATCH v5 12/17] migration: Send the fd number which we are going to use for this page
* Juan Quintela (quint...@redhat.com) wrote: > We are still sending the page through the main channel, that would > change later in the series > > Signed-off-by: Juan Quintela > --- > migration/ram.c | 13 +++-- > 1 file changed, 11 insertions(+), 2 deletions(-) > > diff --git a/migration/ram.c b/migration/ram.c > index 90e1bcb..ac0742f 100644 > --- a/migration/ram.c > +++ b/migration/ram.c > @@ -568,7 +568,7 @@ static int multifd_send_page(uint8_t *address) > qemu_mutex_unlock(&p->mutex); > qemu_sem_post(&p->sem); > > -return 0; > +return i; is 'i' anything sane so far - I think this is currently a bogus value so perhaps it's best to keep it as 0 till later? Also, add a comment to multifd_send_page to say it'll return the fd to use. > } > > struct MultiFDRecvParams { > @@ -1143,6 +1143,7 @@ static int ram_multifd_page(RAMState *rs, > PageSearchStatus *pss, > bool last_stage) > { > int pages; > +uint16_t fd_num; > uint8_t *p; > RAMBlock *block = pss->block; > ram_addr_t offset = pss->page << TARGET_PAGE_BITS; > @@ -1154,8 +1155,10 @@ static int ram_multifd_page(RAMState *rs, > PageSearchStatus *pss, > ram_counters.transferred += > save_page_header(rs, rs->f, block, > offset | RAM_SAVE_FLAG_MULTIFD_PAGE); > +fd_num = multifd_send_page(p); > +qemu_put_be16(rs->f, fd_num); Check for errors from multifd_send_page? (I'd have preferred to have made this one field in a new fixed size word which will get used for other things as well, but I'm OK with it this way). I think you've also got a 2^8 fd limit in some of the other configs as opposed to the 2^16 here. > +ram_counters.transferred += 2; /* size of fd_num */ > qemu_put_buffer(rs->f, p, TARGET_PAGE_SIZE); > -multifd_send_page(p); > ram_counters.transferred += TARGET_PAGE_SIZE; > pages = 1; > ram_counters.normal++; > @@ -2905,6 +2908,7 @@ static int ram_load(QEMUFile *f, void *opaque, int > version_id) > while (!postcopy_running && !ret && !(flags & RAM_SAVE_FLAG_EOS)) { > ram_addr_t addr, total_ram_bytes; > void *host = NULL; > +uint16_t fd_num; > uint8_t ch; > > addr = qemu_get_be64(f); > @@ -3015,6 +3019,11 @@ static int ram_load(QEMUFile *f, void *opaque, int > version_id) > break; > > case RAM_SAVE_FLAG_MULTIFD_PAGE: > +fd_num = qemu_get_be16(f); > +if (fd_num != 0) { > +/* this is yet an unused variable, changed later */ > +fd_num = fd_num; > +} > qemu_get_buffer(f, host, TARGET_PAGE_SIZE); > break; Dave > -- > 2.9.4 > -- Dr. David Alan Gilbert / dgilb...@redhat.com / Manchester, UK
[Qemu-devel] [PATCH v5 12/17] migration: Send the fd number which we are going to use for this page
We are still sending the page through the main channel, that would change later in the series Signed-off-by: Juan Quintela --- migration/ram.c | 13 +++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/migration/ram.c b/migration/ram.c index 90e1bcb..ac0742f 100644 --- a/migration/ram.c +++ b/migration/ram.c @@ -568,7 +568,7 @@ static int multifd_send_page(uint8_t *address) qemu_mutex_unlock(&p->mutex); qemu_sem_post(&p->sem); -return 0; +return i; } struct MultiFDRecvParams { @@ -1143,6 +1143,7 @@ static int ram_multifd_page(RAMState *rs, PageSearchStatus *pss, bool last_stage) { int pages; +uint16_t fd_num; uint8_t *p; RAMBlock *block = pss->block; ram_addr_t offset = pss->page << TARGET_PAGE_BITS; @@ -1154,8 +1155,10 @@ static int ram_multifd_page(RAMState *rs, PageSearchStatus *pss, ram_counters.transferred += save_page_header(rs, rs->f, block, offset | RAM_SAVE_FLAG_MULTIFD_PAGE); +fd_num = multifd_send_page(p); +qemu_put_be16(rs->f, fd_num); +ram_counters.transferred += 2; /* size of fd_num */ qemu_put_buffer(rs->f, p, TARGET_PAGE_SIZE); -multifd_send_page(p); ram_counters.transferred += TARGET_PAGE_SIZE; pages = 1; ram_counters.normal++; @@ -2905,6 +2908,7 @@ static int ram_load(QEMUFile *f, void *opaque, int version_id) while (!postcopy_running && !ret && !(flags & RAM_SAVE_FLAG_EOS)) { ram_addr_t addr, total_ram_bytes; void *host = NULL; +uint16_t fd_num; uint8_t ch; addr = qemu_get_be64(f); @@ -3015,6 +3019,11 @@ static int ram_load(QEMUFile *f, void *opaque, int version_id) break; case RAM_SAVE_FLAG_MULTIFD_PAGE: +fd_num = qemu_get_be16(f); +if (fd_num != 0) { +/* this is yet an unused variable, changed later */ +fd_num = fd_num; +} qemu_get_buffer(f, host, TARGET_PAGE_SIZE); break; -- 2.9.4