[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH v3 2/3] QIOChannelSocket: Implement io_async_write & io_async
From: |
Peter Xu |
Subject: |
Re: [PATCH v3 2/3] QIOChannelSocket: Implement io_async_write & io_async_flush |
Date: |
Wed, 29 Sep 2021 15:58:56 -0400 |
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 <peterx@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
[PATCH v3 3/3] multifd: Send using asynchronous write on nocomp to send RAM pages., Leonardo Bras, 2021/09/22
Re: [PATCH v3 0/3] QIOChannel async_write & async_flush + MSG_ZEROCOPY + multifd, Peter Xu, 2021/09/28