]> www.infradead.org Git - users/mchehab/rasdaemon.git/commitdiff
rasdaemon: add signal handling for the cleanup
authorShiju Jose <shiju.jose@huawei.com>
Wed, 16 Oct 2019 16:34:01 +0000 (17:34 +0100)
committerMauro Carvalho Chehab <mchehab+huawei@kernel.org>
Wed, 20 Nov 2019 04:16:24 +0000 (05:16 +0100)
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>
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
ras-events.c

index d155caad6556e2e635d315c975eb1739602d90c7..511c93d656cfe4594fd46fa240dcd20bceb0ead4 100644 (file)
@@ -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);
        }