net: socket service resets its restart flag

The socket service restarts whenever a new socket is registered.
This is triggered via zvfs_eventfd_write(ctx.events[0].fd, 1),
but the restart flag (ctx.events[0].revents) is not properly cleared,
causing unintended repeated restarts and skipped socket processing.

Detecting socket restart is done after the socket fd has processed its
data, so the socket doesn't lose its data. Ensure the socket service
clears its restart flag (ctx.events[0].revents = 0) immediately after
detecting a restart event, preventing unnecessary restarts.

Fixes #81813

Signed-off-by: Dominic Moffat <dom@illysky.com>
This commit is contained in:
Dominic Moffat 2024-11-23 15:59:46 +00:00 committed by Benjamin Cabé
parent 37a924be6a
commit 8519fa1627

View File

@ -245,12 +245,7 @@ restart:
break;
}
if (ret > 0 && ctx.events[0].revents) {
zvfs_eventfd_read(ctx.events[0].fd, &value);
NET_DBG("Received restart event.");
goto restart;
}
/* Process work here */
for (i = 1; i < (count + 1); i++) {
if (ctx.events[i].fd < 0) {
continue;
@ -259,10 +254,19 @@ restart:
if (ctx.events[i].revents > 0) {
ret = trigger_work(&ctx.events[i]);
if (ret < 0) {
NET_DBG("Triggering work failed (%d)", ret);
NET_ERR("Triggering work failed (%d)", ret);
goto out;
}
}
}
/* Relocate after trigger work so the work gets done before restarting */
if (ret > 0 && ctx.events[0].revents) {
zvfs_eventfd_read(ctx.events[0].fd, &value);
ctx.events[0].revents = 0;
NET_DBG("Received restart event.");
goto restart;
}
}
out: