• Lukas Wunner's avatar
    genirq: Update code comments wrt recycled thread_mask · 836557bd
    Lukas Wunner authored
    Previously a race existed between __free_irq() and __setup_irq() wherein
    the thread_mask of a just removed action could be handed out to a newly
    added action and the freed irq thread would then tread on the oneshot
    mask bit of the newly added irq thread in irq_finalize_oneshot():
    
    time
     |  __free_irq()
     |    raw_spin_lock_irqsave(&desc->lock, flags);
     |    <remove action from linked list>
     |    raw_spin_unlock_irqrestore(&desc->lock, flags);
     |
     |  __setup_irq()
     |    raw_spin_lock_irqsave(&desc->lock, flags);
     |    <traverse linked list to determine oneshot mask bit>
     |    raw_spin_unlock_irqrestore(&desc->lock, flags);
     |
     |  irq_thread() of freed irq (__free_irq() waits in synchronize_irq())
     |    irq_thread_fn()
     |      irq_finalize_oneshot()
     |        raw_spin_lock_irq(&desc->lock);
     |        desc->threads_oneshot &= ~action->thread_mask;
     |        raw_spin_unlock_irq(&desc->lock);
     v
    
    The race was known at least since 2012 when it was documented in a code
    comment by commit e04268b0 ("genirq: Remove paranoid warnons and bogus
    fixups"). The race itself is harmless as nothing touches any of the
    potentially freed data after synchronize_irq().
    
    In 2017 the race was close by commit 9114014c ("genirq: Add mutex to
    irq desc to serialize request/free_irq()"), apparently inadvertantly so
    because the race is neither mentioned in the commit message nor was the
    code comment updated.  Make up for that.
    Signed-off-by: default avatarLukas Wunner <lukas@wunner.de>
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Cc: Bjorn Helgaas <bhelgaas@google.com>
    Cc: Mika Westerberg <mika.westerberg@linux.intel.com>
    Cc: linux-pci@vger.kernel.org
    Link: https://lkml.kernel.org/r/32fc25aa35ecef4b2692f57687bb7fc2a57230e2.1529828292.git.lukas@wunner.de
    836557bd
manage.c 58.6 KB