Message ID | 20240523145522.313012-5-sgarzare@redhat.com |
---|---|
State | New |
Headers | show |
Series | vhost-user: support any POSIX system (tested on macOS, FreeBSD, OpenBSD) | expand |
On 23.05.24 16:55, Stefano Garzarella wrote: > In vhost-user-server we set all fd received from the other peer > in non-blocking mode. For some of them (e.g. memfd, shm_open, etc.) > it's not really needed, because we don't use these fd with blocking > operations, but only to map memory. > > In addition, in some systems this operation can fail (e.g. in macOS > setting an fd returned by shm_open() non-blocking fails with errno > = ENOTTY). > > So, let's avoid setting fd non-blocking for those messages that we > know carry memory fd (e.g. VHOST_USER_ADD_MEM_REG, > VHOST_USER_SET_MEM_TABLE). > > Reviewed-by: Daniel P. Berrangé <berrange@redhat.com> > Acked-by: Stefan Hajnoczi <stefanha@redhat.com> > Signed-off-by: Stefano Garzarella <sgarzare@redhat.com> > --- Reviewed-by: David Hildenbrand <david@redhat.com>
diff --git a/util/vhost-user-server.c b/util/vhost-user-server.c index 3bfb1ad3ec..b19229074a 100644 --- a/util/vhost-user-server.c +++ b/util/vhost-user-server.c @@ -65,6 +65,18 @@ static void vmsg_close_fds(VhostUserMsg *vmsg) static void vmsg_unblock_fds(VhostUserMsg *vmsg) { int i; + + /* + * These messages carry fd used to map memory, not to send/receive messages, + * so this operation is useless. In addition, in some systems this + * operation can fail (e.g. in macOS setting an fd returned by shm_open() + * non-blocking fails with errno = ENOTTY) + */ + if (vmsg->request == VHOST_USER_ADD_MEM_REG || + vmsg->request == VHOST_USER_SET_MEM_TABLE) { + return; + } + for (i = 0; i < vmsg->fd_num; i++) { qemu_socket_set_nonblock(vmsg->fds[i]); }