public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/5] loglevel=pci:7,acpi:6 support
@ 2008-09-16 18:01 Yinghai Lu
  2008-09-16 18:01 ` [PATCH 1/5] add DEFINE_LOGLEVEL_SETUP v3 Yinghai Lu
                   ` (4 more replies)
  0 siblings, 5 replies; 15+ messages in thread
From: Yinghai Lu @ 2008-09-16 18:01 UTC (permalink / raw)
  To: Ingo Molnar, Thomas Gleixner, H. Peter Anvin, Andrew Morton
  Cc: linux-kernel, Yinghai Lu

usage:
	in .c to have
		DEFINE_LOGLEVEL_SETUP(pci, "pci:");
	in .h to have
		DECLARE_LOGLEVE(pci);
	then could use
		pci_printk(KERN_LOG_DEBUG, fmt, ...);
	and command line
		loglevel=pci:7

you can add different printk to different files of one subsys if you like
not just one susbsys one tag, and don't need to update kernel.h to add more tags

YH


^ permalink raw reply	[flat|nested] 15+ messages in thread
* [PATCH 1/5] add DEFINE_LOGLEVEL_SETUP v2
@ 2008-09-16  8:52 Yinghai Lu
  2008-09-16  8:52 ` [PATCH 3/5] pci: using pci_printk Yinghai Lu
  0 siblings, 1 reply; 15+ messages in thread
From: Yinghai Lu @ 2008-09-16  8:52 UTC (permalink / raw)
  To: Ingo Molnar, Thomas Gleixner, H. Peter Anvin, Andrew Morton
  Cc: linux-kernel, Yinghai Lu

so could make subsys easy to add loglevel and xxx_printk
v2: make it more genric, so subsys user only need to two line macro

Signed-off-by: Yinghai Lu <yhlu.kernel@gmail.com>
---
 arch/x86/kernel/vmlinux_32.lds.S  |    1 +
 arch/x86/kernel/vmlinux_64.lds.S  |    2 ++
 include/asm-generic/vmlinux.lds.h |    8 ++++++++
 include/linux/init.h              |   36 ++++++++++++++++++++++++++++++++++++
 include/linux/kernel.h            |    9 +++++++++
 init/main.c                       |   28 +++++++++++++++++++++++++++-
 6 files changed, 83 insertions(+), 1 deletion(-)

Index: linux-2.6/arch/x86/kernel/vmlinux_32.lds.S
===================================================================
--- linux-2.6.orig/arch/x86/kernel/vmlinux_32.lds.S
+++ linux-2.6/arch/x86/kernel/vmlinux_32.lds.S
@@ -145,6 +145,7 @@ SECTIONS
 	*(.x86_cpu_dev.init)
 	__x86_cpu_dev_end = .;
   }
+  LOGLEVEL_SETUP_INIT(8)
   DYN_ARRAY_INIT(8)
   SECURITY_INIT
   . = ALIGN(4);
Index: linux-2.6/arch/x86/kernel/vmlinux_64.lds.S
===================================================================
--- linux-2.6.orig/arch/x86/kernel/vmlinux_64.lds.S
+++ linux-2.6/arch/x86/kernel/vmlinux_64.lds.S
@@ -174,6 +174,8 @@ SECTIONS
   }
   __x86_cpu_dev_end = .;
 
+  LOGLEVEL_SETUP_INIT(8)
+
   DYN_ARRAY_INIT(8)
 
   SECURITY_INIT
Index: linux-2.6/include/asm-generic/vmlinux.lds.h
===================================================================
--- linux-2.6.orig/include/asm-generic/vmlinux.lds.h
+++ linux-2.6/include/asm-generic/vmlinux.lds.h
@@ -222,6 +222,14 @@
  * All archs are supposed to use RO_DATA() */
 #define RODATA RO_DATA(4096)
 
+#define LOGLEVEL_SETUP_INIT(align)					\
+	. = ALIGN((align));						\
+	.loglevel_setup.init : AT(ADDR(.loglevel_setup.init) - LOAD_OFFSET) {	\
+		VMLINUX_SYMBOL(__loglevel_setup_start) = .;		\
+		*(.loglevel_setup.init)					\
+		VMLINUX_SYMBOL(__loglevel_setup_end) = .;		\
+	}
+
 #define DYN_ARRAY_INIT(align)							\
 	. = ALIGN((align));						\
 	.dyn_array.init : AT(ADDR(.dyn_array.init) - LOAD_OFFSET) {	\
Index: linux-2.6/include/linux/init.h
===================================================================
--- linux-2.6.orig/include/linux/init.h
+++ linux-2.6/include/linux/init.h
@@ -251,6 +251,42 @@ struct obs_kernel_param {
 /* Relies on boot_command_line being set */
 void __init parse_early_param(void);
 
+#define DECLARE_LOGLEVEL(nameX)					\
+	extern int loglevel_##nameX;				\
+	extern int nameX##_printk(int v, const char *fmt, ...)
+
+struct loglevel_setup {
+	char *name;
+	void (*setup)(char *);
+};
+
+extern struct loglevel_setup *__loglevel_setup_start[], *__loglevel_setup_end[];
+
+#define DEFINE_LOGLEVEL_SETUP(nameX)				\
+	int loglevel_##nameX;					\
+	int nameX##_printk(int v, const char *fmt, ...)		\
+	{							\
+		va_list args;					\
+		int r;						\
+		if (v > loglevel_##nameX)			\
+			return 0;				\
+		va_start(args, fmt);				\
+		r = vprintk(fmt, args);				\
+		va_end(args);					\
+		return r;					\
+	}							\
+	static void __init setup_loglevel_##nameX(char *str)	\
+	{							\
+		get_option(&str, &loglevel_##nameX);		\
+	}							\
+	static struct loglevel_setup __loglevel_setup_##nameX __initdata = \
+	{	.name = #nameX,					\
+		.setup = setup_loglevel_##nameX,		\
+	};							\
+	static struct loglevel_setup *__loglevel_setup_ptr_##nameX __used \
+	__attribute__((__section__(".loglevel_setup.init"))) =	\
+		&__loglevel_setup_##nameX
+
 struct dyn_array {
 	void **name;
 	unsigned long size;
Index: linux-2.6/include/linux/kernel.h
===================================================================
--- linux-2.6.orig/include/linux/kernel.h
+++ linux-2.6/include/linux/kernel.h
@@ -104,6 +104,15 @@ extern int console_printk[];
 #define minimum_console_loglevel (console_printk[2])
 #define default_console_loglevel (console_printk[3])
 
+#define	KERN_LOG_EMERG	0	/* system is unusable			*/
+#define	KERN_LOG_ALERT	1	/* action must be taken immediately	*/
+#define	KERN_LOG_CRIT	2	/* critical conditions			*/
+#define	KERN_LOG_ERR	3	/* error conditions			*/
+#define	KERN_LOG_WARNING	4	/* warning conditions			*/
+#define	KERN_LOG_NOTICE	5	/* normal but significant condition	*/
+#define	KERN_LOG_INFO	6	/* informational			*/
+#define	KERN_LOG_DEBUG	7	/* debug-level messages			*/
+
 struct completion;
 struct pt_regs;
 struct user;
Index: linux-2.6/init/main.c
===================================================================
--- linux-2.6.orig/init/main.c
+++ linux-2.6/init/main.c
@@ -248,9 +248,35 @@ static int __init quiet_kernel(char *str
 early_param("debug", debug_kernel);
 early_param("quiet", quiet_kernel);
 
+static char __init *real_loglevel_setup(char *str)
+{
+	struct loglevel_setup **la;
+
+	for (la = __loglevel_setup_start ; la < __loglevel_setup_end; la++) {
+		struct loglevel_setup *l = *la;
+		int len = strlen(l->name);
+
+		if (!strncmp(str, l->name, len)) {
+			/* skip one : */
+			l->setup(str + len + 1);
+			str = NULL;
+			break;
+		}
+	}
+
+	return str;
+}
 static int __init loglevel(char *str)
 {
-	get_option(&str, &console_loglevel);
+	while (str) {
+		char *k = strchr(str, ',');
+		if (k)
+			*k++ = 0;
+		if (*str && (str = real_loglevel_setup(str)) && *str) {
+			get_option(&str, &console_loglevel);
+		}
+		str = k;
+	}
 	return 0;
 }
 

^ permalink raw reply	[flat|nested] 15+ messages in thread

end of thread, other threads:[~2008-09-17 21:43 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-09-16 18:01 [PATCH 0/5] loglevel=pci:7,acpi:6 support Yinghai Lu
2008-09-16 18:01 ` [PATCH 1/5] add DEFINE_LOGLEVEL_SETUP v3 Yinghai Lu
2008-09-16 19:02   ` Marcin Slusarz
2008-09-16 21:04     ` Yinghai Lu
2008-09-16 21:18       ` H. Peter Anvin
2008-09-16 21:28         ` Yinghai Lu
2008-09-16 21:55           ` H. Peter Anvin
2008-09-16 18:01 ` [PATCH 2/5] pci: add pci_printk v3 Yinghai Lu
2008-09-16 18:01 ` [PATCH 3/5] pci: using pci_printk Yinghai Lu
2008-09-16 18:01 ` [PATCH 4/5] acpi: add acpi_printk v2 Yinghai Lu
2008-09-16 18:01 ` [PATCH 5/5] apci: dump slit v3 Yinghai Lu
  -- strict thread matches above, loose matches on Subject: below --
2008-09-16  8:52 [PATCH 1/5] add DEFINE_LOGLEVEL_SETUP v2 Yinghai Lu
2008-09-16  8:52 ` [PATCH 3/5] pci: using pci_printk Yinghai Lu
2008-09-16 10:20   ` Alexey Dobriyan
2008-09-16 17:18     ` Robert Richter
2008-09-17 21:43     ` Alex Chiang

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox