[Crash-utility] [PATCH] Add i386 linux-2.6.30 support.

Dave Anderson anderson at redhat.com
Tue Jul 7 13:07:19 UTC 2009


----- "Ken'ichi Ohmichi" <oomichi at mxs.nes.nec.co.jp> wrote:

> Hi,
> 
> The latest crash (version 4.0-8.11) fails on i386 linux-2.6.30:
> 
>  # crash -s vmlinux vmcore
> 
>  crash: cannot resolve: "hardirq_ctx"
> 
>  #
> 
> The reason is that both hardirq_ctx and softirq_ctx have been defined
> by DEFINE_PER_CPU() since linux-2.6.30. This change is the following:
> 
>   --- a/arch/x86/kernel/irq_32.c
>   +++ b/arch/x86/kernel/irq_32.c
>   [snip]
>   -static union irq_ctx *hardirq_ctx[NR_CPUS] __read_mostly;
>   -static union irq_ctx *softirq_ctx[NR_CPUS] __read_mostly;
>   +static DEFINE_PER_CPU(union irq_ctx *, hardirq_ctx);
>   +static DEFINE_PER_CPU(union irq_ctx *, softirq_ctx);
> 
> By this patch, the crash utility can read the dumpfile of i386
> linux-2.6.30.

Hi Ken'ichi,

I appreciate the patch -- queued for the next release.

Thanks,
  Dave

> 
> 
> Thanks
> Ken'ichi Ohmichi
> 
> Signed-off-by: Ken'ichi Ohmichi <oomichi at mxs.nes.nec.co.jp>
> ---
> --- a/task.c	2009-07-01 00:31:20.000000000 +0900
> +++ b/task.c	2009-07-06 15:37:35.000000000 +0900
> @@ -488,10 +488,27 @@ irqstacks_init(void)
>  
>  	thread_info_buf = GETBUF(SIZE(irq_ctx));
>  
> -        i = get_array_length("hardirq_ctx", NULL, 0);
> -        get_symbol_data("hardirq_ctx",
> -                sizeof(long)*(i <= NR_CPUS ? i : NR_CPUS),
> -                &tt->hardirq_ctx[0]);
> +	if (symbol_exists("hardirq_ctx")) {
> +		i = get_array_length("hardirq_ctx", NULL, 0);
> +		get_symbol_data("hardirq_ctx",
> +			sizeof(long)*(i <= NR_CPUS ? i : NR_CPUS),
> +			&tt->hardirq_ctx[0]);
> +	} else if (symbol_exists("per_cpu__hardirq_ctx")) {
> +		if ((kt->flags & SMP) && (kt->flags & PER_CPU_OFF)) {
> +			for (i = 0; i < NR_CPUS; i++) {
> +				if (!kt->__per_cpu_offset[i])
> +					continue;
> +				tt->hardirq_ctx[i] =
> +					symbol_value("per_cpu__hardirq_ctx") +
> +					kt->__per_cpu_offset[i];
> +			}
> +		} else {
> +			tt->hardirq_ctx[0] =
> +				symbol_value("per_cpu__hardirq_ctx");
> +		}
> +	} else {
> +		error(FATAL, "cannot get hardirq_ctx.");
> +	}
>  
>  	for (i = 0; i < NR_CPUS; i++) {
>          	if (!(tt->hardirq_ctx[i]))
> @@ -509,10 +526,27 @@ irqstacks_init(void)
>  			ULONG(thread_info_buf+OFFSET(thread_info_task));
>  	}
>  
> -        i = get_array_length("softirq_ctx", NULL, 0);
> -        get_symbol_data("softirq_ctx",
> -                sizeof(long)*(i <= NR_CPUS ? i : NR_CPUS),
> -                &tt->softirq_ctx[0]);
> +	if (symbol_exists("softirq_ctx")) {
> +		i = get_array_length("softirq_ctx", NULL, 0);
> +		get_symbol_data("softirq_ctx",
> +			sizeof(long)*(i <= NR_CPUS ? i : NR_CPUS),
> +			&tt->softirq_ctx[0]);
> +	} else if (symbol_exists("per_cpu__softirq_ctx")) {
> +		if ((kt->flags & SMP) && (kt->flags & PER_CPU_OFF)) {
> +			for (i = 0; i < NR_CPUS; i++) {
> +				if (!kt->__per_cpu_offset[i])
> +					continue;
> +				tt->softirq_ctx[i] =
> +					symbol_value("per_cpu__softirq_ctx") +
> +					kt->__per_cpu_offset[i];
> +			}
> +		} else {
> +			 tt->softirq_ctx[0] =
> +				symbol_value("per_cpu__softirq_ctx");
> +		}
> +	} else {
> +		error(FATAL, "cannot get softirq_ctx.");
> +	}
>  
>          for (i = 0; i < NR_CPUS; i++) {
>                  if (!(tt->softirq_ctx[i]))
> 
> --
> Crash-utility mailing list
> Crash-utility at redhat.com
> https://www.redhat.com/mailman/listinfo/crash-utility




More information about the Crash-utility mailing list