[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v5 10/13] xen/pvcalls: implement recvmsg
On Tue, 17 Oct 2017, Boris Ostrovsky wrote: > > + > > +int pvcalls_front_recvmsg(struct socket *sock, struct msghdr *msg, size_t > > len, > > + int flags) > > +{ > > + struct pvcalls_bedata *bedata; > > + int ret; > > + struct sock_mapping *map; > > + > > + if (flags & (MSG_CMSG_CLOEXEC|MSG_ERRQUEUE|MSG_OOB|MSG_TRUNC)) > > + return -EOPNOTSUPP; > > + > > + pvcalls_enter(); > > + if (!pvcalls_front_dev) { > > + pvcalls_exit(); > > + return -ENOTCONN; > > + } > > + bedata = dev_get_drvdata(&pvcalls_front_dev->dev); > > + > > + map = (struct sock_mapping *) sock->sk->sk_send_head; > > + if (!map) { > > + pvcalls_exit(); > > + return -ENOTSOCK; > > + } > > + > > + mutex_lock(&map->active.in_mutex); > > + if (len > XEN_FLEX_RING_SIZE(PVCALLS_RING_ORDER)) > > + len = XEN_FLEX_RING_SIZE(PVCALLS_RING_ORDER); > > + > > + while (!(flags & MSG_DONTWAIT) && !pvcalls_front_read_todo(map)) { > > + wait_event_interruptible(map->active.inflight_conn_req, > > + pvcalls_front_read_todo(map)); > > + } > > + ret = __read_ring(map->active.ring, &map->active.data, > > + &msg->msg_iter, len, flags); > > + > > + if (ret > 0) > > + notify_remote_via_irq(map->active.irq); > > + if (ret == 0) > > + ret = -EAGAIN; > > Why not 0? The manpage says: > > EAGAIN or EWOULDBLOCK > The socket is marked nonblocking and the receive > operation would block, or a receive timeout > had been set and the timeout expired before data was > received. POSIX.1 allows either error to > be returned for this case, and does not require these > constants to have the same value, so a > portable application should check for both possibilities. > > > I don't think either of these conditions is true here. > > (Again, should have noticed this earlier, sorry) In case the socket is MSG_DONTWAIT, then we should return -EAGAIN here. However, it is true that if the socket is not MSG_DONTWAIT, then returning 0 would make more sense. So I'll do: if (ret == 0) ret = (flags & MSG_DONTWAIT) ? -EAGAIN : 0; _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |