Message ID | 20220517160444.413819-1-zhichaox.zeng@intel.com (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Thomas Monjalon |
Headers | show |
Series | eal/linux: fix segfaults due to thread exit order | expand |
Context | Check | Description |
---|---|---|
ci/intel-Testing | success | Testing PASS |
ci/Intel-compilation | success | Compilation OK |
ci/iol-x86_64-compile-testing | success | Testing PASS |
ci/iol-abi-testing | success | Testing PASS |
ci/iol-x86_64-unit-testing | fail | Testing issues |
ci/iol-aarch64-compile-testing | success | Testing PASS |
ci/iol-aarch64-unit-testing | fail | Testing issues |
ci/github-robot: build | fail | github build: failed |
ci/iol-intel-Functional | success | Functional Testing PASS |
ci/iol-intel-Performance | fail | Performance Testing issues |
ci/checkpatch | success | coding style OK |
> From: zhichaox.zeng@intel.com [mailto:zhichaox.zeng@intel.com] > Sent: Tuesday, 17 May 2022 18.05 > > From: Zhichao Zeng <zhichaox.zeng@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.zeng@intel.com> > --- Acked-by: Morten Brørup <mb@smartsharesystems.com>
Hi Zhichao, Can you please add the same API for freebsd also. Thanks Harman > -----Original Message----- > From: zhichaox.zeng@intel.com <zhichaox.zeng@intel.com> > Sent: Tuesday, May 17, 2022 9:35 PM > To: dev@dpdk.org; qiming.yang@intel.com > Cc: Zhichao Zeng <zhichaox.zeng@intel.com>; Harman Kalra > <hkalra@marvell.com> > Subject: [EXT] [DPDK] eal/linux: fix segfaults due to thread exit order > > External Email > > ---------------------------------------------------------------------- > From: Zhichao Zeng <zhichaox.zeng@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.zeng@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
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) {