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 <[email protected]> --- 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

