* Re: [PATCH] examples/vhost: fix hang on exit
2026-10-29 14:47 [PATCH] examples/vhost: fix hang on exit Stephen Hemminger
@ 2026-10-29 15:48 ` Maxime Coquelin
2026-10-29 16:57 ` [PATCH v2] " Stephen Hemminger
1 sibling, 0 replies; 4+ messages in thread
From: Maxime Coquelin @ 2026-10-29 15:48 UTC (permalink / raw)
To: Stephen Hemminger, dev; +Cc: stable, Yu Jiang, Chenbo Xia, Bruce Richardson
On 10/29/26 3:47 PM, Stephen Hemminger wrote:
> destroy_device() waits for the worker lcore to ack device removal.
> Since the signal handler rework, the workers exit before the vhost
> drivers are unregistered, so the destroy callback spins forever.
>
> Unregister the drivers while the workers are still polling, then
> stop and join them.
>
> Bugzilla ID: 2071
> Fixes: 5ffa8fafcbd3 ("examples/vhost: make signal handler safe")
> Cc: stable@dpdk.org
>
> Reported-by: Yu Jiang <yux.jiang@intel.com>
> Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
> ---
> examples/vhost/main.c | 4 +++-
> 1 file changed, 3 insertions(+), 1 deletion(-)
>
> diff --git a/examples/vhost/main.c b/examples/vhost/main.c
> index 523195f5c4..16c9387f8f 100644
> --- a/examples/vhost/main.c
> +++ b/examples/vhost/main.c
> @@ -69,6 +69,8 @@ static uint32_t enabled_port_mask = 0;
> /* Set by the SIGINT handler to stop the worker loops. */
> static volatile sig_atomic_t quit;
>
> +static RTE_ATOMIC(bool) stop_workers;
> +
> /* Promiscuous mode */
> static uint32_t promiscuous;
>
> @@ -1242,7 +1244,7 @@ switch_worker(void *arg)
> }
> }
>
> - while (!quit) {
> + while (!rte_atomic_load_explicit(&stop_workers, rte_memory_order_relaxed)) {
> drain_mbuf_table(tx_q);
> drain_vhost_table();
> /*
Are you sure you committed all the changes? I don't see a store of true
to stop_workers.
^ permalink raw reply [flat|nested] 4+ messages in thread* [PATCH v2] examples/vhost: fix hang on exit
2026-10-29 14:47 [PATCH] examples/vhost: fix hang on exit Stephen Hemminger
2026-10-29 15:48 ` Maxime Coquelin
@ 2026-10-29 16:57 ` Stephen Hemminger
2026-10-29 18:03 ` Stephen Hemminger
1 sibling, 1 reply; 4+ messages in thread
From: Stephen Hemminger @ 2026-10-29 16:57 UTC (permalink / raw)
To: dev
Cc: Stephen Hemminger, stable, Yu Jiang, Maxime Coquelin, Chenbo Xia,
Bruce Richardson
destroy_device() waits for the worker lcore to ack device removal.
Since the signal handler rework, the workers exit before the vhost
drivers are unregistered, so the destroy callback spins forever.
Maing thread now blocks SIGINT and SIGTERM and uses sigwait
to wait for one of these signals. Then unregisters and tells
worker threads to stop.
Bugzilla ID: 2071
Fixes: 5ffa8fafcbd3 ("examples/vhost: make signal handler safe")
Cc: stable@dpdk.org
Reported-by: Yu Jiang <yux.jiang@intel.com>
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
examples/vhost/main.c | 27 +++++++++++++++------------
1 file changed, 15 insertions(+), 12 deletions(-)
diff --git a/examples/vhost/main.c b/examples/vhost/main.c
index 523195f5c4..e7434fd189 100644
--- a/examples/vhost/main.c
+++ b/examples/vhost/main.c
@@ -66,8 +66,7 @@ static int total_num_mbufs = NUM_MBUFS_DEFAULT;
/* mask of enabled ports */
static uint32_t enabled_port_mask = 0;
-/* Set by the SIGINT handler to stop the worker loops. */
-static volatile sig_atomic_t quit;
+static RTE_ATOMIC(bool) stop_workers;
/* Promiscuous mode */
static uint32_t promiscuous;
@@ -1242,7 +1241,7 @@ switch_worker(void *arg)
}
}
- while (!quit) {
+ while (!rte_atomic_load_explicit(&stop_workers, rte_memory_order_relaxed)) {
drain_mbuf_table(tx_q);
drain_vhost_table();
/*
@@ -1494,12 +1493,6 @@ unregister_drivers(int socket_num)
}
}
-static void
-sigint_handler(__rte_unused int signum)
-{
- quit = 1;
-}
-
/*
* Main function, does initialisation and calls the per-lcore functions.
*/
@@ -1513,8 +1506,13 @@ main(int argc, char *argv[])
uint16_t portid;
rte_thread_t tid;
uint64_t flags = RTE_VHOST_USER_NET_COMPLIANT_OL_FLAGS;
+ sigset_t set;
+ int sig;
- signal(SIGINT, sigint_handler);
+ sigemptyset(&set);
+ sigaddset(&set, SIGINT);
+ sigaddset(&set, SIGTERM);
+ pthread_sigmask(SIG_BLOCK, &set, NULL);
/* init EAL */
ret = rte_eal_init(argc, argv);
@@ -1654,12 +1652,17 @@ main(int argc, char *argv[])
}
}
- RTE_LCORE_FOREACH_WORKER(lcore_id)
- rte_eal_wait_lcore(lcore_id);
+ /* Wait until SIGINT or SIGTERM */
+ sigwait(&set, &sig);
+ pthread_sigmask(SIG_UNBLOCK, &set, NULL);
/* Unregister vhost driver. */
unregister_drivers(nb_sockets);
+ /* Tell worker threads to exit */
+ rte_atomic_store_explicit(&stop_workers, true, rte_memory_order_relaxed);
+ rte_eal_mp_wait_lcore();
+
/* clean up the EAL */
rte_eal_cleanup();
--
2.53.0
^ permalink raw reply related [flat|nested] 4+ messages in thread