Hi Zhichao, Can you please add the same API for freebsd also.
Thanks Harman > -----Original Message----- > From: zhichaox.z...@intel.com <zhichaox.z...@intel.com> > Sent: Tuesday, May 17, 2022 9:35 PM > To: dev@dpdk.org; qiming.y...@intel.com > Cc: Zhichao Zeng <zhichaox.z...@intel.com>; Harman Kalra > <hka...@marvell.com> > Subject: [EXT] [DPDK] eal/linux: fix segfaults due to thread exit order > > External Email > > ---------------------------------------------------------------------- > From: Zhichao Zeng <zhichaox.z...@intel.com> > > The eal-intr-thread is not closed before exiting the main thread. There is a > small probability that when the eal-intr-thread is about to use some pointers, > the pointers were just released in the process of exiting, which cause the > segment fault error caught by ASan. > > Close the eal-intr-thread before exiting the mian thread to avoid segment > fault. > > Signed-off-by: Zhichao Zeng <zhichaox.z...@intel.com> > --- > lib/eal/common/eal_private.h | 7 +++++++ > lib/eal/linux/eal.c | 1 + > lib/eal/linux/eal_interrupts.c | 12 ++++++++++++ > 3 files changed, 20 insertions(+) > > diff --git a/lib/eal/common/eal_private.h b/lib/eal/common/eal_private.h > index 44d14241f0..7adf41b7d7 100644 > --- a/lib/eal/common/eal_private.h > +++ b/lib/eal/common/eal_private.h > @@ -152,6 +152,13 @@ int rte_eal_tailqs_init(void); > */ > int rte_eal_intr_init(void); > > +/** > + * Destroy interrupt handling thread. > + * > + * This function is private to EAL. > + */ > +void rte_eal_intr_destroy(void); > + > /** > * Close the default log stream > * > diff --git a/lib/eal/linux/eal.c b/lib/eal/linux/eal.c index > 1ef263434a..b310681acf 100644 > --- a/lib/eal/linux/eal.c > +++ b/lib/eal/linux/eal.c > @@ -1266,6 +1266,7 @@ rte_eal_cleanup(void) > vfio_mp_sync_cleanup(); > #endif > rte_mp_channel_cleanup(); > + rte_eal_intr_destroy(); > /* after this point, any DPDK pointers will become dangling */ > rte_eal_memory_detach(); > eal_mp_dev_hotplug_cleanup(); > diff --git a/lib/eal/linux/eal_interrupts.c b/lib/eal/linux/eal_interrupts.c > index d52ec8eb4c..b246b87273 100644 > --- a/lib/eal/linux/eal_interrupts.c > +++ b/lib/eal/linux/eal_interrupts.c > @@ -1199,6 +1199,18 @@ rte_eal_intr_init(void) > return ret; > } > > +void > +rte_eal_intr_destroy(void) > +{ > + /* cancel the host thread */ > + pthread_cancel(intr_thread); > + pthread_join(intr_thread, NULL); > + > + /* close the pipe used by epoll */ > + close(intr_pipe.writefd); > + close(intr_pipe.readfd); > +} > + > static void > eal_intr_proc_rxtx_intr(int fd, const struct rte_intr_handle *intr_handle) { > -- > 2.25.1