On Tue, Sep 02, 2025 at 10:16:04PM +0200, Linus Lüssing wrote: > On the other hand, moving the spinlock out of / around > __br_multicast_stop() would lead to a sleeping-while-atomic bug > when calling timer_delete_sync() in there. And if I were to change > these to a timer_delete() I guess there is no way to do the sync > part after unlocking? There is no equivalent to something like the > flush_workqueue() / drain_workqueue() for workqueues, but for > simple timers instead, right? I'm wondering if it would be sufficient to use timer_del() on .ndo_stop->br_dev_stop()->br_multicast_stop(). And use timer_del_sync() only on .ndo_uninit->br_dev_uninit()-> br_multicast_dev_del()-> br_multicast_ctx_deinit() and br_vlan_put_master()->br_multicast_ctx_deinit(). So basically only sync / wait for timer callbacks to finish if their context is about to be free'd, on bridge or VLAN destruction?