@@ -25,6 +25,8 @@
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/poll.h>
+#include <signal.h>
+#include <sys/signalfd.h>
#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);
}
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 <shiju.jose@huawei.com> --- ras-events.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 46 insertions(+), 4 deletions(-)