Re: [PATCH 00/13] make signal handlers async-signal-safe
From: Bruce Richardson <hidden>
Date: 2026-09-07 09:06:43
On Sun, Sep 06, 2026 at 04:24:35PM -0700, Stephen Hemminger wrote:
Signal handlers may only call the functions listed in signal-safety(7). Many DPDK examples ignored this and did printf() a "preparing to exit" message before setting the quit flag. A signal during another printf call can deadlock. And some of the programs did even more unsafe things. GCC 14 -fanalyzer reports these: warning: call to 'printf' from within signal handler [CWE-479] [-Wanalyzer-unsafe-call-within-signal-handler] The fix is the same throughout: the handler only sets the existing volatile flag, and any real work moves to the main loop or to main() after the lcores are joined. The message is dropped; the user pressed ^C and knows a signal was sent. Patches 1-2 only delete the printf(). Patches 3-13 also relocate work that was being done in the handler. Behaviour changes worth review: - examples/ntb: SIGINT used to printf(), restore SIG_DFL and re-raise, killing the process without stopping the forwarding lcores or closing the devices. It now sets the per-lcore stopped flag, so SIGINT stops forwarding and returns to the ntb> prompt; quit does the teardown. - examples/vdpa: the teardown moved to main() now also closes the vDPA devices when leaving interactive mode, which was missing before. - examples/eventdev_pipeline: the second-signal escape hatch becomes _exit() instead of rte_exit(), the --dump-dev exit dump moves to main() (and uses the real dev_id rather than a hardcoded 0), and SIGTSTP now sets cdata.dump_dev_signal, which schedule_devices() already drained but nothing ever set. The SIGTSTP dump therefore requires a scheduler lcore. Only examples/ethtool and examples/vmdq_dcb carry a Fixes: tag; the rest remove an unsafe call that has not been seen to deadlock in practice and are cleanups rather than backport material. Applications outside the analyzer's reach likely have the same pattern; this covers what GCC flagged, plus eventdev_pipeline found by inspection. Build tested with GCC 14 -fanalyzer; the warnings are gone for the files touched. Stephen Hemminger (13): graph: do not call printf in signal examples: remove printf from signal handler examples/vmdq: do not print from signal handler examples/symmetric_mp: do not print or exit in handler examples/vdpa: make signal handler safe examples/vhost: make signal handler safe examples/vhost_blk: do not tear down from signal handler examples/ntb: do not print and re-raise from signal handler examples/ipsecgw: do not print from signal handler examples/l2fwd-macsec: remove print in signal handler examples/ethtool: fix exit flag and unchecked cmdline examples/vmdq_dcb: allow exit on signal examples/eventdev_pipeline: make signal handler safe
Series-Acked-by: Bruce Richardson [off-list ref]