Hi, Marten

I found some information about the epoll problem with the nonblocking local
socket.
>From https://man7.org/linux/man-pages/man2/connect.2.html, we can see:

EINPROGRESS
              The socket is nonblocking and the connection cannot be
              completed immediately.  (UNIX domain sockets failed with
              EAGAIN instead.)  *It is possible to
[select(2)](https://man7.org/linux/man-pages/man2/select.2.html
<https://man7.org/linux/man-pages/man2/select.2.html>) or
[poll(2)](https://man7.org/linux/man-pages/man2/poll.2.html
<https://man7.org/linux/man-pages/man2/poll.2.html>)*
*              for completion by selecting the socket for writing.*  After
              [select(2)](
https://man7.org/linux/man-pages/man2/select.2.html) indicates writability,
use [getsockopt(2)](https://man7.org/linux/man-pages/man2/getsockopt.2.html)
to read
              the SO_ERROR option at level SOL_SOCKET to determine
              whether connect() completed successfully (SO_ERROR is
              zero) or unsuccessfully (SO_ERROR is one of the usual
              error codes listed here, explaining the reason for the
              failure).

Use POLLOUT event to poll the non-connected nonblocking socket seems the
right way instead of using POLLIN event.
Could you try this ?

Regrads
Wang Bowen

Mårten Svanfeldt <marten.svanfe...@actia.se> 于2023年9月19日周二 19:17写道:

> Hello,
>
>
> I did some quick checking and it does indeed solve my problem. Do you want
> me to give a review/ack on the github PR? I do have an account there with
> id "thebolt" (but it is not yet linked to my current employers email from
> which I am writing this)
>
>
> I do however still have some epoll problems, also related to this change,
> and now it is together with unix local (stream) socket.
>
>
> The setup is as follows, I have to tasks, taskA and taskB.
>
>
> taskA does setup a new local socket, does listen (blocking) followed by
> accept (blocking) followed by "simple" poll+write/read
>
> taskB does socket(), make nonblock, connect() and then adds the socket fd
> to an epoll fd with EPOLLIN only.
>
>
> epoll_ctl(..EPOLL_CTL_ADD..) does poll setup, which in this case is
> local_pollsetup (in local_netpoll.c). The connection is in state
> LOCAL_STATE_CONNECTING (taskA didn't run accept yet) so the poll is setup
> as an "event poll".
>
>
> When taskA calls "accept" it eventually will perform a poll_notify(...
> EPOLLOUT), but ask taskB only specified EPOLLIN it will be ignored, the
> epoll not waken up, revents still set to 0 and the fd stays on the
> setup-list inside the epoll, meaning it will never do another poll setup on
> it, even though the socket itself changed state internally so that the next
> call to local_pollsetup would setup the polling differently.
>
>
>
> In principle I wonder if you don't have to move from "setup" to "teardown"
> list (so that the fd is re-setup the next epoll_wait) not only on
> successful poll_notify but on _any_ poll_notify independent of if
> (filtered) revents is changed or not. Otherwise internal state changes in
> the underlying driver/module will never be detected and pollsetup not
> re-ran when needed.
>
>
> Regards
>
> Marten Svanfeldt
>
> ________________________________
> From: 汪博文 <wangbow...@xiaomi.com>
> Sent: Tuesday, September 19, 2023 12:11:27 PM
> To: Mårten Svanfeldt
> Cc: dev@nuttx.apache.org
> Subject: RE: epoll oddities following setup/teardown optimizations
>
> Hi,
>
> I has a fix fs_epoll: add critical section for teardown process and reset
> the eph… by CV-Bowen · Pull Request #10706 · apache/nuttx (github.com)<
> https://github.com/apache/nuttx/pull/10706> about this problem.
> But I couldn’t find your GitHub ID, so I’m notifying you through email.
> Could you try this PR and check if this PR resolves your problem ?
>
> Regards
> Wang Bowen
> #/******本邮件及其附件含有小米公司的保密信息,仅限于发送给上面地址中列出的个人或群组。禁止任何其他人以任何形式使用(包括但不限于全部或部分地泄露、复制、或散发)本邮件中的信息。如果您错收了本邮件,请您立即电话或邮件通知发件人并删除本邮件!
> This e-mail and its attachments contain confidential information from
> XIAOMI, which is intended only for the person or entity whose address is
> listed above. Any use of the information contained herein in any way
> (including, but not limited to, total or partial disclosure, reproduction,
> or dissemination) by persons other than the intended recipient(s) is
> prohibited. If you receive this e-mail in error, please notify the sender
> by phone or email immediately and delete it!******/#
>

Reply via email to