Clear FD references before freeing interrupt handles to avoid
spurious leak warnings. In error paths where the socket fd is
closed separately, clear the reference. In cleanup paths, use
rte_intr_fd_close() to close and clear in one call.
Fixes: d770ee9caed0 ("interrupts: warn on leaked FDs")
Signed-off-by: David Marchand <[email protected]>
---
drivers/net/memif/memif_socket.c | 14 +++++++++-----
1 file changed, 9 insertions(+), 5 deletions(-)
diff --git a/drivers/net/memif/memif_socket.c b/drivers/net/memif/memif_socket.c
index bd52a95473..b47c7a3b1b 100644
--- a/drivers/net/memif/memif_socket.c
+++ b/drivers/net/memif/memif_socket.c
@@ -638,7 +638,7 @@ memif_disconnect(struct rte_eth_dev *dev)
pmd->cc,
memif_intr_unregister_handler);
} else if (ret > 0) {
- close(rte_intr_fd_get(ih));
+ rte_intr_fd_close(ih);
rte_intr_instance_free(ih);
rte_free(pmd->cc);
}
@@ -962,6 +962,8 @@ memif_listener_handler(void *arg)
if (cc != NULL) {
rte_intr_callback_unregister(cc->intr_handle,
memif_intr_handler,
cc);
+ /* fd is closed below, clear reference here. */
+ rte_intr_fd_set(cc->intr_handle, -1);
rte_intr_instance_free(cc->intr_handle);
rte_free(cc);
}
@@ -1060,6 +1062,8 @@ memif_socket_create(char *key, uint8_t listener, bool
is_abstract, uid_t owner_u
error:
MIF_LOG(ERR, "Failed to setup socket %s: %s", key, strerror(errno));
if (sock != NULL) {
+ /* fd is closed below, clear reference here. */
+ rte_intr_fd_set(sock->intr_handle, -1);
rte_intr_instance_free(sock->intr_handle);
rte_free(sock);
}
@@ -1118,8 +1122,7 @@ memif_socket_init(struct rte_eth_dev *dev, const char
*socket_filename)
if (socket->listener) {
rte_intr_callback_unregister(socket->intr_handle,
memif_listener_handler, socket);
- close(rte_intr_fd_get(socket->intr_handle));
- rte_intr_fd_set(socket->intr_handle, -1);
+ rte_intr_fd_close(socket->intr_handle);
rte_intr_instance_free(socket->intr_handle);
}
rte_free(socket);
@@ -1191,8 +1194,7 @@ memif_socket_remove_device(struct rte_eth_dev *dev)
if (pmd->role != MEMIF_ROLE_CLIENT) {
rte_intr_callback_unregister(socket->intr_handle,
memif_listener_handler,
socket);
- close(rte_intr_fd_get(socket->intr_handle));
- rte_intr_fd_set(socket->intr_handle, -1);
+ rte_intr_fd_close(socket->intr_handle);
rte_intr_instance_free(socket->intr_handle);
}
rte_free(socket);
@@ -1290,6 +1292,8 @@ memif_connect_client(struct rte_eth_dev *dev)
sockfd = -1;
}
if (pmd->cc != NULL) {
+ /* fd is closed above, clear reference here. */
+ rte_intr_fd_set(pmd->cc->intr_handle, -1);
rte_intr_instance_free(pmd->cc->intr_handle);
rte_free(pmd->cc);
pmd->cc = NULL;
--
2.54.0