On Thu, May 05, 2022 at 03:29:09PM +0200, Ansuel Smith wrote: > On Thu, May 05, 2022 at 03:10:21AM +0200, Andrew Lunn wrote: > > > @@ -400,7 +400,7 @@ static int netdev_trig_notify(struct notifier_block *nb, > > > > > > cancel_delayed_work_sync(&trigger_data->work); > > > > > > - spin_lock_bh(&trigger_data->lock); > > > + mutex_lock(&trigger_data->lock); > > > > I'm not sure you can convert a spin_lock_bh() in a mutex_lock(). > > > > Did you check this? What context is the notifier called in? > > > > Andrew > > I had to do this because qca8k use completion to set the value and that > can sleep... Mhhh any idea how to handle this? First step is to define what the lock is protecting. Once you know that, you should be able to see what you can do without actually holding the lock. Do you need the lock when actually setting the LED? Or is the lock protecting state information inside trigger_data? Can you make a copy of what you need from trigger_data while holding the lock, release it and then set the LED? Maybe a nested mutex and a spin lock? The spin lock protecting trigger_data, and the mutex protecting setting the LED? Andrew