• Thomas Gleixner's avatar
    eventfd: Make signal recursion protection a task bit · b542e383
    Thomas Gleixner authored
    The recursion protection for eventfd_signal() is based on a per CPU
    variable and relies on the !RT semantics of spin_lock_irqsave() for
    protecting this per CPU variable. On RT kernels spin_lock_irqsave() neither
    disables preemption nor interrupts which allows the spin lock held section
    to be preempted. If the preempting task invokes eventfd_signal() as well,
    then the recursion warning triggers.
    
    Paolo suggested to protect the per CPU variable with a local lock, but
    that's heavyweight and actually not necessary. The goal of this protection
    is to prevent the task stack from overflowing, which can be achieved with a
    per task recursion protection as well.
    
    Replace the per CPU variable with a per task bit similar to other recursion
    protection bits like task_struct::in_page_owner. This works on both !RT and
    RT kernels and removes as a side effect the extra per CPU storage.
    
    No functional change for !RT kernels.
    Reported-by: default avatarDaniel Bristot de Oliveira <bristot@redhat.com>
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Tested-by: default avatarDaniel Bristot de Oliveira <bristot@redhat.com>
    Acked-by: default avatarJason Wang <jasowang@redhat.com>
    Cc: Al Viro <viro@zeniv.linux.org.uk>
    Link: https://lore.kernel.org/r/87wnp9idso.ffs@tglx
    b542e383
eventfd.c 12 KB