On Wed, Jul 06, 2016 at 08:47:06PM +0200, marcandre.lur...@redhat.com wrote: > From: Marc-André Lureau <marcandre.lur...@redhat.com> > > More error checking to break code flow and report appropriate errors. > > Signed-off-by: Marc-André Lureau <marcandre.lur...@redhat.com>
So this will cause asserts here: /* inform backend of log switching, this must be done before releasing the current log, to ensure no logging is lost */ r = dev->vhost_ops->vhost_set_log_base(dev, log_base, log); assert(r >= 0); which is the opposite of what we want. For vhost_net ioctl failure is a fatal error bit for vhost user this means backend exited and will not change memory so it's benign. the right thing to do is to return 0 status to caller on most errors. If that is necessary for debugging, add a printout for now. > --- > hw/virtio/vhost-user.c | 50 > ++++++++++++++++++++++++++++++++++---------------- > 1 file changed, 34 insertions(+), 16 deletions(-) > > diff --git a/hw/virtio/vhost-user.c b/hw/virtio/vhost-user.c > index 5dae496..819481d 100644 > --- a/hw/virtio/vhost-user.c > +++ b/hw/virtio/vhost-user.c > @@ -214,12 +214,14 @@ static int vhost_user_set_log_base(struct vhost_dev > *dev, uint64_t base, > fds[fd_num++] = log->fd; > } > > - vhost_user_write(dev, &msg, fds, fd_num); > + if (vhost_user_write(dev, &msg, fds, fd_num) < 0) { > + return -1; > + } > > if (shmfd) { > msg.size = 0; > if (vhost_user_read(dev, &msg) < 0) { > - return 0; > + return -1; > } > > if (msg.request != VHOST_USER_SET_LOG_BASE) { > @@ -275,7 +277,9 @@ static int vhost_user_set_mem_table(struct vhost_dev *dev, > msg.size += sizeof(msg.payload.memory.padding); > msg.size += fd_num * sizeof(VhostUserMemoryRegion); > > - vhost_user_write(dev, &msg, fds, fd_num); > + if (vhost_user_write(dev, &msg, fds, fd_num) < 0) { > + return -1; > + } > > return 0; > } > @@ -290,7 +294,9 @@ static int vhost_user_set_vring_addr(struct vhost_dev > *dev, > .size = sizeof(msg.payload.addr), > }; > > - vhost_user_write(dev, &msg, NULL, 0); > + if (vhost_user_write(dev, &msg, NULL, 0) < 0) { > + return -1; > + } > > return 0; > } > @@ -313,7 +319,9 @@ static int vhost_set_vring(struct vhost_dev *dev, > .size = sizeof(msg.payload.state), > }; > > - vhost_user_write(dev, &msg, NULL, 0); > + if (vhost_user_write(dev, &msg, NULL, 0) < 0) { > + return -1; > + } > > return 0; > } > @@ -360,10 +368,12 @@ static int vhost_user_get_vring_base(struct vhost_dev > *dev, > .size = sizeof(msg.payload.state), > }; > > - vhost_user_write(dev, &msg, NULL, 0); > + if (vhost_user_write(dev, &msg, NULL, 0) < 0) { > + return -1; > + } > > if (vhost_user_read(dev, &msg) < 0) { > - return 0; > + return -1; > } > > if (msg.request != VHOST_USER_GET_VRING_BASE) { > @@ -401,7 +411,9 @@ static int vhost_set_vring_file(struct vhost_dev *dev, > msg.payload.u64 |= VHOST_USER_VRING_NOFD_MASK; > } > > - vhost_user_write(dev, &msg, fds, fd_num); > + if (vhost_user_write(dev, &msg, fds, fd_num) < 0) { > + return -1; > + } > > return 0; > } > @@ -427,7 +439,9 @@ static int vhost_user_set_u64(struct vhost_dev *dev, int > request, uint64_t u64) > .size = sizeof(msg.payload.u64), > }; > > - vhost_user_write(dev, &msg, NULL, 0); > + if (vhost_user_write(dev, &msg, NULL, 0) < 0) { > + return -1; > + } > > return 0; > } > @@ -455,10 +469,12 @@ static int vhost_user_get_u64(struct vhost_dev *dev, > int request, uint64_t *u64) > return 0; > } > > - vhost_user_write(dev, &msg, NULL, 0); > + if (vhost_user_write(dev, &msg, NULL, 0) < 0) { > + return -1; > + } > > if (vhost_user_read(dev, &msg) < 0) { > - return 0; > + return -1; > } > > if (msg.request != request) { > @@ -489,7 +505,9 @@ static int vhost_user_set_owner(struct vhost_dev *dev) > .flags = VHOST_USER_VERSION, > }; > > - vhost_user_write(dev, &msg, NULL, 0); > + if (vhost_user_write(dev, &msg, NULL, 0) < 0) { > + return -1; > + } > > return 0; > } > @@ -501,7 +519,9 @@ static int vhost_user_reset_device(struct vhost_dev *dev) > .flags = VHOST_USER_VERSION, > }; > > - vhost_user_write(dev, &msg, NULL, 0); > + if (vhost_user_write(dev, &msg, NULL, 0) < 0) { > + return -1; > + } > > return 0; > } > @@ -588,7 +608,6 @@ static bool vhost_user_requires_shm_log(struct vhost_dev > *dev) > static int vhost_user_migration_done(struct vhost_dev *dev, char* mac_addr) > { > VhostUserMsg msg = { 0 }; > - int err; > > assert(dev->vhost_ops->backend_type == VHOST_BACKEND_TYPE_USER); > > @@ -605,8 +624,7 @@ static int vhost_user_migration_done(struct vhost_dev > *dev, char* mac_addr) > memcpy((char *)&msg.payload.u64, mac_addr, 6); > msg.size = sizeof(msg.payload.u64); > > - err = vhost_user_write(dev, &msg, NULL, 0); > - return err; > + return vhost_user_write(dev, &msg, NULL, 0); > } > return -1; > } > -- > 2.9.0