efi_name[i] = name[i];
 
        ret = efivar_entry_set_safe(efi_name, vendor, PSTORE_EFI_ATTRIBUTES,
-                             preemptible(), record->size, record->psi->buf);
+                             false, record->size, record->psi->buf);
 
        if (record->reason == KMSG_DUMP_OOPS && try_module_get(THIS_MODULE))
                if (!schedule_work(&efivar_work))
 
        mod_timer(&pstore_timer, jiffies + msecs_to_jiffies(pstore_update_ms));
 }
 
-/*
- * Should pstore_dump() wait for a concurrent pstore_dump()? If
- * not, the current pstore_dump() will report a failure to dump
- * and return.
- */
-static bool pstore_cannot_wait(enum kmsg_dump_reason reason)
+static bool pstore_cannot_block_path(enum kmsg_dump_reason reason)
 {
-       /* In NMI path, pstore shouldn't block regardless of reason. */
+       /*
+        * In case of NMI path, pstore shouldn't be blocked
+        * regardless of reason.
+        */
        if (in_nmi())
                return true;
 
        switch (reason) {
        /* In panic case, other cpus are stopped by smp_send_stop(). */
        case KMSG_DUMP_PANIC:
-       /* Emergency restart shouldn't be blocked. */
+       /*
+        * Emergency restart shouldn't be blocked by spinning on
+        * pstore_info::buf_lock.
+        */
        case KMSG_DUMP_EMERG:
                return true;
        default:
        unsigned long   total = 0;
        const char      *why;
        unsigned int    part = 1;
+       unsigned long   flags = 0;
        int             ret;
 
        why = kmsg_dump_reason_str(reason);
 
-       if (down_trylock(&psinfo->buf_lock)) {
-               /* Failed to acquire lock: give up if we cannot wait. */
-               if (pstore_cannot_wait(reason)) {
-                       pr_err("dump skipped in %s path: may corrupt error record\n",
-                               in_nmi() ? "NMI" : why);
-                       return;
-               }
-               if (down_interruptible(&psinfo->buf_lock)) {
-                       pr_err("could not grab semaphore?!\n");
+       if (pstore_cannot_block_path(reason)) {
+               if (!spin_trylock_irqsave(&psinfo->buf_lock, flags)) {
+                       pr_err("dump skipped in %s path because of concurrent dump\n",
+                                       in_nmi() ? "NMI" : why);
                        return;
                }
+       } else {
+               spin_lock_irqsave(&psinfo->buf_lock, flags);
        }
 
        kmsg_dump_rewind(&iter);
                total += record.size;
                part++;
        }
-
-       up(&psinfo->buf_lock);
+       spin_unlock_irqrestore(&psinfo->buf_lock, flags);
 }
 
 static struct kmsg_dumper pstore_dumper = {
                psi->write_user = pstore_write_user_compat;
        psinfo = psi;
        mutex_init(&psinfo->read_mutex);
-       sema_init(&psinfo->buf_lock, 1);
+       spin_lock_init(&psinfo->buf_lock);
 
        if (psi->flags & PSTORE_FLAGS_DMESG)
                allocate_buf_for_compression();
 
 #include <linux/errno.h>
 #include <linux/kmsg_dump.h>
 #include <linux/mutex.h>
-#include <linux/semaphore.h>
+#include <linux/spinlock.h>
 #include <linux/time.h>
 #include <linux/types.h>
 
  * @owner:     module which is responsible for this backend driver
  * @name:      name of the backend driver
  *
- * @buf_lock:  semaphore to serialize access to @buf
+ * @buf_lock:  spinlock to serialize access to @buf
  * @buf:       preallocated crash dump buffer
  * @bufsize:   size of @buf available for crash dump bytes (must match
  *             smallest number of bytes available for writing to a
        struct module   *owner;
        const char      *name;
 
-       struct semaphore buf_lock;
+       spinlock_t      buf_lock;
        char            *buf;
        size_t          bufsize;