On Wed, 2024-04-10 at 14:34 -0700, Martin KaFai Lau wrote: > On 4/9/24 11:13 PM, Geliang Tang wrote: > > From: Geliang Tang <tanggeliang@xxxxxxxxxx> > > > > Some tests, such as the MPTCP bpf tests, require send_recv_data > > helper > > to run in nonblock mode. > > > > This patch adds nonblock support for send_recv_data(). Check if it > > is > > currently in nonblock mode, and if so, ignore EWOULDBLOCK to > > continue > > sending and receiving. > > > > Signed-off-by: Geliang Tang <tanggeliang@xxxxxxxxxx> > > --- > > tools/testing/selftests/bpf/network_helpers.c | 9 ++++++++- > > 1 file changed, 8 insertions(+), 1 deletion(-) > > > > diff --git a/tools/testing/selftests/bpf/network_helpers.c > > b/tools/testing/selftests/bpf/network_helpers.c > > index 137cd18ef3f2..ca16ef2b648e 100644 > > --- a/tools/testing/selftests/bpf/network_helpers.c > > +++ b/tools/testing/selftests/bpf/network_helpers.c > > @@ -555,6 +555,7 @@ struct send_recv_arg { > > static void *send_recv_server(void *arg) > > { > > struct send_recv_arg *a = (struct send_recv_arg *)arg; > > + int flags = fcntl(a->fd, F_GETFL); > > ssize_t nr_sent = 0, bytes = 0; > > char batch[1500]; > > int err = 0, fd; > > @@ -578,6 +579,8 @@ static void *send_recv_server(void *arg) > > if (nr_sent == -1 && errno == EINTR) > > continue; > > if (nr_sent == -1) { > > + if (flags & O_NONBLOCK && errno == > > EWOULDBLOCK) > > I still don't see why it needs to be a non blocking IO. mptcp should > work > with blocking IO also, no? Does it really need non blocking IO to > make > mptcp test work? I would rather stay with blocking IO in selftest as > much as > possible for simplicity reason. > > I am afraid the root cause of the EAGAIN thread has not been figured > out yet: > https://lore.kernel.org/all/b3943f9a8bf595212b00e96ba850bf32893312cc.camel@xxxxxxxxxx/ > > Lets drop patch 3 until it is understood why mptcp needs EAGAIN or > non-blocking IO. > It feels like there is some flakiness and it should be understood and > avoided. Hi Martin, I finally found the root cause of this issue. It is indeed an MPTCP bug. It took me a long time to debug, and the fix is here: https://patchwork.kernel.org/project/mptcp/patch/0ccc1c26d27d6ee7be22806a97983d37c6ca548c.1715053270.git.tanggeliang@xxxxxxxxxx/ Thank you for insisting on not accepting these work around patches from me in the user space, almost hiding a kernel bug. -Geliang > > Other than the comment in patch 2, the first two patches lgtm. Please > respin with > the first two patches. > > > + continue; > > err = -errno; > > break; > > } > > @@ -599,6 +602,7 @@ static void *send_recv_server(void *arg) > > > > int send_recv_data(int lfd, int fd, uint32_t total_bytes) > > { > > + int flags = fcntl(lfd, F_GETFL); > > ssize_t nr_recv = 0, bytes = 0; > > struct send_recv_arg arg = { > > .fd = lfd, > > @@ -622,8 +626,11 @@ int send_recv_data(int lfd, int fd, uint32_t > > total_bytes) > > MIN(total_bytes - bytes, > > sizeof(batch)), 0); > > if (nr_recv == -1 && errno == EINTR) > > continue; > > - if (nr_recv == -1) > > + if (nr_recv == -1) { > > + if (flags & O_NONBLOCK && errno == > > EWOULDBLOCK) > > + continue; > > break; > > + } > > bytes += nr_recv; > > } > > > >