Revert "pstore: Don't use semaphores in always-atomic-context code"
This reverts commit 86a926c3f0
.
It breaks the abi and is not needed for Android devices so it can be
dropped.
Bug: 161946584
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
Change-Id: I1583e40adde7173e3bd1283ea23feefe7c1e610c
This commit is contained in:
@@ -266,7 +266,7 @@ static int efi_pstore_write(struct pstore_record *record)
|
|||||||
efi_name[i] = name[i];
|
efi_name[i] = name[i];
|
||||||
|
|
||||||
ret = efivar_entry_set_safe(efi_name, vendor, PSTORE_EFI_ATTRIBUTES,
|
ret = efivar_entry_set_safe(efi_name, vendor, PSTORE_EFI_ATTRIBUTES,
|
||||||
false, record->size, record->psi->buf);
|
preemptible(), record->size, record->psi->buf);
|
||||||
|
|
||||||
if (record->reason == KMSG_DUMP_OOPS && try_module_get(THIS_MODULE))
|
if (record->reason == KMSG_DUMP_OOPS && try_module_get(THIS_MODULE))
|
||||||
if (!schedule_work(&efivar_work))
|
if (!schedule_work(&efivar_work))
|
||||||
|
@@ -143,22 +143,21 @@ static void pstore_timer_kick(void)
|
|||||||
mod_timer(&pstore_timer, jiffies + msecs_to_jiffies(pstore_update_ms));
|
mod_timer(&pstore_timer, jiffies + msecs_to_jiffies(pstore_update_ms));
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool pstore_cannot_block_path(enum kmsg_dump_reason reason)
|
/*
|
||||||
|
* 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)
|
||||||
{
|
{
|
||||||
/*
|
/* 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())
|
if (in_nmi())
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
switch (reason) {
|
switch (reason) {
|
||||||
/* In panic case, other cpus are stopped by smp_send_stop(). */
|
/* In panic case, other cpus are stopped by smp_send_stop(). */
|
||||||
case KMSG_DUMP_PANIC:
|
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:
|
case KMSG_DUMP_EMERG:
|
||||||
return true;
|
return true;
|
||||||
default:
|
default:
|
||||||
@@ -389,19 +388,21 @@ static void pstore_dump(struct kmsg_dumper *dumper,
|
|||||||
unsigned long total = 0;
|
unsigned long total = 0;
|
||||||
const char *why;
|
const char *why;
|
||||||
unsigned int part = 1;
|
unsigned int part = 1;
|
||||||
unsigned long flags = 0;
|
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
why = kmsg_dump_reason_str(reason);
|
why = kmsg_dump_reason_str(reason);
|
||||||
|
|
||||||
if (pstore_cannot_block_path(reason)) {
|
if (down_trylock(&psinfo->buf_lock)) {
|
||||||
if (!spin_trylock_irqsave(&psinfo->buf_lock, flags)) {
|
/* Failed to acquire lock: give up if we cannot wait. */
|
||||||
pr_err("dump skipped in %s path because of concurrent dump\n",
|
if (pstore_cannot_wait(reason)) {
|
||||||
in_nmi() ? "NMI" : why);
|
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");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
spin_lock_irqsave(&psinfo->buf_lock, flags);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
oopscount++;
|
oopscount++;
|
||||||
@@ -463,7 +464,8 @@ static void pstore_dump(struct kmsg_dumper *dumper,
|
|||||||
total += record.size;
|
total += record.size;
|
||||||
part++;
|
part++;
|
||||||
}
|
}
|
||||||
spin_unlock_irqrestore(&psinfo->buf_lock, flags);
|
|
||||||
|
up(&psinfo->buf_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct kmsg_dumper pstore_dumper = {
|
static struct kmsg_dumper pstore_dumper = {
|
||||||
@@ -589,7 +591,7 @@ int pstore_register(struct pstore_info *psi)
|
|||||||
psi->write_user = pstore_write_user_compat;
|
psi->write_user = pstore_write_user_compat;
|
||||||
psinfo = psi;
|
psinfo = psi;
|
||||||
mutex_init(&psinfo->read_mutex);
|
mutex_init(&psinfo->read_mutex);
|
||||||
spin_lock_init(&psinfo->buf_lock);
|
sema_init(&psinfo->buf_lock, 1);
|
||||||
|
|
||||||
if (psi->flags & PSTORE_FLAGS_DMESG)
|
if (psi->flags & PSTORE_FLAGS_DMESG)
|
||||||
allocate_buf_for_compression();
|
allocate_buf_for_compression();
|
||||||
|
@@ -14,7 +14,7 @@
|
|||||||
#include <linux/errno.h>
|
#include <linux/errno.h>
|
||||||
#include <linux/kmsg_dump.h>
|
#include <linux/kmsg_dump.h>
|
||||||
#include <linux/mutex.h>
|
#include <linux/mutex.h>
|
||||||
#include <linux/spinlock.h>
|
#include <linux/semaphore.h>
|
||||||
#include <linux/time.h>
|
#include <linux/time.h>
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
|
|
||||||
@@ -87,7 +87,7 @@ struct pstore_record {
|
|||||||
* @owner: module which is responsible for this backend driver
|
* @owner: module which is responsible for this backend driver
|
||||||
* @name: name of the backend driver
|
* @name: name of the backend driver
|
||||||
*
|
*
|
||||||
* @buf_lock: spinlock to serialize access to @buf
|
* @buf_lock: semaphore to serialize access to @buf
|
||||||
* @buf: preallocated crash dump buffer
|
* @buf: preallocated crash dump buffer
|
||||||
* @bufsize: size of @buf available for crash dump bytes (must match
|
* @bufsize: size of @buf available for crash dump bytes (must match
|
||||||
* smallest number of bytes available for writing to a
|
* smallest number of bytes available for writing to a
|
||||||
@@ -178,7 +178,7 @@ struct pstore_info {
|
|||||||
struct module *owner;
|
struct module *owner;
|
||||||
const char *name;
|
const char *name;
|
||||||
|
|
||||||
spinlock_t buf_lock;
|
struct semaphore buf_lock;
|
||||||
char *buf;
|
char *buf;
|
||||||
size_t bufsize;
|
size_t bufsize;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user