Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 91d44ff8 authored by Richard Weinberger's avatar Richard Weinberger
Browse files

um: Cleanup SIGTERM handling



Richard reported that some UML processes survive if the UML
main process receives a SIGTERM.
This issue was caused by a wrongly placed signal(SIGTERM, SIG_DFL)
in init_new_thread_signals().
It disabled the UML exit handler accidently for some processes.
The correct solution is to disable the fatal handler for all
UML helper threads/processes.
Such that last_ditch_exit() does not get called multiple times
and all processes can exit due to SIGTERM.

Reported-and-tested-by: default avatarRichard W.M. Jones <rjones@redhat.com>
Signed-off-by: default avatarRichard Weinberger <richard@nod.at>
parent bc1d72e7
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -7,7 +7,6 @@
#ifndef __UM_UBD_USER_H
#define __UM_UBD_USER_H

extern void ignore_sigwinch_sig(void);
extern int start_io_thread(unsigned long sp, int *fds_out);
extern int io_thread(void *arg);
extern int kernel_fd;
+2 −1
Original line number Diff line number Diff line
@@ -1476,7 +1476,8 @@ int io_thread(void *arg)
	struct io_thread_req *req;
	int n;

	ignore_sigwinch_sig();
	os_fix_helper_signals();

	while(1){
		n = os_read_file(kernel_fd, &req,
				 sizeof(struct io_thread_req *));
+0 −5
Original line number Diff line number Diff line
@@ -21,11 +21,6 @@
#include "ubd.h"
#include <os.h>

void ignore_sigwinch_sig(void)
{
	signal(SIGWINCH, SIG_IGN);
}

int start_io_thread(unsigned long sp, int *fd_out)
{
	int pid, fds[2], err;
+1 −0
Original line number Diff line number Diff line
@@ -235,6 +235,7 @@ extern void setup_machinename(char *machine_out);
extern void setup_hostinfo(char *buf, int len);
extern void os_dump_core(void) __attribute__ ((noreturn));
extern void um_early_printk(const char *s, unsigned int n);
extern void os_fix_helper_signals(void);

/* time.c */
extern void idle_sleep(unsigned long long nsecs);
+2 −3
Original line number Diff line number Diff line
@@ -104,8 +104,7 @@ static int aio_thread(void *arg)
	struct io_event event;
	int err, n, reply_fd;

	signal(SIGWINCH, SIG_IGN);

	os_fix_helper_signals();
	while (1) {
		n = io_getevents(ctx, 1, 1, &event, NULL);
		if (n < 0) {
@@ -173,7 +172,7 @@ static int not_aio_thread(void *arg)
	struct aio_thread_reply reply;
	int err;

	signal(SIGWINCH, SIG_IGN);
	os_fix_helper_signals();
	while (1) {
		err = read(aio_req_fd_r, &req, sizeof(req));
		if (err != sizeof(req)) {
Loading