From a7b6a0464fba487f5be10c110fe491588dcf07b0 Mon Sep 17 00:00:00 2001 From: Shiju Jose Date: Wed, 16 Oct 2019 17:34:01 +0100 Subject: [PATCH] rasdaemon: add signal handling for the cleanup Presently rasdaemon would not free allocated memory and would not do other cleanup when the rasdaemon closed with ctrl+c or kill etc. This patch adds handling of the signals SIGINT, SIGTERM, SIGHUP and SIGQUIT and do necessary clean ups when receive the specified signals. Signed-off-by: Shiju Jose Signed-off-by: Mauro Carvalho Chehab --- ras-events.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 46 insertions(+), 4 deletions(-) diff --git a/ras-events.c b/ras-events.c index d155caa..511c93d 100644 --- a/ras-events.c +++ b/ras-events.c @@ -25,6 +25,8 @@ #include #include #include +#include +#include #include "libtrace/kbuffer.h" #include "libtrace/event-parse.h" #include "ras-mc-handler.h" @@ -350,7 +352,9 @@ static int read_ras_event_all_cpus(struct pthread_data *pdata, int ready, i, count_nready; struct kbuffer *kbuf; void *page; - struct pollfd fds[n_cpus]; + struct pollfd fds[n_cpus + 1]; + struct signalfd_siginfo fdsiginfo; + sigset_t mask; int warnonce[n_cpus]; char pipe_raw[PATH_MAX]; int legacy_kernel = 0; @@ -373,7 +377,7 @@ static int read_ras_event_all_cpus(struct pthread_data *pdata, return -ENOMEM; } - for (i = 0; i < n_cpus; i++) + for (i = 0; i < (n_cpus + 1); i++) fds[i].fd = -1; for (i = 0; i < n_cpus; i++) { @@ -390,15 +394,51 @@ static int read_ras_event_all_cpus(struct pthread_data *pdata, } } + sigemptyset(&mask); + sigaddset(&mask, SIGINT); + sigaddset(&mask, SIGTERM); + sigaddset(&mask, SIGHUP); + sigaddset(&mask, SIGQUIT); + if (sigprocmask(SIG_BLOCK, &mask, NULL) == -1) + log(TERM, LOG_WARNING, "sigprocmask\n"); + fds[n_cpus].events = POLLIN; + fds[n_cpus].fd = signalfd(-1, &mask, 0); + if (fds[n_cpus].fd < 0) { + log(TERM, LOG_WARNING, "signalfd\n"); + goto error; + } + log(TERM, LOG_INFO, "Listening to events for cpus 0 to %d\n", n_cpus - 1); if (pdata[0].ras->record_events) ras_mc_event_opendb(pdata[0].cpu, pdata[0].ras); do { - ready = poll(fds, n_cpus, -1); + ready = poll(fds, (n_cpus + 1), -1); if (ready < 0) { log(TERM, LOG_WARNING, "poll\n"); } + + /* check for the signal */ + if (fds[n_cpus].revents & POLLIN) { + size = read(fds[n_cpus].fd, &fdsiginfo, + sizeof(struct signalfd_siginfo)); + if (size != sizeof(struct signalfd_siginfo)) + log(TERM, LOG_WARNING, "signalfd read\n"); + + if (fdsiginfo.ssi_signo == SIGINT || + fdsiginfo.ssi_signo == SIGTERM || + fdsiginfo.ssi_signo == SIGHUP || + fdsiginfo.ssi_signo == SIGQUIT) { + log(TERM, LOG_INFO, "Recevied signal=%d\n", + fdsiginfo.ssi_signo); + goto cleanup; + } else { + log(TERM, LOG_INFO, + "Received unexpected signal=%d\n", + fdsiginfo.ssi_signo); + } + } + count_nready = 0; for (i = 0; i < n_cpus; i++) { if (fds[i].revents & POLLERR) { @@ -462,7 +502,9 @@ cleanup: error: kbuffer_free(kbuf); free(page); - for (i = 0; i < n_cpus; i++) { + sigprocmask(SIG_UNBLOCK, &mask, NULL); + + for (i = 0; i < (n_cpus + 1); i++) { if (fds[i].fd > 0) close(fds[i].fd); } -- 2.50.1