[RFC 2/6] eventdev: avoid use of pthread_cancel

Stephen Hemminger stephen at networkplumber.org
Wed Sep 24 18:51:09 CEST 2025


To control the rx event thread is simpler and safer to
just close the file descriptor rather than using pthread_cancel().

Signed-off-by: Stephen Hemminger <stephen at networkplumber.org>
---
 lib/eventdev/rte_event_eth_rx_adapter.c | 21 +++++++++++----------
 1 file changed, 11 insertions(+), 10 deletions(-)

diff --git a/lib/eventdev/rte_event_eth_rx_adapter.c b/lib/eventdev/rte_event_eth_rx_adapter.c
index 994f256322..95ceb35c5a 100644
--- a/lib/eventdev/rte_event_eth_rx_adapter.c
+++ b/lib/eventdev/rte_event_eth_rx_adapter.c
@@ -1173,9 +1173,11 @@ rxa_intr_thread(void *arg)
 	while (1) {
 		n = rte_epoll_wait(rx_adapter->epd, epoll_events,
 				RTE_EVENT_ETH_INTR_RING_SIZE, -1);
-		if (unlikely(n < 0))
-			RTE_EDEV_LOG_ERR("rte_epoll_wait returned error %d",
-					n);
+		if (unlikely(n < 0)) {
+			RTE_EDEV_LOG_ERR("rte_epoll_wait returned error %d", n);
+			break;
+		}
+
 		for (i = 0; i < n; i++) {
 			rxa_intr_ring_enqueue(rx_adapter,
 					epoll_events[i].epdata.data);
@@ -1643,10 +1645,12 @@ rxa_destroy_intr_thread(struct event_eth_rx_adapter *rx_adapter)
 {
 	int err;
 
-	err = pthread_cancel((pthread_t)rx_adapter->rx_intr_thread.opaque_id);
-	if (err)
-		RTE_EDEV_LOG_ERR("Can't cancel interrupt thread err = %d",
-				err);
+	/*
+	 * close the epoll fd used in the interrupt thread
+	 * this will unblock the rte_epoll_wait().
+	 */
+	close(rx_adapter->epd);
+	rx_adapter->epd = INIT_FD;
 
 	err = rte_thread_join(rx_adapter->rx_intr_thread, NULL);
 	if (err)
@@ -1671,9 +1675,6 @@ rxa_free_intr_resources(struct event_eth_rx_adapter *rx_adapter)
 	if (ret)
 		return ret;
 
-	close(rx_adapter->epd);
-	rx_adapter->epd = INIT_FD;
-
 	return ret;
 }
 
-- 
2.47.3



More information about the dev mailing list