qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH v4 12/47] Handle bi-directional communication fo


From: Cristian Klein
Subject: Re: [Qemu-devel] [PATCH v4 12/47] Handle bi-directional communication for fd migration
Date: Mon, 3 Nov 2014 15:53:03 +0200

On 03 Nov 2014, at 5:12 , David Gibson <address@hidden> wrote:

> On Fri, Oct 03, 2014 at 06:47:18PM +0100, Dr. David Alan Gilbert (git) wrote:
>> From: Cristian Klein <address@hidden>
> 
> 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 <address@hidden>
>> ---
>> 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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]