diff mbox series

[RFC,v2,03/12] vhost-user: wrap some read/write with retry handling

Message ID 20180601162749.27406-4-marcandre.lureau@redhat.com
State New
Headers show
Series vhost-user for input & GPU | expand

Commit Message

Marc-André Lureau June 1, 2018, 4:27 p.m. UTC
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 hw/virtio/vhost-user.c | 15 ++++++++++++---
 1 file changed, 12 insertions(+), 3 deletions(-)

Comments

Philippe Mathieu-Daudé June 8, 2018, 2:53 p.m. UTC | #1
On 06/01/2018 01:27 PM, Marc-André Lureau wrote:
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>

Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>

> ---
>  hw/virtio/vhost-user.c | 15 ++++++++++++---
>  1 file changed, 12 insertions(+), 3 deletions(-)
> 
> diff --git a/hw/virtio/vhost-user.c b/hw/virtio/vhost-user.c
> index ca554d4ff1..cc9298792d 100644
> --- a/hw/virtio/vhost-user.c
> +++ b/hw/virtio/vhost-user.c
> @@ -869,7 +869,10 @@ static void slave_read(void *opaque)
>      iov.iov_base = &hdr;
>      iov.iov_len = VHOST_USER_HDR_SIZE;
>  
> -    size = recvmsg(u->slave_fd, &msgh, 0);
> +    do {
> +        size = recvmsg(u->slave_fd, &msgh, 0);
> +    } while (size < 0 && (errno == EINTR || errno == EAGAIN));
> +
>      if (size != VHOST_USER_HDR_SIZE) {
>          error_report("Failed to read from slave.");
>          goto err;
> @@ -898,7 +901,10 @@ static void slave_read(void *opaque)
>      }
>  
>      /* Read payload */
> -    size = read(u->slave_fd, &payload, hdr.size);
> +    do {
> +        size = read(u->slave_fd, &payload, hdr.size);
> +    } while (size < 0 && (errno == EINTR || errno == EAGAIN));
> +
>      if (size != hdr.size) {
>          error_report("Failed to read payload from slave.");
>          goto err;
> @@ -941,7 +947,10 @@ static void slave_read(void *opaque)
>          iovec[1].iov_base = &payload;
>          iovec[1].iov_len = hdr.size;
>  
> -        size = writev(u->slave_fd, iovec, ARRAY_SIZE(iovec));
> +        do {
> +            size = writev(u->slave_fd, iovec, ARRAY_SIZE(iovec));
> +        } while (size < 0 && (errno == EINTR || errno == EAGAIN));
> +
>          if (size != VHOST_USER_HDR_SIZE + hdr.size) {
>              error_report("Failed to send msg reply to slave.");
>              goto err;
>
diff mbox series

Patch

diff --git a/hw/virtio/vhost-user.c b/hw/virtio/vhost-user.c
index ca554d4ff1..cc9298792d 100644
--- a/hw/virtio/vhost-user.c
+++ b/hw/virtio/vhost-user.c
@@ -869,7 +869,10 @@  static void slave_read(void *opaque)
     iov.iov_base = &hdr;
     iov.iov_len = VHOST_USER_HDR_SIZE;
 
-    size = recvmsg(u->slave_fd, &msgh, 0);
+    do {
+        size = recvmsg(u->slave_fd, &msgh, 0);
+    } while (size < 0 && (errno == EINTR || errno == EAGAIN));
+
     if (size != VHOST_USER_HDR_SIZE) {
         error_report("Failed to read from slave.");
         goto err;
@@ -898,7 +901,10 @@  static void slave_read(void *opaque)
     }
 
     /* Read payload */
-    size = read(u->slave_fd, &payload, hdr.size);
+    do {
+        size = read(u->slave_fd, &payload, hdr.size);
+    } while (size < 0 && (errno == EINTR || errno == EAGAIN));
+
     if (size != hdr.size) {
         error_report("Failed to read payload from slave.");
         goto err;
@@ -941,7 +947,10 @@  static void slave_read(void *opaque)
         iovec[1].iov_base = &payload;
         iovec[1].iov_len = hdr.size;
 
-        size = writev(u->slave_fd, iovec, ARRAY_SIZE(iovec));
+        do {
+            size = writev(u->slave_fd, iovec, ARRAY_SIZE(iovec));
+        } while (size < 0 && (errno == EINTR || errno == EAGAIN));
+
         if (size != VHOST_USER_HDR_SIZE + hdr.size) {
             error_report("Failed to send msg reply to slave.");
             goto err;