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@kylinos.cn
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@kylinos.cn
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@k...
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/0ccc1c26d27d6ee7be22806a979...
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; }