qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCH 08/17] add unix_msgfd_lookup() to callback get_b


From: Paolo Bonzini
Subject: Re: [Qemu-devel] [PATCH 08/17] add unix_msgfd_lookup() to callback get_buffer
Date: Tue, 26 Nov 2013 12:31:10 +0100
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130923 Thunderbird/17.0.9

Il 21/11/2013 10:11, Lei Li ha scritto:
> +            /*
> +             * recvmsg is called here to catch the control message for
> +             * the exchange of PIPE file descriptor until it is received.
> +             */
> +            len = recvmsg(s->sockfd, &msg, 0);
> +            if (len != -1) {
> +                if (unix_msgfd_lookup(s, &msg) > 0) {
> +                    pipefd_passed = 1;
> +                    /*
> +                     * Do not count one byte taken by the PIPE file
> +                     * descriptor.
> +                     */
> +                    len--;

I think adding a byte in the middle of the stream is not reliable.

Rather, you should transmit the socket always at the same place, for
example in the first call of qemu_local_save_ram, after it has written
the 64-bit field.

The matching code in qemu_local_ram_load will be like this:

static int qemu_local_ram_load(QEMUFile *f, void *opaque,
                               uint64_t flags)
{
    QEMUFileLocal *s = opaque;
    ram_addr_t addr;
    struct iovec iov;
    ssize_t ret = -EINVAL;

    if (!s->pipefd_received) {
        /*
         * send_pipefd was called at this point, and it wrote one byte
         * to the stream.
         */
        qemu_get_byte(s);
        s->pipefd_received = true;
    }

    if (pipefd_passed) {
        ...
    }
    return -EINVAL;
}

Also, please move pipefd_passed within QEMUFileLocal.

Thanks,

Paolo



reply via email to

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