diff options
| author | Richard Weinberger <richard@nod.at> | 2013-08-18 07:30:08 -0400 |
|---|---|---|
| committer | Richard Weinberger <richard@nod.at> | 2013-09-07 04:56:58 -0400 |
| commit | 91d44ff860a9e9c0db81a89cbc24fa31fbd8e6d3 (patch) | |
| tree | bb14601ab3afbcec3cb8d7d0f207d09cfc792268 /arch/um/os-Linux/aio.c | |
| parent | bc1d72e73be63a7c4a07eb10cf51e91f20bf6076 (diff) | |
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: Richard W.M. Jones <rjones@redhat.com>
Signed-off-by: Richard Weinberger <richard@nod.at>
Diffstat (limited to 'arch/um/os-Linux/aio.c')
| -rw-r--r-- | arch/um/os-Linux/aio.c | 5 |
1 files changed, 2 insertions, 3 deletions
diff --git a/arch/um/os-Linux/aio.c b/arch/um/os-Linux/aio.c index 3a6bc2af0961..014eb35fd13b 100644 --- a/arch/um/os-Linux/aio.c +++ b/arch/um/os-Linux/aio.c | |||
| @@ -104,8 +104,7 @@ static int aio_thread(void *arg) | |||
| 104 | struct io_event event; | 104 | struct io_event event; |
| 105 | int err, n, reply_fd; | 105 | int err, n, reply_fd; |
| 106 | 106 | ||
| 107 | signal(SIGWINCH, SIG_IGN); | 107 | os_fix_helper_signals(); |
| 108 | |||
| 109 | while (1) { | 108 | while (1) { |
| 110 | n = io_getevents(ctx, 1, 1, &event, NULL); | 109 | n = io_getevents(ctx, 1, 1, &event, NULL); |
| 111 | if (n < 0) { | 110 | if (n < 0) { |
| @@ -173,7 +172,7 @@ static int not_aio_thread(void *arg) | |||
| 173 | struct aio_thread_reply reply; | 172 | struct aio_thread_reply reply; |
| 174 | int err; | 173 | int err; |
| 175 | 174 | ||
| 176 | signal(SIGWINCH, SIG_IGN); | 175 | os_fix_helper_signals(); |
| 177 | while (1) { | 176 | while (1) { |
| 178 | err = read(aio_req_fd_r, &req, sizeof(req)); | 177 | err = read(aio_req_fd_r, &req, sizeof(req)); |
| 179 | if (err != sizeof(req)) { | 178 | if (err != sizeof(req)) { |
