From 2ad5482b51eb26b17fe95e4d41ecbead76ee955c Mon Sep 17 00:00:00 2001 From: Ferruh Yigit Date: Tue, 26 Nov 2019 10:50:07 +0000 Subject: [PATCH] net/kni: fix crash caused by double stop 'close()' calls 'stop()' and 'stop()' cancels pthread without any check. Calling 'stop()' & 'close()' sequentially tries to cancel pthread twice which will cause a crash. Adding a state check in 'stop()' before canceling the pthread to prevent multiple stop. Fixes: 696fbc7bb4fc ("net/kni: remove resources when port is closed") Signed-off-by: Ferruh Yigit Tested-by: Yinan Wang --- drivers/net/kni/rte_eth_kni.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/net/kni/rte_eth_kni.c b/drivers/net/kni/rte_eth_kni.c index 7cba92e2ed..d88cb1778e 100644 --- a/drivers/net/kni/rte_eth_kni.c +++ b/drivers/net/kni/rte_eth_kni.c @@ -156,6 +156,8 @@ eth_kni_dev_start(struct rte_eth_dev *dev) } if (internals->no_request_thread == 0) { + internals->stop_thread = 0; + ret = rte_ctrl_thread_create(&internals->thread, "kni_handle_req", NULL, kni_handle_request, internals); @@ -177,7 +179,7 @@ eth_kni_dev_stop(struct rte_eth_dev *dev) struct pmd_internals *internals = dev->data->dev_private; int ret; - if (internals->no_request_thread == 0) { + if (internals->no_request_thread == 0 && internals->stop_thread == 0) { internals->stop_thread = 1; ret = pthread_cancel(internals->thread); @@ -187,8 +189,6 @@ eth_kni_dev_stop(struct rte_eth_dev *dev) ret = pthread_join(internals->thread, NULL); if (ret) PMD_LOG(ERR, "Can't join the thread"); - - internals->stop_thread = 0; } dev->data->dev_link.link_status = 0; -- 2.20.1