From dc331f8e7e0f87f79c3ca6430ddb967e7dafd146 Mon Sep 17 00:00:00 2001 From: daichuan Date: Tue, 26 Aug 2025 19:44:29 +0800 Subject: [PATCH 1/2] usrsock: Avoid frequent POLLIN when remote close during accept. Clear USRSOCK_EVENT_RECVFROM_AVAIL flag when remote closes connection during accept to prevent repeated POLLIN events and EPIPE loop. Signed-off-by: daichuan --- net/usrsock/usrsock_accept.c | 1 + net/usrsock/usrsock_poll.c | 8 +++++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/net/usrsock/usrsock_accept.c b/net/usrsock/usrsock_accept.c index 880be40edbcc1..75057eda6da28 100644 --- a/net/usrsock/usrsock_accept.c +++ b/net/usrsock/usrsock_accept.c @@ -297,6 +297,7 @@ int usrsock_accept(FAR struct socket *psock, FAR struct sockaddr *addr, { ninfo("usockid=%d; remote closed (EOF).\n", conn->usockid); + conn->flags &= ~USRSOCK_EVENT_RECVFROM_AVAIL; ret = -EPIPE; goto errout_free_conn; } diff --git a/net/usrsock/usrsock_poll.c b/net/usrsock/usrsock_poll.c index 8ee8009734000..9c074d7e3d138 100644 --- a/net/usrsock/usrsock_poll.c +++ b/net/usrsock/usrsock_poll.c @@ -83,7 +83,13 @@ static uint32_t poll_event(FAR struct net_driver_s *dev, /* Remote closed. */ - eventset |= (POLLHUP | POLLIN); + eventset |= POLLHUP; + if (flags & USRSOCK_EVENT_RECVFROM_AVAIL) + { + ninfo("socket recv avail.\n"); + + eventset |= POLLIN; + } } else { From c0f8f68ee2a128fcb5a86c5a5f79ea99b944c13a Mon Sep 17 00:00:00 2001 From: daichuan Date: Thu, 28 Aug 2025 15:13:09 +0800 Subject: [PATCH 2/2] usrsock: Check RECVFROM_AVAIL before setting POLLIN in pollsetup. In usrsock_pollsetup, only set POLLIN if USRSOCK_EVENT_RECVFROM_AVAIL is set when remote is closed, avoiding invalid POLLIN events. Signed-off-by: daichuan --- net/usrsock/usrsock_poll.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/net/usrsock/usrsock_poll.c b/net/usrsock/usrsock_poll.c index 9c074d7e3d138..e8c2c697a5d8a 100644 --- a/net/usrsock/usrsock_poll.c +++ b/net/usrsock/usrsock_poll.c @@ -223,7 +223,13 @@ static int usrsock_pollsetup(FAR struct socket *psock, /* Remote closed. */ - eventset |= (POLLHUP | POLLIN); + eventset |= POLLHUP; + if (conn->flags & USRSOCK_EVENT_RECVFROM_AVAIL) + { + ninfo("socket recv avail.\n"); + + eventset |= POLLIN; + } } else {