mirror of
https://github.com/ibm-s390-linux/s390-tools.git
synced 2026-08-05 02:14:52 +00:00
cpumf/pai.c: Install SIGINT/SIGTERM handler for graceful termination
Sending signal SIGINT/SIGTERM to a running pai process causes immediate termination of that running process. This usually interrupts a select() system call waiting for more input to read from the installed events and its mapped memory buffers. As there is no signal handler installed, a SIGINT or SIGTERM signal simply terminates the process, sometimes leaving incomplete recorded output file paicryto.XXX (where XXX is the CPU number). Install a signal handler to intercept signal SIGINT or SIGTERM and run one more data collection loop to read out pending data and close all recording output files properly. Signed-off-by: Thomas Richter <tmricht@linux.ibm.com> Reviewed-by: Sumanth Korikkar <sumanthk@linux.ibm.com> Signed-off-by: Jan Höppner <hoeppner@linux.ibm.com>
This commit is contained in:
committed by
Jan Höppner
parent
801e404160
commit
3aaf3c067e
+17
@@ -14,6 +14,7 @@
|
||||
#include <fcntl.h>
|
||||
#include <limits.h>
|
||||
#include <sched.h>
|
||||
#include <signal.h>
|
||||
#include <stdarg.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
@@ -47,6 +48,8 @@
|
||||
#define S390_EVT_PAI_CRYPTO 0x1000
|
||||
#define S390_EVT_PAI_NNPA 0x1800
|
||||
|
||||
/* SIGINT or SIGTERM signal received */
|
||||
static volatile unsigned int sigterm;
|
||||
/* Default values for select() timeout: 1 second */
|
||||
static unsigned long read_interval = 1000;
|
||||
/* Size of mapped perf event ring buffer in 4KB pages.
|
||||
@@ -350,6 +353,10 @@ static int collect(unsigned long cnt)
|
||||
if (FD_ISSET(i, &r_fds))
|
||||
readmap(i);
|
||||
}
|
||||
} else if (errno == EINTR && sigterm) {
|
||||
/* Interrupt by signal SIGINT/SIGTERM, one more iteration */
|
||||
cnt = 2;
|
||||
rc = 0;
|
||||
}
|
||||
} while (rc != -1 && --cnt > 0);
|
||||
return rc;
|
||||
@@ -983,6 +990,12 @@ static void setprio(const char *prio)
|
||||
err(EXIT_FAILURE, "Could not set realtime priority");
|
||||
}
|
||||
|
||||
static void sig_handler(int no)
|
||||
{
|
||||
if (no == SIGINT || no == SIGTERM)
|
||||
sigterm = 1;
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
bool crypto_record = false, report = false;
|
||||
@@ -1070,6 +1083,10 @@ int main(int argc, char **argv)
|
||||
errx(EXIT_FAILURE, "Invalid argument for runtime");
|
||||
}
|
||||
|
||||
if (signal(SIGTERM, sig_handler) == SIG_ERR ||
|
||||
signal(SIGINT, sig_handler) == SIG_ERR)
|
||||
errx(EXIT_FAILURE, "Failed to set signal handler");
|
||||
|
||||
ev_install(group);
|
||||
ev_enable();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user