Hi, > -----Original Message----- > From: Huang, Wei <wei.hu...@intel.com> > Sent: Monday, January 24, 2022 11:50 > To: dev@dpdk.org; Xu, Rosen <rosen...@intel.com>; Zhang, Qi Z > <qi.z.zh...@intel.com> > Cc: sta...@dpdk.org; Zhang, Tianfei <tianfei.zh...@intel.com>; Yigit, Ferruh > <ferruh.yi...@intel.com>; step...@networkplumber.org; > david.march...@redhat.com > Subject: [PATCH v8] raw/ifpga: fix pthread cannot join > > 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 > --- > v6: use __atomic_xxx_n to replace rte_atomicNN_xxx > --- > v7: fix typo > --- > v8: solve patch applying issue > --- > drivers/raw/ifpga/ifpga_rawdev.c | 12 ++++++------ > 1 file changed, 6 insertions(+), 6 deletions(-) > > diff --git a/drivers/raw/ifpga/ifpga_rawdev.c > b/drivers/raw/ifpga/ifpga_rawdev.c > index 8d9db58..19c2357 100644 > --- a/drivers/raw/ifpga/ifpga_rawdev.c > +++ b/drivers/raw/ifpga/ifpga_rawdev.c > @@ -497,7 +497,7 @@ static int set_surprise_link_check_aer( > int gsd_enable, ret; > #define MS 1000 > > - while (1) { > + while (__atomic_load_n(&ifpga_monitor_start, > __ATOMIC_RELAXED)) { > 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 (!__atomic_load_n(&ifpga_monitor_start, __ATOMIC_RELAXED)) { > 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 monitor thread"); > return -1; > } > - ifpga_monitor_start = 1; > + __atomic_store_n(&ifpga_monitor_start, 1, > __ATOMIC_RELAXED); > } > > return 0; > @@ -544,7 +544,9 @@ static int set_surprise_link_check_aer( { > int ret; > > - if (ifpga_monitor_start == 1) { > + if (__atomic_load_n(&ifpga_monitor_start, __ATOMIC_RELAXED)) { > + __atomic_store_n(&ifpga_monitor_start, 0, > __ATOMIC_RELAXED); > + > 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
Acked-by: Rosen Xu <rosen...@intel.com>