From: Jens Freimann<address@hidden>
When recvmsg() returns a message size of zero and
errno is ENOENT end processing of vhost-user messages.
Without this we run into a vubr_panic() call and get
PANIC: Error while recvmsg: No such file or directory
Error while dispatching.
Add a switch "quit" to the vhost user device and set true to stop
processing messages.
Signed-off-by: Jens Freimann<address@hidden>
---
contrib/libvhost-user/libvhost-user.c | 12 +++++++++++-
contrib/libvhost-user/libvhost-user.h | 1 +
2 files changed, 12 insertions(+), 1 deletion(-)
diff --git a/contrib/libvhost-user/libvhost-user.c
b/contrib/libvhost-user/libvhost-user.c
index 9efb9da..5538859 100644
--- a/contrib/libvhost-user/libvhost-user.c
+++ b/contrib/libvhost-user/libvhost-user.c
@@ -161,7 +161,10 @@ vu_message_read(VuDev *dev, int conn_fd, VhostUserMsg
*vmsg)
rc = recvmsg(conn_fd, &msg, 0);
} while (rc < 0 && (errno == EINTR || errno == EAGAIN));
- if (rc <= 0) {
+ if (rc == 0 && (errno == ENOENT)) {
+ vmsg->size = 0;
+ dev->quit = true;
+ } else if (rc < 0) {
vu_panic(dev, "Error while recvmsg: %s", strerror(errno));
return false;
}
@@ -755,6 +758,10 @@ vu_process_message(VuDev *dev, VhostUserMsg *vmsg)
DPRINT("Flags: 0x%x\n", vmsg->flags);
DPRINT("Size: %d\n", vmsg->size);
+ if (dev->quit) {
+ return true;
+ }
+