From: Yinghai Lu <yhlu.kernel@gmail.com>
To: Ingo Molnar <mingo@elte.hu>, Thomas Gleixner <tglx@linutronix.de>,
"H. Peter Anvin" <hpa@zytor.com>,
Andrew Morton <akpm@linux-foundation.org>
Cc: linux-kernel@vger.kernel.org, Yinghai Lu <yhlu.kernel@gmail.com>
Subject: [PATCH 1/5] add DEFINE_LOGLEVEL_SETUP v3
Date: Tue, 16 Sep 2008 11:01:21 -0700 [thread overview]
Message-ID: <1221588085-30578-2-git-send-email-yhlu.kernel@gmail.com> (raw)
In-Reply-To: <1221588085-30578-1-git-send-email-yhlu.kernel@gmail.com>
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
v3: add back nameStr, so could find out iommu: and iommu_gart: and etc
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
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 | 27 ++++++++++++++++++++++++++-
6 files changed, 82 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, nameStr) \
+ 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 = nameStr, \
+ .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,34 @@ 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)) {
+ l->setup(str + len);
+ 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;
}
next prev parent reply other threads:[~2008-09-16 18:02 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-09-16 18:01 [PATCH 0/5] loglevel=pci:7,acpi:6 support Yinghai Lu
2008-09-16 18:01 ` Yinghai Lu [this message]
2008-09-16 19:02 ` [PATCH 1/5] add DEFINE_LOGLEVEL_SETUP v3 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
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=1221588085-30578-2-git-send-email-yhlu.kernel@gmail.com \
--to=yhlu.kernel@gmail.com \
--cc=akpm@linux-foundation.org \
--cc=hpa@zytor.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=tglx@linutronix.de \
/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;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).