Make uevent handler handle case where kernel netlink receive
buffer is overrun. If this happens the DPDK device state
will potentially be out of sync, but better not to give up.
The code already handles the case of kernel sending a zero
length message; it just ignores it.
Fixes: 0d0f478d0483 ("eal/linux: add uevent parse and process")
Cc: [email protected]
Reported-by: Randy Tice <[email protected]>
Signed-off-by: Stephen Hemminger <[email protected]>
---
lib/eal/linux/eal_dev.c | 19 ++++++++++++++-----
1 file changed, 14 insertions(+), 5 deletions(-)
diff --git a/lib/eal/linux/eal_dev.c b/lib/eal/linux/eal_dev.c
index fb5c8bf070..b535122ff6 100644
--- a/lib/eal/linux/eal_dev.c
+++ b/lib/eal/linux/eal_dev.c
@@ -270,11 +270,20 @@ dev_uev_handler(__rte_unused void *param)
ret = recv(rte_intr_fd_get(intr_handle), buf, EAL_UEV_MSG_LEN,
MSG_DONTWAIT);
- if (ret < 0 && errno == EAGAIN)
- return;
- else if (ret <= 0) {
- /* connection is closed or broken, can not up again. */
- EAL_LOG(ERR, "uevent socket connection is broken.");
+ if (ret < 0) {
+ /* transient error */
+ if (errno == EAGAIN || errno == EWOULDBLOCK || errno == EINTR)
+ return;
+
+ /* kernel netlink messages lost */
+ if (errno == ENOBUFS) {
+ EAL_LOG(NOTICE, "kernel receive buffer overrun");
+ return;
+ }
+
+ EAL_LOG(ERR, "unexpected error on uevent recv: %s",
+ strerror(errno));
+
rte_eal_alarm_set(1, dev_delayed_unregister, NULL);
return;
}
--
2.53.0