Message ID | 20160706184721.2007-14-marcandre.lureau@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Wed, Jul 06, 2016 at 08:47:06PM +0200, marcandre.lureau@redhat.com wrote: > From: Marc-André Lureau <marcandre.lureau@redhat.com> > > More error checking to break code flow and report appropriate errors. > > Signed-off-by: Marc-André Lureau <marcandre.lureau@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
Hi ----- Original Message ----- > On Wed, Jul 06, 2016 at 08:47:06PM +0200, marcandre.lureau@redhat.com wrote: > > From: Marc-André Lureau <marcandre.lureau@redhat.com> > > > > More error checking to break code flow and report appropriate errors. > > > > Signed-off-by: Marc-André Lureau <marcandre.lureau@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); That's why there is a previous patch "vhost: do not assert() on vhost_ops failure". Although there is still some abort() on migration. This is a corner case that isn't yet solved. I think it would make sense for the backend to state that it is disconnected, and for vhost to ingore migration ops failure in this case. > 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. Yes, I am adding a VHOST_OPS_DEBUG as you proposed > > > --- > > 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 >
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; }