Re: [Qemu-devel] [PATCH v4 12/47] Handle bi-directional communication for fd migration
* David Gibson (da...@gibson.dropbear.id.au) wrote: > On Mon, Nov 03, 2014 at 03:53:03PM +0200, Cristian Klein wrote: > > On 03 Nov 2014, at 5:12 , David Gibson wrote: > > > > > On Fri, Oct 03, 2014 at 06:47:18PM +0100, Dr. David Alan Gilbert (git) > > > wrote: > > >> From: Cristian Klein > > > > > > This patch really, really requires a rationale in the commit message. > > > The reason it's necessary is certainly not obvious. > > > > ??" > > libvirt prefers opening the TCP connection itself, for two reasons. First, > > connection failed errors can be detected easier, without having to parse > > qemu???s error output. Second, libvirt might be asked to secure the > > transfer by tunnelling the communication through an TLS layer. Therefore, > > libvirt opens the TCP connection itself and passes an FD to qemu using QMP > > and a POSIX-specific mechanism. Hence, in order to make the reverse-path > > work in such cases, qemu needs to distinguish if the transmitted FD is a > > socket (reverse-path available) or not (reverse-path might not be > > available) and use the corresponding abstraction. > > ??" > > > > If the above message is clarifies the purpose of this commit, feel > > free to add it in the next version of the patch. > > That would help, yes. I've added that text into the commit message. Dave > > -- > David Gibson | I'll have my music baroque, and my code > david AT gibson.dropbear.id.au| minimalist, thank you. NOT _the_ > _other_ > | _way_ _around_! > http://www.ozlabs.org/~dgibson -- Dr. David Alan Gilbert / dgilb...@redhat.com / Manchester, UK
Re: [Qemu-devel] [PATCH v4 12/47] Handle bi-directional communication for fd migration
On Mon, Nov 03, 2014 at 03:53:03PM +0200, Cristian Klein wrote: > On 03 Nov 2014, at 5:12 , David Gibson wrote: > > > On Fri, Oct 03, 2014 at 06:47:18PM +0100, Dr. David Alan Gilbert (git) > > wrote: > >> From: Cristian Klein > > > > This patch really, really requires a rationale in the commit message. > > The reason it's necessary is certainly not obvious. > > “”" > libvirt prefers opening the TCP connection itself, for two reasons. First, > connection failed errors can be detected easier, without having to parse > qemu’s error output. Second, libvirt might be asked to secure the transfer by > tunnelling the communication through an TLS layer. Therefore, libvirt opens > the TCP connection itself and passes an FD to qemu using QMP and a > POSIX-specific mechanism. Hence, in order to make the reverse-path work in > such cases, qemu needs to distinguish if the transmitted FD is a socket > (reverse-path available) or not (reverse-path might not be available) and use > the corresponding abstraction. > “”" > > If the above message is clarifies the purpose of this commit, feel > free to add it in the next version of the patch. That would help, yes. -- David Gibson| I'll have my music baroque, and my code david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _other_ | _way_ _around_! http://www.ozlabs.org/~dgibson pgpmrF_gy2gXU.pgp Description: PGP signature
Re: [Qemu-devel] [PATCH v4 12/47] Handle bi-directional communication for fd migration
On 03 Nov 2014, at 5:12 , David Gibson wrote: > On Fri, Oct 03, 2014 at 06:47:18PM +0100, Dr. David Alan Gilbert (git) wrote: >> From: Cristian Klein > > This patch really, really requires a rationale in the commit message. > The reason it's necessary is certainly not obvious. “”" libvirt prefers opening the TCP connection itself, for two reasons. First, connection failed errors can be detected easier, without having to parse qemu’s error output. Second, libvirt might be asked to secure the transfer by tunnelling the communication through an TLS layer. Therefore, libvirt opens the TCP connection itself and passes an FD to qemu using QMP and a POSIX-specific mechanism. Hence, in order to make the reverse-path work in such cases, qemu needs to distinguish if the transmitted FD is a socket (reverse-path available) or not (reverse-path might not be available) and use the corresponding abstraction. “”" If the above message is clarifies the purpose of this commit, feel free to add it in the next version of the patch. Cristian > >> >> Signed-off-by: Cristian Klein >> --- >> migration-fd.c | 24 ++-- >> 1 file changed, 22 insertions(+), 2 deletions(-) >> >> diff --git a/migration-fd.c b/migration-fd.c >> index d2e523a..129da99 100644 >> --- a/migration-fd.c >> +++ b/migration-fd.c >> @@ -31,13 +31,29 @@ >> do { } while (0) >> #endif >> >> +static bool fd_is_socket(int fd) >> +{ >> +struct stat stat; >> +int ret = fstat(fd, &stat); >> +if (ret == -1) { >> +/* When in doubt say no */ >> +return false; >> +} >> +return S_ISSOCK(stat.st_mode); >> +} >> + >> void fd_start_outgoing_migration(MigrationState *s, const char *fdname, >> Error **errp) >> { >> int fd = monitor_get_fd(cur_mon, fdname, errp); >> if (fd == -1) { >> return; >> } >> -s->file = qemu_fdopen(fd, "wb"); >> + >> +if (fd_is_socket(fd)) { >> +s->file = qemu_fopen_socket(fd, "wb"); >> +} else { >> +s->file = qemu_fdopen(fd, "wb"); >> +} >> >> migrate_fd_connect(s); >> } >> @@ -58,7 +74,11 @@ void fd_start_incoming_migration(const char *infd, Error >> **errp) >> DPRINTF("Attempting to start an incoming migration via fd\n"); >> >> fd = strtol(infd, NULL, 0); >> -f = qemu_fdopen(fd, "rb"); >> +if (fd_is_socket(fd)) { >> +f = qemu_fopen_socket(fd, "rb"); >> +} else { >> +f = qemu_fdopen(fd, "rb"); >> +} >> if(f == NULL) { >> error_setg_errno(errp, errno, "failed to open the source >> descriptor"); >> return; > > -- > David Gibson | I'll have my music baroque, and my code > david AT gibson.dropbear.id.au| minimalist, thank you. NOT _the_ > _other_ > | _way_ _around_! > http://www.ozlabs.org/~dgibson
Re: [Qemu-devel] [PATCH v4 12/47] Handle bi-directional communication for fd migration
On Fri, Oct 03, 2014 at 06:47:18PM +0100, Dr. David Alan Gilbert (git) wrote: > From: Cristian Klein This patch really, really requires a rationale in the commit message. The reason it's necessary is certainly not obvious. > > Signed-off-by: Cristian Klein > --- > migration-fd.c | 24 ++-- > 1 file changed, 22 insertions(+), 2 deletions(-) > > diff --git a/migration-fd.c b/migration-fd.c > index d2e523a..129da99 100644 > --- a/migration-fd.c > +++ b/migration-fd.c > @@ -31,13 +31,29 @@ > do { } while (0) > #endif > > +static bool fd_is_socket(int fd) > +{ > +struct stat stat; > +int ret = fstat(fd, &stat); > +if (ret == -1) { > +/* When in doubt say no */ > +return false; > +} > +return S_ISSOCK(stat.st_mode); > +} > + > void fd_start_outgoing_migration(MigrationState *s, const char *fdname, > Error **errp) > { > int fd = monitor_get_fd(cur_mon, fdname, errp); > if (fd == -1) { > return; > } > -s->file = qemu_fdopen(fd, "wb"); > + > +if (fd_is_socket(fd)) { > +s->file = qemu_fopen_socket(fd, "wb"); > +} else { > +s->file = qemu_fdopen(fd, "wb"); > +} > > migrate_fd_connect(s); > } > @@ -58,7 +74,11 @@ void fd_start_incoming_migration(const char *infd, Error > **errp) > DPRINTF("Attempting to start an incoming migration via fd\n"); > > fd = strtol(infd, NULL, 0); > -f = qemu_fdopen(fd, "rb"); > +if (fd_is_socket(fd)) { > +f = qemu_fopen_socket(fd, "rb"); > +} else { > +f = qemu_fdopen(fd, "rb"); > +} > if(f == NULL) { > error_setg_errno(errp, errno, "failed to open the source > descriptor"); > return; -- David Gibson| I'll have my music baroque, and my code david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _other_ | _way_ _around_! http://www.ozlabs.org/~dgibson pgpvEc2jrX_Jv.pgp Description: PGP signature