• Uwe Kleine-König's avatar
    net: dsa: mv88e6xxx: fix races between lock and irq freeing · 3d82475a
    Uwe Kleine-König authored
    free_irq() waits until all handlers for this IRQ have completed. As the
    relevant handler (mv88e6xxx_g1_irq_thread_fn()) takes the chip's reg_lock
    it might never return if the thread calling free_irq() holds this lock.
    
    For the same reason kthread_cancel_delayed_work_sync() in the polling case
    must not hold this lock.
    
    Also first free the irq (or stop the worker respectively) such that
    mv88e6xxx_g1_irq_thread_work() isn't called any more before the irq
    mappings are dropped in mv88e6xxx_g1_irq_free_common() to prevent the
    worker thread to call handle_nested_irq(0) which results in a NULL-pointer
    exception.
    Signed-off-by: default avatarUwe Kleine-König <u.kleine-koenig@pengutronix.de>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    3d82475a
chip.c 127 KB