On Thu, Jun 20, 2024, at 13:24, Peter Griffin wrote: > Signed-off-by: Peter Griffin <peter.griffin@xxxxxxxxxx> > Reviewed-by: Arnd Bergmann <arnd@xxxxxxxx> > Reviewed-by: Sam Protsenko <semen.protsenko@xxxxxxxxxx> > --- > Changes in v2: > - Keep syscon lock held between checking and adding entry (Krzysztof) Unfortunately you now have a different bug: > + /* check if syscon entry already exists */ > + spin_lock(&syscon_list_slock); > + > + list_for_each_entry(entry, &syscon_list, list) > + if (entry->np == np) { > + syscon = entry; > + break; > + } > + > + if (syscon) { > + ret = -EEXIST; > + goto err_unlock; > + } > + > + syscon = kzalloc(sizeof(*syscon), GFP_KERNEL); > + if (!syscon) { > + ret = -ENOMEM; > + goto err_unlock; > + } You can't use GFP_KERNEL while holding a spinlock. I think the correct way to do this is to move the allocation before the locked section, and then free it in the failure case. Arnd