kdump broken on Altix 350
Jay Lan
jlan at sgi.com
Mon Sep 29 20:30:59 EDT 2008
Luck, Tony wrote:
> Does this make kexec/kdump happier? Bare minimum testing so far
> (builds and boots on tiger ... didn't try kexec yet).
Hi Tony,
Yep, the 2.6.27-rc7 kdump kernel built with this patch worked fine!
Actually you probably can predict the results by doing 'readelf -l
vmlinux'. If the PT_LOAD headers do not have a gap betweens headers,
it is good. In other words, if the (PhysAddr+MemSiz) rounded up to
Align value of one header is the same as the PhysAddr of the next
header, kexec should produce a good boot memmap for the kdump kernel.
Thanks for the patch!
jay
>
>
>
> [IA64] Put the space for cpu0 per-cpu area into .data section
>
> Initial fix for making sure that we can access percpu variables
> in all C code commit: 10617bbe84628eb18ab5f723d3ba35005adde143
> inadvertantly allocated the memory in the "percpu" section of
> the vmlinux ELF executable. This confused kexec.
>
> Signed-off-by: Tony Luck <tony.luck at intel.com>
>
> diff --git a/arch/ia64/include/asm/sections.h b/arch/ia64/include/asm/sections.h
> index f667998..1a873b3 100644
> --- a/arch/ia64/include/asm/sections.h
> +++ b/arch/ia64/include/asm/sections.h
> @@ -11,6 +11,9 @@
> #include <asm-generic/sections.h>
>
> extern char __per_cpu_start[], __per_cpu_end[], __phys_per_cpu_start[];
> +#ifdef CONFIG_SMP
> +extern char __cpu0_per_cpu[];
> +#endif
> extern char __start___vtop_patchlist[], __end___vtop_patchlist[];
> extern char __start___rse_patchlist[], __end___rse_patchlist[];
> extern char __start___mckinley_e9_bundles[], __end___mckinley_e9_bundles[];
> diff --git a/arch/ia64/kernel/head.S b/arch/ia64/kernel/head.S
> index 8bdea8e..66e491d 100644
> --- a/arch/ia64/kernel/head.S
> +++ b/arch/ia64/kernel/head.S
> @@ -367,16 +367,17 @@ start_ap:
> ;;
> #else
> (isAP) br.few 2f
> - mov r20=r19
> - sub r19=r19,r18
> + movl r20=__cpu0_per_cpu
> ;;
> shr.u r18=r18,3
> 1:
> - ld8 r21=[r20],8;;
> - st8[r19]=r21,8
> + ld8 r21=[r19],8;;
> + st8[r20]=r21,8
> adds r18=-1,r18;;
> cmp4.lt p7,p6=0,r18
> (p7) br.cond.dptk.few 1b
> + mov r19=r20
> + ;;
> 2:
> #endif
> tpa r19=r19
> diff --git a/arch/ia64/kernel/vmlinux.lds.S b/arch/ia64/kernel/vmlinux.lds.S
> index de71da8..10a7d47 100644
> --- a/arch/ia64/kernel/vmlinux.lds.S
> +++ b/arch/ia64/kernel/vmlinux.lds.S
> @@ -215,9 +215,6 @@ SECTIONS
> /* Per-cpu data: */
> percpu : { } :percpu
> . = ALIGN(PERCPU_PAGE_SIZE);
> -#ifdef CONFIG_SMP
> - . = . + PERCPU_PAGE_SIZE; /* cpu0 per-cpu space */
> -#endif
> __phys_per_cpu_start = .;
> .data.percpu PERCPU_ADDR : AT(__phys_per_cpu_start - LOAD_OFFSET)
> {
> @@ -233,6 +230,11 @@ SECTIONS
> data : { } :data
> .data : AT(ADDR(.data) - LOAD_OFFSET)
> {
> +#ifdef CONFIG_SMP
> + . = ALIGN(PERCPU_PAGE_SIZE);
> + __cpu0_per_cpu = .;
> + . = . + PERCPU_PAGE_SIZE; /* cpu0 per-cpu space */
> +#endif
> DATA_DATA
> *(.data1)
> *(.gnu.linkonce.d*)
> diff --git a/arch/ia64/mm/contig.c b/arch/ia64/mm/contig.c
> index e566ff4..0ee085e 100644
> --- a/arch/ia64/mm/contig.c
> +++ b/arch/ia64/mm/contig.c
> @@ -163,7 +163,7 @@ per_cpu_init (void)
> * get_zeroed_page().
> */
> if (first_time) {
> - void *cpu0_data = __phys_per_cpu_start - PERCPU_PAGE_SIZE;
> + void *cpu0_data = __cpu0_per_cpu;
>
> first_time=0;
>
> diff --git a/arch/ia64/mm/discontig.c b/arch/ia64/mm/discontig.c
> index 78026aa..d8c5fcd 100644
> --- a/arch/ia64/mm/discontig.c
> +++ b/arch/ia64/mm/discontig.c
> @@ -144,7 +144,7 @@ static void *per_cpu_node_setup(void *cpu_data, int node)
>
> for_each_possible_early_cpu(cpu) {
> if (cpu == 0) {
> - void *cpu0_data = __phys_per_cpu_start - PERCPU_PAGE_SIZE;
> + void *cpu0_data = __cpu0_per_cpu;
> __per_cpu_offset[cpu] = (char*)cpu0_data -
> __per_cpu_start;
> } else if (node == node_cpuid[cpu].nid) {
> --
> To unsubscribe from this list: send the line "unsubscribe linux-ia64" in
> the body of a message to majordomo at vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
More information about the kexec
mailing list