On 11/26/2013 07:31 PM, Paolo Bonzini wrote:
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.

I guess 'transmit the socket' you mean transmit the fd?

Sorry that I am quite understand your suggestion here.. Do you
mean that send_pipefd in the first call of qemu_local_save_ram
after it has written the 64-bit field? In this way, get rid of
qemu_local_send_pipefd?

Currently, the fd control message is sent at the end of the stream
in ram_save_setup stage, followed by the ram page. The control
message of fd is always at the same place.


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



--
Lei


Reply via email to