On Wed, Sep 29, 2021 at 04:36:10PM -0300, Leonardo Bras Soares Passos wrote: > On Tue, Sep 28, 2021 at 7:45 PM Peter Xu <pet...@redhat.com> wrote: > > > > On Wed, Sep 22, 2021 at 07:24:22PM -0300, Leonardo Bras wrote: > > > +static void qio_channel_socket_async_flush(QIOChannel *ioc, > > > + Error **errp) > > > +{ > > > + QIOChannelSocket *sioc = QIO_CHANNEL_SOCKET(ioc); > > > + struct msghdr msg = {}; > > > + struct pollfd pfd; > > > + struct sock_extended_err *serr; > > > + struct cmsghdr *cm; > > > + char control[CMSG_SPACE(sizeof(int) * SOCKET_MAX_FDS)]; > > > + int ret; > > > + > > > + memset(control, 0, CMSG_SPACE(sizeof(int) * SOCKET_MAX_FDS)); > > > + msg.msg_control = control; > > > + msg.msg_controllen = sizeof(control); > > > + > > > + while (sioc->async_sent < sioc->async_queued) { > > > + ret = recvmsg(sioc->fd, &msg, MSG_ERRQUEUE); > > > + if (ret < 0) { > > > + if (errno == EAGAIN) { > > > + /* Nothing on errqueue, wait */ > > > + pfd.fd = sioc->fd; > > > + pfd.events = 0; > > > + ret = poll(&pfd, 1, 250); > > > + if (ret == 0) { > > > + /* > > > + * Timeout : After 250ms without receiving any > > > zerocopy > > > + * notification, consider all data as sent. > > > + */ > > > + break; > > > > After a timeout, we'll break the while loop and continue parsing an invalid > > msg [1]. Is that what we want? > > No, the point here was returning from flush if this (long) timeout > happened, as in > "if asso long has passed, there must be no pending send", which I > agree is quite bad, > but it was all I could think to avoid an infinite loop here if > something goes wrong.
IMHO it's the same when we write() to a socket but the buffer is always full, we'll simply block there until it has some space. I don't know what we can do here besides infinite loop on the timeout - we shouldn't eat the cpu all, but we should still wait? -- Peter Xu