mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Simon Kagstrom <simon.kagstrom@netinsight.net>
To: Linus Torvalds <torvalds@linux-foundation.org>,
	linux-mtd <linux-mtd@lists.infradead.org>
Cc: Ingo Molnar <mingo@elte.hu>,
	Andrew Morton <akpm@linux-foundation.org>,
	Artem Bityutskiy <dedekind1@gmail.com>,
	David Woodhouse <dwmw2@infradead.org>,
	LKML <linux-kernel@vger.kernel.org>,
	"Koskinen Aaro (Nokia-D/Helsinki)" <aaro.koskinen@nokia.com>,
	Alan Cox <alan@lxorguk.ukuu.org.uk>
Subject: [PATCH/RFC v5 4/5]: core: Add dump device to call on oopses and panics
Date: Tue, 13 Oct 2009 15:22:35 +0200	[thread overview]
Message-ID: <20091013152235.188059d2@marrow.netinsight.se> (raw)
In-Reply-To: <20091013151751.59e217a7@marrow.netinsight.se>

The core functionality is implemented as per Linus suggestion from

  http://lists.infradead.org/pipermail/linux-mtd/2009-October/027620.html

a struct dump_device type has been added which contains callbacks to
dump the kernel log buffers on crashes. The dump_kmsg function gets
called from oops_exit() and panic() and invokes these callbacks.

Signed-off-by: Simon Kagstrom <simon.kagstrom@netinsight.net>
---
 include/linux/dump_device.h |   33 +++++++++++++++++
 kernel/panic.c              |    3 ++
 kernel/printk.c             |   83 +++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 119 insertions(+), 0 deletions(-)
 create mode 100644 include/linux/dump_device.h

diff --git a/include/linux/dump_device.h b/include/linux/dump_device.h
new file mode 100644
index 0000000..8c3f378
--- /dev/null
+++ b/include/linux/dump_device.h
@@ -0,0 +1,33 @@
+/*
+ * linux/include/dump_device.h
+ *
+ * Copyright (C) 2009 Net Insight
+ *
+ * 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_DUMP_DEVICE_H
+#define _LINUX_DUMP_DEVICE_H
+
+#include <linux/list.h>
+
+struct dump_device {
+	void	(*oops)(struct dump_device *, const char *, unsigned long,
+			const char *, unsigned long);
+	void	(*panic)(struct dump_device *, const char *, unsigned long,
+			const char *, unsigned long);
+	int	(*setup)(struct dump_device *);
+	void	*priv;
+	struct	 list_head list;
+};
+
+void dump_kmsg(int panic);
+
+int register_dumpdevice(struct dump_device *dump, void *priv);
+
+void unregister_dumpdevice(struct dump_device *dump);
+
+#endif /* _LINUX_DUMP_DEVICE_H */
diff --git a/kernel/panic.c b/kernel/panic.c
index c0b33b8..e7dbf2b 100644
--- a/kernel/panic.c
+++ b/kernel/panic.c
@@ -8,6 +8,7 @@
  * This function is used through-out the kernel (including mm and fs)
  * to indicate a major problem.
  */
+#include <linux/dump_device.h>
 #include <linux/debug_locks.h>
 #include <linux/interrupt.h>
 #include <linux/kallsyms.h>
@@ -76,6 +77,7 @@ NORET_TYPE void panic(const char * fmt, ...)
 	dump_stack();
 #endif
 
+	dump_kmsg(1);
 	/*
 	 * If we have crashed and we have a crash kernel loaded let it handle
 	 * everything else.
@@ -341,6 +343,7 @@ void oops_exit(void)
 {
 	do_oops_enter_exit();
 	print_oops_end_marker();
+	dump_kmsg(0);
 }
 
 #ifdef WANT_WARN_ON_SLOWPATH
diff --git a/kernel/printk.c b/kernel/printk.c
index f38b07f..5e1fe73 100644
--- 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/dump_device.h>
 
 #include <asm/uaccess.h>
 
@@ -1405,3 +1406,85 @@ bool printk_timed_ratelimit(unsigned long *caller_jiffies,
 }
 EXPORT_SYMBOL(printk_timed_ratelimit);
 #endif
+
+static LIST_HEAD(dump_list);
+static DEFINE_RWLOCK(dump_list_lock);
+
+/**
+ *	register_dump_device - register a dumpdevice.
+ *	@dump: pointer to the dump structure
+ *	@priv: private data for the structure
+ *
+ *	Adds a dump device to the system. The oops and panic callbacks
+ *	in the structure will be called when the kernel oopses and panics
+ *	respectively. At least one of these must be set. Returns zero on
+ *	success and -EINVAL otherwise.
+ */
+int register_dumpdevice(struct dump_device *dump, void *priv)
+{
+	/* We need at least one of these set */
+	if (!dump->oops && !dump->panic)
+		return -EINVAL;
+	if (dump->setup && dump->setup(dump) != 0)
+		return -EINVAL;
+	dump->priv = priv;
+
+	INIT_LIST_HEAD(&dump->list);
+	write_lock(&dump_list_lock);
+	list_add(&dump->list, &dump_list);
+	write_unlock(&dump_list_lock);
+	return 0;
+}
+EXPORT_SYMBOL(register_dumpdevice);
+
+/**
+ *	unregister_dump_device - unregister a dumpdevice.
+ *	@dump: pointer to the dump structure
+ *
+ *	Removes a dump device from the system.
+ */
+void unregister_dumpdevice(struct dump_device *dump)
+{
+	write_lock(&dump_list_lock);
+	list_del(&dump->list);
+	write_unlock(&dump_list_lock);
+}
+EXPORT_SYMBOL(unregister_dumpdevice);
+
+/**
+ *	dump_kmsg - dump kernel log to dump devices.
+ *	@panic: if this is a panic (1) or an oops (0)
+ *
+ *	Iterate through each of the dump devices and call the oops/panic
+ *	callbacks with the log buffer.
+ */
+void dump_kmsg(int panic)
+{
+	unsigned long len = ACCESS_ONCE(log_end);
+	struct dump_device *dump;
+	const char *s1, *s2;
+	unsigned long l1, l2;
+
+	s1 = "";
+	l1 = 0;
+	s2 = log_buf;
+	l2 = len;
+
+	/* Have we rotated around the circular buffer? */
+	if (len > log_buf_len) {
+		unsigned long pos = (len & LOG_BUF_MASK);
+
+		s1 = log_buf + pos;
+		l1 = log_buf_len - pos;
+
+		s2 = log_buf;
+		l2 = pos;
+	}
+
+	list_for_each_entry(dump, &dump_list, list) {
+		if (panic && dump->panic)
+			dump->panic(dump, s1, l1, s2, l2);
+		else if (!panic && dump->oops)
+			dump->oops(dump, s1, l1, s2, l2);
+	}
+}
-- 
1.6.0.4


  parent reply	other threads:[~2009-10-13 13:24 UTC|newest]

Thread overview: 70+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-10-11  6:10 [PATCH] panic.c: export panic_on_oops Artem Bityutskiy
2009-10-12 11:15 ` Ingo Molnar
2009-10-12 11:23   ` Simon Kagstrom
2009-10-12 11:25   ` Artem Bityutskiy
2009-10-12 11:37     ` Ingo Molnar
2009-10-12 12:01       ` Simon Kagstrom
2009-10-12 12:09         ` Ingo Molnar
2009-10-12 12:15           ` David Woodhouse
2009-10-12 12:20             ` Ingo Molnar
2009-10-12 12:33               ` David Woodhouse
2009-10-12 12:36                 ` Ingo Molnar
2009-10-12 12:48                   ` David Woodhouse
2009-10-12 13:06               ` Simon Kagstrom
2009-10-12 13:15                 ` Ingo Molnar
2009-10-12 13:39                   ` Simon Kagstrom
2009-10-12 14:30                     ` Ingo Molnar
2009-10-12 15:01                       ` Simon Kagstrom
2009-10-12 15:23                         ` Ingo Molnar
2009-10-12 15:36                     ` Linus Torvalds
2009-10-12 15:44                       ` Linus Torvalds
2009-10-12 17:29                         ` Artem Bityutskiy
2009-10-12 17:43                           ` Linus Torvalds
2009-10-12 17:46                             ` Linus Torvalds
2009-10-12 18:09                       ` Andrew Morton
2009-10-12 18:23                         ` Ingo Molnar
2009-10-12 18:36                           ` Andrew Morton
2009-10-12 18:45                           ` Linus Torvalds
2009-10-12 19:14                             ` Ingo Molnar
2009-10-12 19:18                             ` Dirk Hohndel
2009-10-13  7:58                             ` Simon Kagstrom
2009-10-13  8:57                               ` Artem Bityutskiy
2009-10-13 13:17                             ` [PATCH/RFC v5 0/5]: mtdoops: fixes and improvements Simon Kagstrom
2009-10-13 13:21                               ` [PATCH/RFC v5 1/5]: mtdoops: avoid erasing already empty areas Simon Kagstrom
2009-10-13 13:22                               ` [PATCH/RFC v5 2/5]: mtdoops: Keep track of used/unused mtdoops pages in an array Simon Kagstrom
2009-10-13 13:22                               ` [PATCH/RFC v5 3/5]: mtdoops: Make page (record) size configurable Simon Kagstrom
2009-10-13 13:22                               ` Simon Kagstrom [this message]
2009-10-13 15:37                                 ` [PATCH/RFC v5 4/5]: core: Add dump device to call on oopses and panics Linus Torvalds
2009-11-26  9:36                                 ` Jörn Engel
2009-11-30  7:27                                   ` Artem Bityutskiy
2009-11-30  7:46                                     ` Jörn Engel
2009-11-30  8:51                                       ` Artem Bityutskiy
2009-11-30  9:35                                         ` Jörn Engel
2009-11-30  9:40                                           ` Artem Bityutskiy
2009-11-30  9:53                                             ` Simon Kagstrom
2009-11-30  9:54                                             ` Jörn Engel
2009-11-30 10:23                                         ` David Woodhouse
2009-11-30 10:27                                           ` David Woodhouse
2009-11-30  9:09                                   ` Artem Bityutskiy
2009-11-30  9:28                                     ` Simon Kagstrom
2009-10-13 13:22                               ` [PATCH/RFC v5 5/5]: mtdoops: refactor as a dump_device Simon Kagstrom
2009-10-14 13:34                             ` [PATCH v6 0/5]: mtdoops: fixes and improvements Simon Kagstrom
2009-10-14 13:40                               ` [PATCH v6 1/5]: mtdoops: avoid erasing already empty areas Simon Kagstrom
2009-10-14 13:41                               ` [PATCH v6 2/5]: mtdoops: Keep track of used/unused mtdoops pages in an array Simon Kagstrom
2009-10-14 13:41                               ` [PATCH v6 3/5]: mtdoops: Make page (record) size configurable Simon Kagstrom
2009-10-14 13:41                               ` [PATCH v6 4/5]: core: Add kernel message dumper to call on oopses and panics Simon Kagstrom
2009-10-14 16:49                                 ` Linus Torvalds
2009-10-14 13:41                               ` [PATCH v6 5/5]: mtdoops: refactor as a kmsg_dumper Simon Kagstrom
2009-10-14 15:12                                 ` Simon Kagstrom
2009-10-15  5:11                                   ` vimal singh
2009-10-12 12:27           ` [PATCH] panic.c: export panic_on_oops Simon Kagstrom
2009-10-12 12:32             ` Ingo Molnar
2009-10-12 13:08               ` Alan Cox
2009-10-12 13:25                 ` Ingo Molnar
2009-10-12 13:32                   ` David Woodhouse
2009-10-12 14:26                     ` Ingo Molnar
2009-10-12 14:36                       ` David Woodhouse
2009-10-12 15:14                         ` Ingo Molnar
2009-10-12 18:32                           ` Carl-Daniel Hailfinger
2009-10-12 19:18                             ` Ingo Molnar
2009-10-12 14:12       ` Arjan van de Ven

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20091013152235.188059d2@marrow.netinsight.se \
    --to=simon.kagstrom@netinsight.net \
    --cc=aaro.koskinen@nokia.com \
    --cc=akpm@linux-foundation.org \
    --cc=alan@lxorguk.ukuu.org.uk \
    --cc=dedekind1@gmail.com \
    --cc=dwmw2@infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mtd@lists.infradead.org \
    --cc=mingo@elte.hu \
    --cc=torvalds@linux-foundation.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®