Message ID | 20201008153048.19369-2-rohit.raj@nxp.com |
---|---|
State | New |
Delegated to: | Thomas Monjalon |
Headers | show |
Series |
|
Related | show |
Context | Check | Description |
---|---|---|
ci/checkpatch | success | coding style OK |
On Thu, Oct 8, 2020 at 5:31 PM <rohit.raj@nxp.com> wrote: > > From: Rohit Raj <rohit.raj@nxp.com> > > Certain bus objects may need to be closed and re-acquired > while terminating and rerunning the client application. > Hence a signal handler is required to catch the termination > of the App and hence closing the bus objects. > > This patch adds the missing signal handler in the client > app and closes the Bus objects in both client and server > applications when the signal Handler is called. > > Signed-off-by: Rohit Raj <rohit.raj@nxp.com> > --- > .../multi_process/client_server_mp/mp_client/client.c | 11 +++++++++++ > .../multi_process/client_server_mp/mp_server/main.c | 4 +++- > 2 files changed, 14 insertions(+), 1 deletion(-) > > diff --git a/examples/multi_process/client_server_mp/mp_client/client.c b/examples/multi_process/client_server_mp/mp_client/client.c > index 361d90b54..c37516b4c 100644 > --- a/examples/multi_process/client_server_mp/mp_client/client.c > +++ b/examples/multi_process/client_server_mp/mp_client/client.c > @@ -11,6 +11,7 @@ > #include <stdlib.h> > #include <getopt.h> > #include <string.h> > +#include <signal.h> > > #include <rte_common.h> > #include <rte_malloc.h> > @@ -196,6 +197,14 @@ handle_packet(struct rte_mbuf *buf) > > } > > +static void > +signal_handler(int signal) > +{ > + if (signal == SIGINT) > + rte_eal_cleanup(); > + exit(0); > +} Calling rte_eal_cleanup from a signal handler is a bad idea. In most cases, you are racing with other threads still using DPDK resources. https://git.dpdk.org/dpdk/commit?id=2c434431f4 https://git.dpdk.org/dpdk/commit?id=613ce6691c This might not be a problem in this multi_process example, but let's keep a consistent way across all examples. Thanks.
diff --git a/examples/multi_process/client_server_mp/mp_client/client.c b/examples/multi_process/client_server_mp/mp_client/client.c index 361d90b54..c37516b4c 100644 --- a/examples/multi_process/client_server_mp/mp_client/client.c +++ b/examples/multi_process/client_server_mp/mp_client/client.c @@ -11,6 +11,7 @@ #include <stdlib.h> #include <getopt.h> #include <string.h> +#include <signal.h> #include <rte_common.h> #include <rte_malloc.h> @@ -196,6 +197,14 @@ handle_packet(struct rte_mbuf *buf) } +static void +signal_handler(int signal) +{ + if (signal == SIGINT) + rte_eal_cleanup(); + exit(0); +} + /* * Application main function - loops through * receiving and processing packets. Never returns @@ -217,6 +226,8 @@ main(int argc, char *argv[]) argc -= retval; argv += retval; + signal(SIGINT, signal_handler); + if (parse_app_args(argc, argv) < 0) rte_exit(EXIT_FAILURE, "Invalid command-line arguments\n"); diff --git a/examples/multi_process/client_server_mp/mp_server/main.c b/examples/multi_process/client_server_mp/mp_server/main.c index 280dab867..b0241cc20 100644 --- a/examples/multi_process/client_server_mp/mp_server/main.c +++ b/examples/multi_process/client_server_mp/mp_server/main.c @@ -275,11 +275,13 @@ signal_handler(int signal) { uint16_t port_id; - if (signal == SIGINT) + if (signal == SIGINT) { RTE_ETH_FOREACH_DEV(port_id) { rte_eth_dev_stop(port_id); rte_eth_dev_close(port_id); } + rte_eal_cleanup(); + } exit(0); }