aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/generic/patches-2.6.32/930-kmsg_dump_backport.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/generic/patches-2.6.32/930-kmsg_dump_backport.patch')
-rw-r--r--target/linux/generic/patches-2.6.32/930-kmsg_dump_backport.patch205
1 files changed, 0 insertions, 205 deletions
diff --git a/target/linux/generic/patches-2.6.32/930-kmsg_dump_backport.patch b/target/linux/generic/patches-2.6.32/930-kmsg_dump_backport.patch
deleted file mode 100644
index b9091c7b23..0000000000
--- a/target/linux/generic/patches-2.6.32/930-kmsg_dump_backport.patch
+++ /dev/null
@@ -1,205 +0,0 @@
---- /dev/null
-+++ b/include/linux/kmsg_dump.h
-@@ -0,0 +1,44 @@
-+/*
-+ * linux/include/kmsg_dump.h
-+ *
-+ * Copyright (C) 2009 Net Insight AB
-+ *
-+ * Author: Simon Kagstrom <simon.kagstrom@netinsight.net>
-+ *
-+ * This file is subject to the terms and conditions of the GNU General Public
-+ * License. See the file COPYING in the main directory of this archive
-+ * for more details.
-+ */
-+#ifndef _LINUX_KMSG_DUMP_H
-+#define _LINUX_KMSG_DUMP_H
-+
-+#include <linux/list.h>
-+
-+enum kmsg_dump_reason {
-+ KMSG_DUMP_OOPS,
-+ KMSG_DUMP_PANIC,
-+};
-+
-+/**
-+ * struct kmsg_dumper - kernel crash message dumper structure
-+ * @dump: The callback which gets called on crashes. The buffer is passed
-+ * as two sections, where s1 (length l1) contains the older
-+ * messages and s2 (length l2) contains the newer.
-+ * @list: Entry in the dumper list (private)
-+ * @registered: Flag that specifies if this is already registered
-+ */
-+struct kmsg_dumper {
-+ void (*dump)(struct kmsg_dumper *dumper, enum kmsg_dump_reason reason,
-+ const char *s1, unsigned long l1,
-+ const char *s2, unsigned long l2);
-+ struct list_head list;
-+ int registered;
-+};
-+
-+void kmsg_dump(enum kmsg_dump_reason reason);
-+
-+int kmsg_dump_register(struct kmsg_dumper *dumper);
-+
-+int kmsg_dump_unregister(struct kmsg_dumper *dumper);
-+
-+#endif /* _LINUX_KMSG_DUMP_H */
---- a/kernel/panic.c
-+++ b/kernel/panic.c
-@@ -10,6 +10,7 @@
- */
- #include <linux/debug_locks.h>
- #include <linux/interrupt.h>
-+#include <linux/kmsg_dump.h>
- #include <linux/kallsyms.h>
- #include <linux/notifier.h>
- #include <linux/module.h>
-@@ -74,6 +75,7 @@ NORET_TYPE void panic(const char * fmt,
- dump_stack();
- #endif
-
-+ kmsg_dump(KMSG_DUMP_PANIC);
- /*
- * If we have crashed and we have a crash kernel loaded let it handle
- * everything else.
-@@ -339,6 +341,7 @@ void oops_exit(void)
- {
- do_oops_enter_exit();
- print_oops_end_marker();
-+ kmsg_dump(KMSG_DUMP_OOPS);
- }
-
- #ifdef WANT_WARN_ON_SLOWPATH
---- a/kernel/printk.c
-+++ b/kernel/printk.c
-@@ -33,6 +33,7 @@
- #include <linux/bootmem.h>
- #include <linux/syscalls.h>
- #include <linux/kexec.h>
-+#include <linux/kmsg_dump.h>
-
- #include <asm/uaccess.h>
-
-@@ -1407,3 +1408,121 @@ bool printk_timed_ratelimit(unsigned lon
- }
- EXPORT_SYMBOL(printk_timed_ratelimit);
- #endif
-+
-+static DEFINE_SPINLOCK(dump_list_lock);
-+static LIST_HEAD(dump_list);
-+
-+/**
-+ * kmsg_dump_register - register a kernel log dumper.
-+ * @dump: pointer to the kmsg_dumper structure
-+ *
-+ * Adds a kernel log dumper to the system. The dump callback in the
-+ * structure will be called when the kernel oopses or panics and must be
-+ * set. Returns zero on success and %-EINVAL or %-EBUSY otherwise.
-+ */
-+int kmsg_dump_register(struct kmsg_dumper *dumper)
-+{
-+ unsigned long flags;
-+ int err = -EBUSY;
-+
-+ /* The dump callback needs to be set */
-+ if (!dumper->dump)
-+ return -EINVAL;
-+
-+ spin_lock_irqsave(&dump_list_lock, flags);
-+ /* Don't allow registering multiple times */
-+ if (!dumper->registered) {
-+ dumper->registered = 1;
-+ list_add_tail(&dumper->list, &dump_list);
-+ err = 0;
-+ }
-+ spin_unlock_irqrestore(&dump_list_lock, flags);
-+
-+ return err;
-+}
-+EXPORT_SYMBOL_GPL(kmsg_dump_register);
-+
-+/**
-+ * kmsg_dump_unregister - unregister a kmsg dumper.
-+ * @dump: pointer to the kmsg_dumper structure
-+ *
-+ * Removes a dump device from the system. Returns zero on success and
-+ * %-EINVAL otherwise.
-+ */
-+int kmsg_dump_unregister(struct kmsg_dumper *dumper)
-+{
-+ unsigned long flags;
-+ int err = -EINVAL;
-+
-+ spin_lock_irqsave(&dump_list_lock, flags);
-+ if (dumper->registered) {
-+ dumper->registered = 0;
-+ list_del(&dumper->list);
-+ err = 0;
-+ }
-+ spin_unlock_irqrestore(&dump_list_lock, flags);
-+
-+ return err;
-+}
-+EXPORT_SYMBOL_GPL(kmsg_dump_unregister);
-+
-+static const char const *kmsg_reasons[] = {
-+ [KMSG_DUMP_OOPS] = "oops",
-+ [KMSG_DUMP_PANIC] = "panic",
-+};
-+
-+static const char *kmsg_to_str(enum kmsg_dump_reason reason)
-+{
-+ if (reason >= ARRAY_SIZE(kmsg_reasons) || reason < 0)
-+ return "unknown";
-+
-+ return kmsg_reasons[reason];
-+}
-+
-+/**
-+ * kmsg_dump - dump kernel log to kernel message dumpers.
-+ * @reason: the reason (oops, panic etc) for dumping
-+ *
-+ * Iterate through each of the dump devices and call the oops/panic
-+ * callbacks with the log buffer.
-+ */
-+void kmsg_dump(enum kmsg_dump_reason reason)
-+{
-+ unsigned long end;
-+ unsigned chars;
-+ struct kmsg_dumper *dumper;
-+ const char *s1, *s2;
-+ unsigned long l1, l2;
-+ unsigned long flags;
-+
-+ /* Theoretically, the log could move on after we do this, but
-+ there's not a lot we can do about that. The new messages
-+ will overwrite the start of what we dump. */
-+ spin_lock_irqsave(&logbuf_lock, flags);
-+ end = log_end & LOG_BUF_MASK;
-+ chars = logged_chars;
-+ spin_unlock_irqrestore(&logbuf_lock, flags);
-+
-+ if (logged_chars > end) {
-+ s1 = log_buf + log_buf_len - logged_chars + end;
-+ l1 = logged_chars - end;
-+
-+ s2 = log_buf;
-+ l2 = end;
-+ } else {
-+ s1 = "";
-+ l1 = 0;
-+
-+ s2 = log_buf + end - logged_chars;
-+ l2 = logged_chars;
-+ }
-+
-+ if (!spin_trylock_irqsave(&dump_list_lock, flags)) {
-+ printk(KERN_ERR "dump_kmsg: dump list lock is held during %s, skipping dump\n",
-+ kmsg_to_str(reason));
-+ return;
-+ }
-+ list_for_each_entry(dumper, &dump_list, list)
-+ dumper->dump(dumper, reason, s1, l1, s2, l2);
-+ spin_unlock_irqrestore(&dump_list_lock, flags);
-+}