aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorKen'ichi Ohmichi <oomichi@mxs.nes.nec.co.jp>2007-10-17 02:27:27 -0400
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-10-17 11:42:54 -0400
commitfd59d231f81cb02870b9cf15f456a897f3669b4e (patch)
tree5713c13bd678774f1ba3c42bfff5008c1812deae /arch
parent0e647c04f665e9b3451a1ebe8252b38ffe0207c8 (diff)
Add vmcoreinfo
This patch set frees the restriction that makedumpfile users should install a vmlinux file (including the debugging information) into each system. makedumpfile command is the dump filtering feature for kdump. It creates a small dumpfile by filtering unnecessary pages for the analysis. To distinguish unnecessary pages, it needs a vmlinux file including the debugging information. These days, the debugging package becomes a huge file, and it is hard to install it into each system. To solve the problem, kdump developers discussed it at lkml and kexec-ml. As the result, we reached the conclusion that necessary information for dump filtering (called "vmcoreinfo") should be embedded into the first kernel file and it should be accessed through /proc/vmcore during the second kernel. (http://www.uwsg.iu.edu/hypermail/linux/kernel/0707.0/1806.html) Dan Aloni created the patch set for the above implementation. (http://www.uwsg.iu.edu/hypermail/linux/kernel/0707.1/1053.html) And I updated it for multi architectures and memory models. (http://lists.infradead.org/pipermail/kexec/2007-August/000479.html) Signed-off-by: Dan Aloni <da-x@monatomic.org> Signed-off-by: Ken'ichi Ohmichi <oomichi@mxs.nes.nec.co.jp> Signed-off-by: Bernhard Walle <bwalle@suse.de> Signed-off-by: Daisuke Nishimura <nishimura@mxp.nes.nec.co.jp> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'arch')
-rw-r--r--arch/ia64/kernel/machine_kexec.c30
-rw-r--r--arch/ia64/mm/discontig.c2
-rw-r--r--arch/x86/kernel/machine_kexec_32.c13
-rw-r--r--arch/x86/kernel/machine_kexec_64.c9
4 files changed, 53 insertions, 1 deletions
diff --git a/arch/ia64/kernel/machine_kexec.c b/arch/ia64/kernel/machine_kexec.c
index 58e943a5d95c..40f9c3e19220 100644
--- a/arch/ia64/kernel/machine_kexec.c
+++ b/arch/ia64/kernel/machine_kexec.c
@@ -15,6 +15,8 @@
15#include <linux/cpu.h> 15#include <linux/cpu.h>
16#include <linux/irq.h> 16#include <linux/irq.h>
17#include <linux/efi.h> 17#include <linux/efi.h>
18#include <linux/numa.h>
19#include <linux/mmzone.h>
18#include <asm/mmu_context.h> 20#include <asm/mmu_context.h>
19#include <asm/setup.h> 21#include <asm/setup.h>
20#include <asm/delay.h> 22#include <asm/delay.h>
@@ -121,3 +123,31 @@ void machine_kexec(struct kimage *image)
121 unw_init_running(ia64_machine_kexec, image); 123 unw_init_running(ia64_machine_kexec, image);
122 for(;;); 124 for(;;);
123} 125}
126
127void arch_crash_save_vmcoreinfo(void)
128{
129#ifdef CONFIG_ARCH_DISCONTIGMEM_ENABLE
130 SYMBOL(pgdat_list);
131 LENGTH(pgdat_list, MAX_NUMNODES);
132
133 SYMBOL(node_memblk);
134 LENGTH(node_memblk, NR_NODE_MEMBLKS);
135 SIZE(node_memblk_s);
136 OFFSET(node_memblk_s, start_paddr);
137 OFFSET(node_memblk_s, size);
138#endif
139#ifdef CONFIG_PGTABLE_3
140 CONFIG(PGTABLE_3);
141#elif CONFIG_PGTABLE_4
142 CONFIG(PGTABLE_4);
143#endif
144}
145
146unsigned long paddr_vmcoreinfo_note(void)
147{
148 unsigned long vaddr, paddr;
149 vaddr = (unsigned long)(char *)&vmcoreinfo_note;
150 asm volatile ("tpa %0 = %1" : "=r"(paddr) : "r"(vaddr) : "memory");
151 return paddr;
152}
153
diff --git a/arch/ia64/mm/discontig.c b/arch/ia64/mm/discontig.c
index 5628067a74d2..0b567398f38e 100644
--- a/arch/ia64/mm/discontig.c
+++ b/arch/ia64/mm/discontig.c
@@ -48,7 +48,7 @@ struct early_node_data {
48static struct early_node_data mem_data[MAX_NUMNODES] __initdata; 48static struct early_node_data mem_data[MAX_NUMNODES] __initdata;
49static nodemask_t memory_less_mask __initdata; 49static nodemask_t memory_less_mask __initdata;
50 50
51static pg_data_t *pgdat_list[MAX_NUMNODES]; 51pg_data_t *pgdat_list[MAX_NUMNODES];
52 52
53/* 53/*
54 * To prevent cache aliasing effects, align per-node structures so that they 54 * To prevent cache aliasing effects, align per-node structures so that they
diff --git a/arch/x86/kernel/machine_kexec_32.c b/arch/x86/kernel/machine_kexec_32.c
index deda9a221cf2..ae20fa5afa62 100644
--- a/arch/x86/kernel/machine_kexec_32.c
+++ b/arch/x86/kernel/machine_kexec_32.c
@@ -10,6 +10,7 @@
10#include <linux/kexec.h> 10#include <linux/kexec.h>
11#include <linux/delay.h> 11#include <linux/delay.h>
12#include <linux/init.h> 12#include <linux/init.h>
13#include <linux/numa.h>
13#include <asm/pgtable.h> 14#include <asm/pgtable.h>
14#include <asm/pgalloc.h> 15#include <asm/pgalloc.h>
15#include <asm/tlbflush.h> 16#include <asm/tlbflush.h>
@@ -169,3 +170,15 @@ static int __init parse_crashkernel(char *arg)
169 return 0; 170 return 0;
170} 171}
171early_param("crashkernel", parse_crashkernel); 172early_param("crashkernel", parse_crashkernel);
173
174void arch_crash_save_vmcoreinfo(void)
175{
176#ifdef CONFIG_ARCH_DISCONTIGMEM_ENABLE
177 SYMBOL(node_data);
178 LENGTH(node_data, MAX_NUMNODES);
179#endif
180#ifdef CONFIG_X86_PAE
181 CONFIG(X86_PAE);
182#endif
183}
184
diff --git a/arch/x86/kernel/machine_kexec_64.c b/arch/x86/kernel/machine_kexec_64.c
index cd1899a2f0c5..e333ea110a58 100644
--- a/arch/x86/kernel/machine_kexec_64.c
+++ b/arch/x86/kernel/machine_kexec_64.c
@@ -10,6 +10,7 @@
10#include <linux/kexec.h> 10#include <linux/kexec.h>
11#include <linux/string.h> 11#include <linux/string.h>
12#include <linux/reboot.h> 12#include <linux/reboot.h>
13#include <linux/numa.h>
13#include <asm/pgtable.h> 14#include <asm/pgtable.h>
14#include <asm/tlbflush.h> 15#include <asm/tlbflush.h>
15#include <asm/mmu_context.h> 16#include <asm/mmu_context.h>
@@ -257,3 +258,11 @@ static int __init setup_crashkernel(char *arg)
257} 258}
258early_param("crashkernel", setup_crashkernel); 259early_param("crashkernel", setup_crashkernel);
259 260
261void arch_crash_save_vmcoreinfo(void)
262{
263#ifdef CONFIG_ARCH_DISCONTIGMEM_ENABLE
264 SYMBOL(node_data);
265 LENGTH(node_data, MAX_NUMNODES);
266#endif
267}
268