On Mon, 11 Jul, at 04:59:24PM, Ard Biesheuvel wrote: > From: Sylvain Chouleur <sylvain.chouleur@xxxxxxxxx> > > All efivars operations are protected by a spinlock which prevents > interruptions and preemption. This is too restricted, we just need a > lock preventing concurrency. > The idea is to use a semaphore of count 1 and to have two ways of > locking, depending on the context: > - In interrupt context, we call down_trylock(), if it fails we return > an error > - In normal context, we call down_interruptible() > > We don't use a mutex here because the mutex_trylock() function must not > be called from interrupt context, whereas the down_trylock() can. > > Signed-off-by: Sylvain Chouleur <sylvain.chouleur@xxxxxxxxx> > [ardb: rebased onto v4.7-rc3] > Signed-off-by: Ard Biesheuvel <ard.biesheuvel@xxxxxxxxxx> > --- > drivers/firmware/efi/efi-pstore.c | 36 +++-- > drivers/firmware/efi/efivars.c | 22 +++- > drivers/firmware/efi/vars.c | 137 ++++++++++++-------- > fs/efivarfs/inode.c | 5 +- > fs/efivarfs/super.c | 9 +- > include/linux/efi.h | 6 +- > 6 files changed, 143 insertions(+), 72 deletions(-) [...] > @@ -545,10 +562,10 @@ EXPORT_SYMBOL_GPL(efivar_entry_remove); > */ > static void efivar_entry_list_del_unlock(struct efivar_entry *entry) > { > - lockdep_assert_held(&efivars_lock); > + lockdep_assert_held(&efivars_lock.lock); > > list_del(&entry->list); > - spin_unlock_irq(&efivars_lock); > + up(&efivars_lock); > } > > /** These LOCKDEP annotations are now incorrect because the spin lock inside the semaphore is only held while acquiring the semaphore. I can't see an equivalent assert for semaphores, so it's probably best to just rip these out. Other than that, this looks OK. -- To unsubscribe from this list: send the line "unsubscribe linux-efi" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html