HomeFreeBSD

Fetch the sigfastblock value in syscalls that wait for signals

Description

Fetch the sigfastblock value in syscalls that wait for signals

We have seen several cases of processes which have become "stuck" in
kern_sigsuspend(). When this occurs, the kernel's td_sigblock_val
is set to 0x10 (one block outstanding) and the userspace copy of the
word is set to 0 (unblocked). Because the kernel's cached value
shows that signals are blocked, kern_sigsuspend() blocks almost all
signals, which means the process hangs indefinitely in sigsuspend().

It is not entirely clear what is causing this condition to occur.
However, it seems to make sense to add some protection against this
case by fetching the latest sigfastblock value from userspace for
syscalls which will sleep waiting for signals. Here, the change is
applied to kern_sigsuspend() and kern_sigtimedwait().

Reviewed by: kib
Sponsored by: Netflix
Differential Revision: https://reviews.freebsd.org/D29225

Details

Provenance
jtlAuthored on Mar 12 2021, 6:14 PM
Reviewer
kib
Differential Revision
D29225: Synchronize the sigfastblock value on entry to sigsuspend
Parents
rG40d593d17eb6: x86: Update some stale comments in cpu_fork() and cpu_copy_thread().
Branches
Unknown
Tags
Unknown