wt., 9 cze 2020 o 02:23 Kent Gibson <warthog618@xxxxxxxxx> napisał(a): > > On Tue, Dec 24, 2019 at 01:07:08PM +0100, Bartosz Golaszewski wrote: > > From: Bartosz Golaszewski <bgolaszewski@xxxxxxxxxxxx> > > > > [snip!] > > > +static int lineinfo_changed_notify(struct notifier_block *nb, > > + unsigned long action, void *data) > > +{ > > + struct gpio_chardev_data *priv = to_gpio_chardev_data(nb); > > + struct gpioline_info_changed chg; > > + struct gpio_desc *desc = data; > > + int ret; > > + > > + if (!test_bit(desc_to_gpio(desc), priv->watched_lines)) > > + return NOTIFY_DONE; > > + > > + memset(&chg, 0, sizeof(chg)); > > + chg.info.line_offset = gpio_chip_hwgpio(desc); > > + chg.event_type = action; > > + chg.timestamp = ktime_get_real_ns(); > > + gpio_desc_to_lineinfo(desc, &chg.info); > > + > > Is this call legal? It can sleep - in fact you recently changed that > very function to move a mutex call outside of a spinlock protected section. > Here it is being called within an RCU lock, as lineinfo_changed_notify > is at the end of an atomic_notifier_call_chain. > Yeah, this is clearly wrong and lockdep would complain about invalid wait context. I'm trying to remember why I went for an atomic notifier chain here though... At first glance it doesn't look like the chain could be called from atomic context anywhere. Bart