Message ID | 20180504095346.14159-1-dgilbert@redhat.com |
---|---|
State | New |
Headers | show |
Series | libvhost-user: Send messages with no data | expand |
On Fri, May 4, 2018 at 11:53 AM, Dr. David Alan Gilbert (git) <dgilbert@redhat.com> wrote: > From: "Dr. David Alan Gilbert" <dgilbert@redhat.com> > > The response to a VHOST_USER_POSTCOPY_ADVISE contains a fd but doesn't > actually contain any data. FIx vu_message_write so that it doesn't > do a 0-byte write() call, since this was ending up with rc=0 > that was confusing the error handling code. > > Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com> Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com> > --- > contrib/libvhost-user/libvhost-user.c | 16 +++++++++------- > 1 file changed, 9 insertions(+), 7 deletions(-) > > diff --git a/contrib/libvhost-user/libvhost-user.c b/contrib/libvhost-user/libvhost-user.c > index beeed0c43f..54e643d871 100644 > --- a/contrib/libvhost-user/libvhost-user.c > +++ b/contrib/libvhost-user/libvhost-user.c > @@ -323,13 +323,15 @@ vu_message_write(VuDev *dev, int conn_fd, VhostUserMsg *vmsg) > rc = sendmsg(conn_fd, &msg, 0); > } while (rc < 0 && (errno == EINTR || errno == EAGAIN)); > > - do { > - if (vmsg->data) { > - rc = write(conn_fd, vmsg->data, vmsg->size); > - } else { > - rc = write(conn_fd, p + VHOST_USER_HDR_SIZE, vmsg->size); > - } > - } while (rc < 0 && (errno == EINTR || errno == EAGAIN)); > + if (vmsg->size) { > + do { > + if (vmsg->data) { > + rc = write(conn_fd, vmsg->data, vmsg->size); > + } else { > + rc = write(conn_fd, p + VHOST_USER_HDR_SIZE, vmsg->size); > + } > + } while (rc < 0 && (errno == EINTR || errno == EAGAIN)); > + } > > if (rc <= 0) { > vu_panic(dev, "Error while writing: %s", strerror(errno)); > -- > 2.17.0 > >
On 05/04/2018 04:53 AM, Dr. David Alan Gilbert (git) wrote: > From: "Dr. David Alan Gilbert" <dgilbert@redhat.com> > > The response to a VHOST_USER_POSTCOPY_ADVISE contains a fd but doesn't s/a fd/an fd/ ? Depends on whether you pronounce it "eff-dee" or "file-descriptor". > actually contain any data. FIx vu_message_write so that it doesn't s/FIx/Fix/ > do a 0-byte write() call, since this was ending up with rc=0 > that was confusing the error handling code. > > Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com> > --- > contrib/libvhost-user/libvhost-user.c | 16 +++++++++------- > 1 file changed, 9 insertions(+), 7 deletions(-) >
diff --git a/contrib/libvhost-user/libvhost-user.c b/contrib/libvhost-user/libvhost-user.c index beeed0c43f..54e643d871 100644 --- a/contrib/libvhost-user/libvhost-user.c +++ b/contrib/libvhost-user/libvhost-user.c @@ -323,13 +323,15 @@ vu_message_write(VuDev *dev, int conn_fd, VhostUserMsg *vmsg) rc = sendmsg(conn_fd, &msg, 0); } while (rc < 0 && (errno == EINTR || errno == EAGAIN)); - do { - if (vmsg->data) { - rc = write(conn_fd, vmsg->data, vmsg->size); - } else { - rc = write(conn_fd, p + VHOST_USER_HDR_SIZE, vmsg->size); - } - } while (rc < 0 && (errno == EINTR || errno == EAGAIN)); + if (vmsg->size) { + do { + if (vmsg->data) { + rc = write(conn_fd, vmsg->data, vmsg->size); + } else { + rc = write(conn_fd, p + VHOST_USER_HDR_SIZE, vmsg->size); + } + } while (rc < 0 && (errno == EINTR || errno == EAGAIN)); + } if (rc <= 0) { vu_panic(dev, "Error while writing: %s", strerror(errno));