1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 21:08:12 +00:00

Kernel: Dispatch pending signals when returning from a syscall

It was quite easy to put the system into a heavy churn state by doing
e.g "cat /dev/zero".

It was then basically impossible to kill the "cat" process, even with
"kill -9", since signals are only delivered in two conditions:

a) The target thread is blocked in the kernel
b) The target thread is running in userspace

However, since "cat /dev/zero" command spends most of its time actively
running in the kernel, not blocked, the signal dispatch code just kept
postponing actually handling the signal indefinitely.

To fix this, we now check before returning from a syscall if there are
any pending unmasked signals, and if so, we take a dramatic pause by
blocking the current thread, knowing it will immediately be unblocked
by signal dispatch anyway. :^)
This commit is contained in:
Andreas Kling 2020-01-12 15:04:33 +01:00
parent 62a191b59a
commit 8b54ba0d61
2 changed files with 6 additions and 5 deletions

View file

@ -135,4 +135,7 @@ void syscall_handler(RegisterDump regs)
// Check if we're supposed to return to userspace or just die.
current->die_if_needed();
if (current->has_unmasked_pending_signals())
(void)current->block<Thread::SemiPermanentBlocker>(Thread::SemiPermanentBlocker::Reason::Signal);
}