From: Tianfei Zhang <tianfei.zh...@intel.com> When we want to close a thread, we should set a flag to notify thread handler function.
Fixes: 9c006c45 ("raw/ifpga: scan PCIe BDF device tree") Cc: sta...@dpdk.org Signed-off-by: Tianfei Zhang <tianfei.zh...@intel.com> --- v2: update commit log --- v3: set thread id to 0 after pthread_join --- v4: do not evaluate and set pthread_t variable --- v5: use builtin atomic function to access ifpga_monitor_start flag --- drivers/raw/ifpga/ifpga_rawdev.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/drivers/raw/ifpga/ifpga_rawdev.c b/drivers/raw/ifpga/ifpga_rawdev.c index 8d9db58..b72c13a 100644 --- a/drivers/raw/ifpga/ifpga_rawdev.c +++ b/drivers/raw/ifpga/ifpga_rawdev.c @@ -68,7 +68,7 @@ static struct ifpga_rawdev ifpga_rawdevices[IFPGA_RAWDEV_NUM]; -static int ifpga_monitor_start; +static rte_atomic32_t ifpga_monitor_start; static pthread_t ifpga_monitor_start_thread; #define IFPGA_MAX_IRQ 12 @@ -497,7 +497,7 @@ static int set_surprise_link_check_aer( int gsd_enable, ret; #define MS 1000 - while (1) { + while (rte_atomic32_read(&ifpga_monitor_start)) { gsd_enable = 0; for (i = 0; i < IFPGA_RAWDEV_NUM; i++) { ifpga_rdev = &ifpga_rawdevices[i]; @@ -525,7 +525,7 @@ static int set_surprise_link_check_aer( { int ret; - if (ifpga_monitor_start == 0) { + if (!rte_atomic32_read(&ifpga_monitor_start)) { ret = rte_ctrl_thread_create(&ifpga_monitor_start_thread, "ifpga-monitor", NULL, ifpga_rawdev_gsd_handle, NULL); @@ -534,7 +534,7 @@ static int set_surprise_link_check_aer( "Fail to create ifpga nonitor thread"); return -1; } - ifpga_monitor_start = 1; + rte_atomic32_set(&ifpga_monitor_start, 1); } return 0; @@ -544,7 +544,9 @@ static int set_surprise_link_check_aer( { int ret; - if (ifpga_monitor_start == 1) { + if (rte_atomic32_read(&ifpga_monitor_start)) { + rte_atomic32_set(&ifpga_monitor_start, 0); + ret = pthread_cancel(ifpga_monitor_start_thread); if (ret) IFPGA_RAWDEV_PMD_ERR("Can't cancel the thread"); @@ -553,8 +555,6 @@ static int set_surprise_link_check_aer( if (ret) IFPGA_RAWDEV_PMD_ERR("Can't join the thread"); - ifpga_monitor_start = 0; - return ret; } -- 1.8.3.1