Skip to content

Commit

Permalink
kernel/lib: add additional debug capabilites for data corruption
Browse files Browse the repository at this point in the history
Data corruptions in the kernel often end up in system crashes that
are easier to debug closer to the time of detection. Specifically,
if we do not panic immediately after lock or list corruptions have been
detected, the problem context is lost in the ensuing system mayhem.
Add support for allowing system crash immediately after such corruptions
are detected. The CONFIG option controls the enabling/disabling of the
feature.

Change-Id: I9b2eb62da506a13007acff63e85e9515145909ff
Signed-off-by: Syed Rameez Mustafa <rameezmustafa@codeaurora.org>
  • Loading branch information
Syed Rameez Mustafa committed Jul 17, 2013

Unverified

This user has not yet uploaded their public signing key.
1 parent 0de1230 commit 1c014f3
Showing 5 changed files with 25 additions and 1 deletion.
6 changes: 6 additions & 0 deletions include/linux/bug.h
Original file line number Diff line number Diff line change
@@ -96,4 +96,10 @@ static inline enum bug_trap_type report_bug(unsigned long bug_addr,
}

#endif /* CONFIG_GENERIC_BUG */

#ifdef CONFIG_PANIC_ON_DATA_CORRUPTION
#define PANIC_CORRUPTION 1
#else
#define PANIC_CORRUPTION 0
#endif /* CONFIG_PANIC_ON_DATA_CORRUPTION */
#endif /* _LINUX_BUG_H */
2 changes: 2 additions & 0 deletions kernel/workqueue.c
Original file line number Diff line number Diff line change
@@ -41,6 +41,7 @@
#include <linux/debug_locks.h>
#include <linux/lockdep.h>
#include <linux/idr.h>
#include <linux/bug.h>

#include "workqueue_sched.h"

@@ -1878,6 +1879,7 @@ __acquires(&gcwq->lock)
printk(KERN_ERR " last function: ");
print_symbol("%s\n", (unsigned long)f);
debug_show_held_locks(current);
BUG_ON(PANIC_CORRUPTION);
dump_stack();
}

7 changes: 7 additions & 0 deletions lib/Kconfig.debug
Original file line number Diff line number Diff line change
@@ -1290,6 +1290,13 @@ config ASYNC_RAID6_TEST

If unsure, say N.

config PANIC_ON_DATA_CORRUPTION
bool "Cause a Kernel Panic When Data Corruption is detected"
help
Select this option to upgrade warnings for potentially
recoverable data corruption scenarios to system-halting panics,
for easier detection and debug.

source "samples/Kconfig"

source "lib/Kconfig.kgdb"
9 changes: 8 additions & 1 deletion lib/list_debug.c
Original file line number Diff line number Diff line change
@@ -10,6 +10,7 @@
#include <linux/list.h>
#include <linux/bug.h>
#include <linux/kernel.h>
#include <linux/bug.h>

/*
* Insert a new entry between two known consecutive entries.
@@ -30,6 +31,10 @@ void __list_add(struct list_head *new,
"list_add corruption. prev->next should be "
"next (%p), but was %p. (prev=%p).\n",
next, prev->next, prev);

BUG_ON(((prev->next != next) || (next->prev != prev)) &&
PANIC_CORRUPTION);

next->prev = new;
new->next = next;
new->prev = prev;
@@ -55,8 +60,10 @@ void __list_del_entry(struct list_head *entry)
"but was %p\n", entry, prev->next) ||
WARN(next->prev != entry,
"list_del corruption. next->prev should be %p, "
"but was %p\n", entry, next->prev))
"but was %p\n", entry, next->prev)) {
BUG_ON(PANIC_CORRUPTION);
return;
}

__list_del(prev, next);
}
2 changes: 2 additions & 0 deletions lib/spinlock_debug.c
Original file line number Diff line number Diff line change
@@ -12,6 +12,7 @@
#include <linux/debug_locks.h>
#include <linux/delay.h>
#include <linux/export.h>
#include <linux/bug.h>

void __raw_spin_lock_init(raw_spinlock_t *lock, const char *name,
struct lock_class_key *key)
@@ -64,6 +65,7 @@ static void spin_dump(raw_spinlock_t *lock, const char *msg)
owner ? owner->comm : "<none>",
owner ? task_pid_nr(owner) : -1,
lock->owner_cpu);
BUG_ON(PANIC_CORRUPTION);
dump_stack();
}

0 comments on commit 1c014f3

Please sign in to comment.