* [PATCH 1/5] add DEFINE_LOGLEVEL_SETUP v4
2008-09-16 23:13 [PATCH 0/5] loglevel=pci:7,acpi:6 support v3 Yinghai Lu
@ 2008-09-16 23:13 ` Yinghai Lu
2008-09-16 23:13 ` [PATCH 2/5] pci: add pci_printk v4 Yinghai Lu
` (3 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: Yinghai Lu @ 2008-09-16 23:13 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
v3: add back nameStr, so could find out iommu: and iommu_gart: and etc
v4: use printk intead of pci_printk
usage:
in .h to have
#define KERN_PCI "<pci>"
in .c to have
DEFINE_LOGLEVEL_SETUP(pci, KERN_PCI, "pci:");
then could use
printk(KERN_DEBUG KERN_PCI fmt, ...);
and command line
loglevel=pci:8
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 | 17 ++++++++
include/linux/kernel.h | 9 ++++
init/main.c | 74 +++++++++++++++++++++++++++++++++++++-
kernel/printk.c | 27 +++++++++++--
7 files changed, 133 insertions(+), 5 deletions(-)
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,23 @@ struct obs_kernel_param {
/* Relies on boot_command_line being set */
void __init parse_early_param(void);
+struct loglevel_setup {
+ char *name;
+ char *tag;
+};
+
+extern struct loglevel_setup *__loglevel_setup_start[], *__loglevel_setup_end[];
+
+#define DEFINE_LOGLEVEL_SETUP(nameX, tagX, nameStr) \
+ static struct loglevel_setup __loglevel_setup_##nameX __initdata = \
+ { \
+ .tag = tagX, \
+ .name = nameStr, \
+ }; \
+ 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])
+struct tag_console_loglevel {
+ char tag[32];
+ char name[32];
+ int level;
+};
+
+extern struct tag_console_loglevel tag_level[];
+extern int tag_level_nr;
+
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,81 @@ static int __init quiet_kernel(char *str
early_param("debug", debug_kernel);
early_param("quiet", quiet_kernel);
+struct tag_console_loglevel tag_level[32];
+int tag_level_nr;
+
+static int __init save_tag_name_level(const char *tag, const char *name, int level)
+{
+ int len;
+
+ if (tag_level_nr > 32)
+ return -1;
+
+ len = sizeof(tag_level[tag_level_nr].tag);
+ strncpy(tag_level[tag_level_nr].tag, tag, len - 1);
+ len = sizeof(tag_level[tag_level_nr].name);
+ strncpy(tag_level[tag_level_nr].name, name, len - 1);
+ tag_level[tag_level_nr].level = level;
+
+ tag_level_nr++;
+
+ return 0;
+}
+
+static void __init tag_name_level_setup(void)
+{
+ struct loglevel_setup **la;
+ int level = default_console_loglevel;
+
+ if (level != console_loglevel)
+ level = console_loglevel;
+
+ for (la = __loglevel_setup_start ; la < __loglevel_setup_end; la++) {
+ struct loglevel_setup *l = *la;
+
+
+ save_tag_name_level(l->tag, l->name, level);
+ }
+
+}
+
+static char __init *real_loglevel_setup(char *str)
+{
+ int i;
+
+ for (i = 0; i < tag_level_nr; i++) {
+ struct tag_console_loglevel *tl;
+ int len;
+
+ tl = &tag_level[i];
+ len = strlen(tl->name);
+ if (!strncmp(str, tl->name, len)) {
+ int level;
+
+ str += len;
+ get_option(&str, &level);
+ tl->level = level;
+ str = NULL;
+ break;
+ }
+ }
+
+ return str;
+}
+
static int __init loglevel(char *str)
{
- get_option(&str, &console_loglevel);
+ tag_name_level_setup();
+
+ 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;
}
Index: linux-2.6/kernel/printk.c
===================================================================
--- linux-2.6.orig/kernel/printk.c
+++ linux-2.6/kernel/printk.c
@@ -457,9 +457,9 @@ early_param("ignore_loglevel", ignore_lo
* Write out chars from start to end - 1 inclusive
*/
static void _call_console_drivers(unsigned start,
- unsigned end, int msg_log_level)
+ unsigned end, int msg_log_level, int level)
{
- if ((msg_log_level < console_loglevel || ignore_loglevel) &&
+ if ((msg_log_level < level || ignore_loglevel) &&
console_drivers && start != end) {
if ((start & LOG_BUF_MASK) > (end & LOG_BUF_MASK)) {
/* wrapped write */
@@ -481,21 +481,40 @@ static void call_console_drivers(unsigne
{
unsigned cur_index, start_print;
static int msg_level = -1;
+ int level = console_loglevel;
BUG_ON(((int)(start - end)) > 0);
cur_index = start;
start_print = start;
while (cur_index != end) {
+ int i;
+
if (msg_level < 0 && ((end - cur_index) > 2) &&
LOG_BUF(cur_index + 0) == '<' &&
LOG_BUF(cur_index + 1) >= '0' &&
LOG_BUF(cur_index + 1) <= '7' &&
LOG_BUF(cur_index + 2) == '>') {
msg_level = LOG_BUF(cur_index + 1) - '0';
+ level = console_loglevel;
cur_index += 3;
start_print = cur_index;
}
+ /* handle tag here */
+ for (i = 0; i < tag_level_nr; i++) {
+ struct tag_console_loglevel *tl = NULL;
+ int len;
+
+ tl = &tag_level[i];
+ len = strlen(tl->tag);
+ if ((end - cur_index) > (len - 1) &&
+ !strncmp(&LOG_BUF(cur_index), tl->tag, len)) {
+ level = tl->level;
+ cur_index += len;
+ start_print = cur_index;
+ break;
+ }
+ }
while (cur_index != end) {
char c = LOG_BUF(cur_index);
@@ -510,14 +529,14 @@ static void call_console_drivers(unsigne
*/
msg_level = default_message_loglevel;
}
- _call_console_drivers(start_print, cur_index, msg_level);
+ _call_console_drivers(start_print, cur_index, msg_level, level);
msg_level = -1;
start_print = cur_index;
break;
}
}
}
- _call_console_drivers(start_print, end, msg_level);
+ _call_console_drivers(start_print, end, msg_level, level);
}
static void emit_log_char(char c)
^ permalink raw reply [flat|nested] 6+ messages in thread* [PATCH 2/5] pci: add pci_printk v4
2008-09-16 23:13 [PATCH 0/5] loglevel=pci:7,acpi:6 support v3 Yinghai Lu
2008-09-16 23:13 ` [PATCH 1/5] add DEFINE_LOGLEVEL_SETUP v4 Yinghai Lu
@ 2008-09-16 23:13 ` Yinghai Lu
2008-09-16 23:13 ` [PATCH 3/5] pci: using pci_printk v2 Yinghai Lu
` (2 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: Yinghai Lu @ 2008-09-16 23:13 UTC (permalink / raw)
To: Ingo Molnar, Thomas Gleixner, H. Peter Anvin, Andrew Morton
Cc: linux-kernel, Yinghai Lu
use DEFINE_LOGLEVEL_SETUP to set loglevel for pci
v2: two lines only
v3: use <pci, "pci:"> instead
v4: use KERN_PCI
Signed-off-by: Yinghai Lu <yhlu.kernel@gmail.com>
---
drivers/pci/pci.c | 2 ++
include/linux/pci.h | 2 ++
2 files changed, 4 insertions(+)
Index: linux-2.6/drivers/pci/pci.c
===================================================================
--- linux-2.6.orig/drivers/pci/pci.c
+++ linux-2.6/drivers/pci/pci.c
@@ -1953,6 +1953,8 @@ static int __devinit pci_setup(char *str
}
early_param("pci", pci_setup);
+DEFINE_LOGLEVEL_SETUP(pci, KERN_PCI, "pci:");
+
device_initcall_sync(pci_init);
EXPORT_SYMBOL(pci_reenable_device);
Index: linux-2.6/include/linux/pci.h
===================================================================
--- linux-2.6.orig/include/linux/pci.h
+++ linux-2.6/include/linux/pci.h
@@ -55,6 +55,8 @@
/* Include the ID list */
#include <linux/pci_ids.h>
+#define KERN_PCI "<pci>"
+
/* pci_slot represents a physical slot */
struct pci_slot {
struct pci_bus *bus; /* The bus this slot is on */
^ permalink raw reply [flat|nested] 6+ messages in thread* [PATCH 3/5] pci: using pci_printk v2
2008-09-16 23:13 [PATCH 0/5] loglevel=pci:7,acpi:6 support v3 Yinghai Lu
2008-09-16 23:13 ` [PATCH 1/5] add DEFINE_LOGLEVEL_SETUP v4 Yinghai Lu
2008-09-16 23:13 ` [PATCH 2/5] pci: add pci_printk v4 Yinghai Lu
@ 2008-09-16 23:13 ` Yinghai Lu
2008-09-16 23:13 ` [PATCH 4/5] acpi: add acpi_printk v3 Yinghai Lu
2008-09-16 23:13 ` [PATCH 5/5] apci: dump slit v4 Yinghai Lu
4 siblings, 0 replies; 6+ messages in thread
From: Yinghai Lu @ 2008-09-16 23:13 UTC (permalink / raw)
To: Ingo Molnar, Thomas Gleixner, H. Peter Anvin, Andrew Morton
Cc: linux-kernel, Yinghai Lu
v2: use printk(KERN_DEBUG KERN_PCI ...
Signed-off-by: Yinghai Lu <yhlu.kernel@gmail.com>
---
drivers/pci/probe.c | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
Index: linux-2.6/drivers/pci/probe.c
===================================================================
--- linux-2.6.orig/drivers/pci/probe.c
+++ linux-2.6/drivers/pci/probe.c
@@ -304,7 +304,7 @@ static int __pci_read_base(struct pci_de
} else {
res->start = l64;
res->end = l64 + sz64;
- printk(KERN_DEBUG "PCI: %s reg %x 64bit mmio: [%llx, %llx]\n",
+ printk(KERN_DEBUG KERN_PCI "PCI: %s reg %x 64bit mmio: [%llx, %llx]\n",
pci_name(dev), pos, res->start, res->end);
}
} else {
@@ -315,7 +315,7 @@ static int __pci_read_base(struct pci_de
res->start = l;
res->end = l + sz;
- printk(KERN_DEBUG "PCI: %s reg %x %s: [%llx, %llx]\n", pci_name(dev),
+ printk(KERN_DEBUG KERN_PCI "PCI: %s reg %x %s: [%llx, %llx]\n", pci_name(dev),
pos, (res->flags & IORESOURCE_IO) ? "io port":"32bit mmio",
res->start, res->end);
}
@@ -388,7 +388,7 @@ void __devinit pci_read_bridge_bases(str
res->start = base;
if (!res->end)
res->end = limit + 0xfff;
- printk(KERN_DEBUG "PCI: bridge %s io port: [%llx, %llx]\n",
+ printk(KERN_DEBUG KERN_PCI "PCI: bridge %s io port: [%llx, %llx]\n",
pci_name(dev), res->start, res->end);
}
@@ -401,7 +401,7 @@ void __devinit pci_read_bridge_bases(str
res->flags = (mem_base_lo & PCI_MEMORY_RANGE_TYPE_MASK) | IORESOURCE_MEM;
res->start = base;
res->end = limit + 0xfffff;
- printk(KERN_DEBUG "PCI: bridge %s 32bit mmio: [%llx, %llx]\n",
+ printk(KERN_DEBUG KERN_PCI "PCI: bridge %s 32bit mmio: [%llx, %llx]\n",
pci_name(dev), res->start, res->end);
}
@@ -438,7 +438,7 @@ void __devinit pci_read_bridge_bases(str
res->flags = (mem_base_lo & PCI_MEMORY_RANGE_TYPE_MASK) | IORESOURCE_MEM | IORESOURCE_PREFETCH;
res->start = base;
res->end = limit + 0xfffff;
- printk(KERN_DEBUG "PCI: bridge %s %sbit mmio pref: [%llx, %llx]\n",
+ printk(KERN_DEBUG KERN_PCI "PCI: bridge %s %sbit mmio pref: [%llx, %llx]\n",
pci_name(dev), (res->flags & PCI_PREF_RANGE_TYPE_64)?"64":"32",
res->start, res->end);
}
^ permalink raw reply [flat|nested] 6+ messages in thread* [PATCH 4/5] acpi: add acpi_printk v3
2008-09-16 23:13 [PATCH 0/5] loglevel=pci:7,acpi:6 support v3 Yinghai Lu
` (2 preceding siblings ...)
2008-09-16 23:13 ` [PATCH 3/5] pci: using pci_printk v2 Yinghai Lu
@ 2008-09-16 23:13 ` Yinghai Lu
2008-09-16 23:13 ` [PATCH 5/5] apci: dump slit v4 Yinghai Lu
4 siblings, 0 replies; 6+ messages in thread
From: Yinghai Lu @ 2008-09-16 23:13 UTC (permalink / raw)
To: Ingo Molnar, Thomas Gleixner, H. Peter Anvin, Andrew Morton
Cc: linux-kernel, Yinghai Lu
use DEFINE_LOGLEVEL_SETUP to set loglevel for acpi
v2: use <acpi, "acpi:"> instead
v3: use KERN_ACPI
Signed-off-by: Yinghai Lu <yhlu.kernel@gmail.com>
---
drivers/acpi/osl.c | 2 ++
include/linux/acpi.h | 1 +
2 files changed, 3 insertions(+)
Index: linux-2.6/drivers/acpi/osl.c
===================================================================
--- linux-2.6.orig/drivers/acpi/osl.c
+++ linux-2.6/drivers/acpi/osl.c
@@ -75,6 +75,8 @@ EXPORT_SYMBOL(acpi_in_debugger);
extern char line_buf[80];
#endif /*ENABLE_DEBUGGER */
+DEFINE_LOGLEVEL_SETUP(acpi, KERN_ACPI, "acpi:");
+
static unsigned int acpi_irq_irq;
static acpi_osd_handler acpi_irq_handler;
static void *acpi_irq_context;
Index: linux-2.6/include/linux/acpi.h
===================================================================
--- linux-2.6.orig/include/linux/acpi.h
+++ linux-2.6/include/linux/acpi.h
@@ -43,6 +43,7 @@
#include <asm/acpi.h>
#include <linux/dmi.h>
+#define KERN_ACPI "<acpi>"
enum acpi_irq_model_id {
ACPI_IRQ_MODEL_PIC = 0,
^ permalink raw reply [flat|nested] 6+ messages in thread* [PATCH 5/5] apci: dump slit v4
2008-09-16 23:13 [PATCH 0/5] loglevel=pci:7,acpi:6 support v3 Yinghai Lu
` (3 preceding siblings ...)
2008-09-16 23:13 ` [PATCH 4/5] acpi: add acpi_printk v3 Yinghai Lu
@ 2008-09-16 23:13 ` Yinghai Lu
4 siblings, 0 replies; 6+ messages in thread
From: Yinghai Lu @ 2008-09-16 23:13 UTC (permalink / raw)
To: Ingo Molnar, Thomas Gleixner, H. Peter Anvin, Andrew Morton
Cc: linux-kernel, Yinghai Lu
v2: using boot_printk
v3: using acpi_printk
v4: using prink(KERN_DEBUG KERN_ACPI ... )
Signed-off-by: Yinghai Lu <yhlu.kernel@gmail.com>
---
drivers/acpi/numa.c | 8 ++++++++
1 file changed, 8 insertions(+)
Index: linux-2.6/drivers/acpi/numa.c
===================================================================
--- linux-2.6.orig/drivers/acpi/numa.c
+++ linux-2.6/drivers/acpi/numa.c
@@ -150,6 +150,14 @@ static __init int slit_valid(struct acpi
{
int i, j;
int d = slit->locality_count;
+ printk(KERN_DEBUG KERN_ACPI "ACPI: SLIT: nodes = %d\n", d);
+ for (i = 0; i < d; i++) {
+ for (j = 0; j < d; j++) {
+ u8 val = slit->entry[d*i + j];
+ printk(KERN_CONT KERN_ACPI " %d", val);
+ }
+ printk(KERN_CONT KERN_ACPI "\n");
+ }
for (i = 0; i < d; i++) {
for (j = 0; j < d; j++) {
u8 val = slit->entry[d*i + j];
^ permalink raw reply [flat|nested] 6+ messages in thread