[dpdk-dev] [PATCH] Remove printf from signal handler.

Ananyev, Konstantin konstantin.ananyev at intel.com
Thu Dec 10 10:24:37 CET 2020


> Hi
> I don't have a good solution here.
> Removing doesn't seem a good idea because there are many important alerts or reminders in all of those function calls and they may be
> called in other places too.
> I think replacing with "write" can't solve the problem too. Because behavior like stopping port will call driver functions. It's not very
> reasonable to me that replacing all possible logs.
> Use a flag and check the flag for each possible thread? Most examples already do this way. But for complicated app, it will be tricky and
> may cause other issues.

I wonder do we really have to try to 'fix' that?
I don't remember anyone complained about such problem in 10 years DPDK exists.
Konstantin

> 
> Maybe other people have better ideas?
> 
> BRs
> Xiaoyun
> 
> > -----Original Message-----
> > From: prateekag <prateekag at cse.iitb.ac.in>
> > Sent: Thursday, December 10, 2020 08:28
> > To: Li, Xiaoyun <xiaoyun.li at intel.com>
> > Cc: Prateek Agarwal <pratekag at gmail.com>; dev at dpdk.org;
> > thomas at monjalon.net
> > Subject: Re: [dpdk-dev] [PATCH] Remove printf from signal handler.
> >
> > Hi
> > Agree. What is the way out? The printfs you mentioned look like important
> > messages and may have been called outside signal handler routines.
> > Shall they be removed as well or converted to "write" function call? Or we live
> > with the possiblity of deadlock howsoever unlikely.
> > Regards
> > Prateek Agarwal
> >
> >
> > On 2020-12-08 08:28, Li, Xiaoyun wrote:
> > > Hi
> > > I don't object with all the removing of printf.
> > > Just one concern, I don't think you actually solved the problem in
> > > this patch.
> > >
> > > Take testpmd as an example, the signal_handler includes many
> > > complicated actions after that very first printf like force_quit()
> > > which includes stop port, close port, hotplug... and of course a lot of printf in it.
> > > So only removing the first printf doesn't actually solve the issue you
> > > mentioned.
> > >
> > > And many examples do similar things as testpmd, they have the same
> > > issues too.
> > >
> > > BRs
> > > Xiaoyun
> > >
> > >> -----Original Message-----
> > >> From: dev <dev-bounces at dpdk.org> On Behalf Of Prateek Agarwal
> > >> Sent: Saturday, December 5, 2020 01:52
> > >> To: dev at dpdk.org
> > >> Cc: thomas at monjalon.net; Prateek Agarwal <pratekag at gmail.com>;
> > >> Prateek Agarwal <prateekag at cse.iitb.ac.in>
> > >> Subject: [dpdk-dev] [PATCH] Remove printf from signal handler.
> > >>
> > >> printf is not async-signal safe. Using printf in signal handlers may
> > >> lead to deadlock. Removed printf from signal handlers present in
> > >> several applications.
> > >>
> > >> Signed-off-by: Prateek Agarwal <prateekag at cse.iitb.ac.in>
> > >> ---
> > >>  app/pdump/main.c             | 2 --
> > >>  app/test-eventdev/evt_main.c | 4 ----
> > >>  app/test-flow-perf/main.c    | 3 ---
> > >>  app/test-pmd/testpmd.c       | 2 --
> > >>  app/test/test_pmd_perf.c     | 1 -
> > >>  5 files changed, 12 deletions(-)
> > >>
> > >> diff --git a/app/pdump/main.c b/app/pdump/main.c index
> > >> b34bf3353..380f0ea0f 100644
> > >> --- a/app/pdump/main.c
> > >> +++ b/app/pdump/main.c
> > >> @@ -573,8 +573,6 @@ static void
> > >>  signal_handler(int sig_num)
> > >>  {
> > >>  	if (sig_num == SIGINT) {
> > >> -		printf("\n\nSignal %d received, preparing to exit...\n",
> > >> -				sig_num);
> > >>  		quit_signal = 1;
> > >>  	}
> > >>  }
> > >> diff --git a/app/test-eventdev/evt_main.c
> > >> b/app/test-eventdev/evt_main.c index a8d304bab..51d5897f8 100644
> > >> --- a/app/test-eventdev/evt_main.c
> > >> +++ b/app/test-eventdev/evt_main.c
> > >> @@ -22,12 +22,8 @@ signal_handler(int signum)  {
> > >>  	int i;
> > >>  	static uint8_t once;
> > >> -
> > >>  	if ((signum == SIGINT || signum == SIGTERM) && !once) {
> > >>  		once = true;
> > >> -		printf("\nSignal %d received, preparing to exit...\n",
> > >> -				signum);
> > >> -
> > >>  		if (test != NULL) {
> > >>  			/* request all lcores to exit from the main loop */
> > >>  			*(int *)test->test_priv = true;
> > >> diff --git a/app/test-flow-perf/main.c b/app/test-flow-perf/main.c
> > >> index
> > >> 03d01a8b5..aeb0ef3b0 100644
> > >> --- a/app/test-flow-perf/main.c
> > >> +++ b/app/test-flow-perf/main.c
> > >> @@ -1001,9 +1001,6 @@ static void
> > >>  signal_handler(int signum)
> > >>  {
> > >>  	if (signum == SIGINT || signum == SIGTERM) {
> > >> -		printf("\n\nSignal %d received, preparing to exit...\n",
> > >> -					signum);
> > >> -		printf("Error: Stats are wrong due to sudden signal!\n\n");
> > >>  		force_quit = true;
> > >>  	}
> > >>  }
> > >> diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c index
> > >> 33fc0fddf..7ec87e7fd 100644
> > >> --- a/app/test-pmd/testpmd.c
> > >> +++ b/app/test-pmd/testpmd.c
> > >> @@ -3794,8 +3794,6 @@ static void
> > >>  signal_handler(int signum)
> > >>  {
> > >>  	if (signum == SIGINT || signum == SIGTERM) {
> > >> -		printf("\nSignal %d received, preparing to exit...\n",
> > >> -				signum);
> > >>  #ifdef RTE_LIB_PDUMP
> > >>  		/* uninitialize packet capture framework */
> > >>  		rte_pdump_uninit();
> > >> diff --git a/app/test/test_pmd_perf.c b/app/test/test_pmd_perf.c
> > >> index
> > >> 4db816a36..58cb84401 100644
> > >> --- a/app/test/test_pmd_perf.c
> > >> +++ b/app/test/test_pmd_perf.c
> > >> @@ -319,7 +319,6 @@ signal_handler(int signum)  {
> > >>  	/*  USR1 signal, stop testing */
> > >>  	if (signum == SIGUSR1) {
> > >> -		printf("Force Stop!\n");
> > >>  		stop = 1;
> > >>  	}
> > >>
> > >> --
> > >> 2.25.1


More information about the dev mailing list