Add vmcoreinfo #2
Subsystems (4)
PATCH 1/2 Add vmcoreinfo #2
[1/2] [linux-2.6.22] Add vmcoreinfo
The patch is for linux-2.6.22.
The patch adds the vmcoreinfo data. Its address and size are output to /sys/kernel/vmcoreinfo.
Changelog:
- Add the size of nodemask_t and the value of NR_FREE_PAGES to the vmcoreinfo data.
Thanks
Ken'ichi Ohmichi
---
Signed-off-by Dan Aloni <[email protected]>
Signed-off-by Ken'ichi Ohmichi <[email protected]>
Signed-off-by Bernhard Walle <[email protected]>
Signed-off-by Daisuke Nishimura <[email protected]>
Signed-off-by Andrew Morton <[email protected]>
---
arch/i386/kernel/machine_kexec.c +13 -0
@@ -10,6 +10,7 @@#include <linux/kexec.h> #include <linux/delay.h> #include <linux/init.h> +#include <linux/numa.h> #include <asm/pgtable.h> #include <asm/pgalloc.h> #include <asm/tlbflush.h>
@@ -169,3 +170,15 @@ static int __init parse_crashkernel(charreturn 0 ; }early_param ("crashkernel" , parse_crashkernel); + +void arch_crash_save_vmcoreinfo (void ) +{ +#ifdef CONFIG_ARCH_DISCONTIGMEM_ENABLE +SYMBOL (node_data); +LENGTH (node_data,MAX_NUMNODES ); +#endif +#ifdef CONFIG_X86_PAE +CONFIG (X86_PAE ); +#endif +} +
arch/ia64/kernel/machine_kexec.c +28 -0
@@ -15,10 +15,13 @@#include <linux/cpu.h> #include <linux/irq.h> #include <linux/efi.h> +#include <linux/numa.h> +#include <linux/mmzone.h> #include <asm/mmu_context.h> #include <asm/setup.h> #include <asm/delay.h> #include <asm/meminit.h> +#include <asm/processor.h> typedef NORET_TYPE void (*relocate_new_kernel_t)( unsigned long indirection_page,
@@ -125,3 +128,28 @@ void machine_kexec(struct kimage *image)unw_init_running (ia64_machine_kexec, image);for (;;); } + +void arch_crash_save_vmcoreinfo (void ) +{ +#ifdef CONFIG_ARCH_DISCONTIGMEM_ENABLE +SYMBOL (pgdat_list); +LENGTH (pgdat_list,MAX_NUMNODES ); + +SYMBOL (node_memblk); +LENGTH (node_memblk,NR_NODE_MEMBLKS ); +SIZE (node_memblk_s); +OFFSET (node_memblk_s, start_paddr); +OFFSET (node_memblk_s, size); +#endif +#ifdef CONFIG_PGTABLE_3 +CONFIG (PGTABLE_3 ); +#elif CONFIG_PGTABLE_4 +CONFIG (PGTABLE_4 ); +#endif +} + +unsigned long paddr_vmcoreinfo_note (void ) +{ +return ia64_tpa ((unsigned long )(char *)&vmcoreinfo_note); +} +
arch/ia64/mm/discontig.c +1 -1
@@ -47,7 +47,7 @@ struct early_node_data {static struct early_node_data mem_data[MAX_NUMNODES ]__initdata ;static nodemask_t memory_less_mask__initdata ; -static pg_data_t *pgdat_list[MAX_NUMNODES ]; +pg_data_t *pgdat_list[MAX_NUMNODES ];/* * To prevent cache aliasing effects, align per-node structures so that they
arch/x86_64/kernel/machine_kexec.c +9 -0
@@ -10,6 +10,7 @@#include <linux/kexec.h> #include <linux/string.h> #include <linux/reboot.h> +#include <linux/numa.h> #include <asm/pgtable.h> #include <asm/tlbflush.h> #include <asm/mmu_context.h>
@@ -257,3 +258,11 @@ static int __init setup_crashkernel(char }early_param ("crashkernel" , setup_crashkernel); +void arch_crash_save_vmcoreinfo (void ) +{ +#ifdef CONFIG_ARCH_DISCONTIGMEM_ENABLE +SYMBOL (node_data); +LENGTH (node_data,MAX_NUMNODES ); +#endif +} +
include/asm-ia64/numa.h +1 -0
@@ -24,6 +24,7 @@ extern u16 cpu_to_node_map[NR_CPUS] __cacheline_aligned; extern cpumask_t node_to_cpu_mask[MAX_NUMNODES] __cacheline_aligned; +extern pg_data_t *pgdat_list[MAX_NUMNODES ];/* Stuff below this line could be architecture independent */
include/linux/kexec.h +33 -0
@@ -121,6 +121,30 @@ extern struct page *kimage_alloc_controlextern void crash_kexec (struct pt_regs *);int kexec_should_crash (struct task_struct *);void crash_save_cpu (struct pt_regs *regs,int cpu); +void crash_save_vmcoreinfo (void ); +void arch_crash_save_vmcoreinfo (void ); +void vmcoreinfo_append_str (const char *fmt, ...) + __attribute__ ((format (printf,1 ,2 ))); +unsigned long paddr_vmcoreinfo_note (void ); + +#define SYMBOL (name) \ + vmcoreinfo_append_str("SYMBOL(%s)=%lx\n", #name, (unsigned long)&name) +#define SIZE (name) \ + vmcoreinfo_append_str("SIZE(%s)=%lu\n", #name, \ + (unsigned long)sizeof(struct name)) +#define TYPEDEF_SIZE (name) \ + vmcoreinfo_append_str("SIZE(%s)=%lu\n", #name, \ + (unsigned long)sizeof(name)) +#define OFFSET (name, field) \ + vmcoreinfo_append_str("OFFSET(%s.%s)=%lu\n", #name, #field, \ + (unsigned long)&(((struct name *)0)->field)) +#define LENGTH (name, value) \ + vmcoreinfo_append_str("LENGTH(%s)=%lu\n", #name, (unsigned long)value) +#define NUMBER (name) \ + vmcoreinfo_append_str("NUMBER(%s)=%ld\n", #name, (long)name) +#define CONFIG (name) \ + vmcoreinfo_append_str("CONFIG_%s=y\n", #name) +extern struct kimage *kexec_image;extern struct kimage *kexec_crash_image;
@@ -148,11 +172,20 @@ extern struct kimage *kexec_crash_image;#define KEXEC_FLAGS (KEXEC_ON_CRASH)/* List of defined/legal kexec flags */ +#define VMCOREINFO_BYTES (4096) +#define VMCOREINFO_NOTE_NAME "VMCOREINFO" +#define VMCOREINFO_NOTE_NAME_BYTES ALIGN(sizeof(VMCOREINFO_NOTE_NAME), 4) +#define VMCOREINFO_NOTE_SIZE (KEXEC_NOTE_HEAD_BYTES*2 + VMCOREINFO_BYTES \ + + VMCOREINFO_NOTE_NAME_BYTES) +/* Location of a reserved region to hold the crash kernel. */ extern struct resource crashk_res;typedef u32 note_buf_t [KEXEC_NOTE_BYTES /4 ];extern note_buf_t *crash_notes; +extern u32 vmcoreinfo_note[VMCOREINFO_NOTE_SIZE /4 ]; +extern size_t vmcoreinfo_size; +extern size_t vmcoreinfo_max_size;#else /* !CONFIG_KEXEC */
kernel/kexec.c +112 -0
137 lines not on this page · raw message
kernel/ksysfs.c +10 -0
@@ -60,6 +60,15 @@ static ssize_t kexec_crash_loaded_show(s return sprintf(page, "%d\n", !!kexec_crash_image); }KERNEL_ATTR_RO (kexec_crash_loaded); + +static ssize_t vmcoreinfo_show (struct kset *kset,char *page) +{ +return sprintf (page,"%lx %x\n" , +paddr_vmcoreinfo_note (), + (unsigned int )vmcoreinfo_max_size); +} +KERNEL_ATTR_RO (vmcoreinfo); +#endif /* CONFIG_KEXEC */ decl_subsys (kernel,NULL ,NULL );
@@ -73,6 +82,7 @@ static struct attribute * kernel_attrs[]#ifdef CONFIG_KEXEC &kexec_loaded_attr.attr, &kexec_crash_loaded_attr.attr, + &vmcoreinfo_attr.attr, #endifNULL };
_
_______________________________________________
kexec mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/kexec