[Crash-utility] crash vs irqs

Dave Anderson anderson at redhat.com
Mon Jul 9 14:19:04 UTC 2007


D. Hugh Redelmeier wrote:
> | From: Dave Anderson <anderson at redhat.com>
> 
> | D. Hugh Redelmeier wrote:
> | > I'm having a problem with the Fedora 7 kernel 2.6.21-1.3228.fc7 for
> | > x86_64.  So I am trying to use crash-4.0-4.2 to analyze the problem.
> | > (The version of crash in F7 won't work with this kernel.)
> 
> | > When I use the irq command I get this error message:
> | >   irq: cannot determine size of irq_desc_t
> | 
> | Could be shifting sands syndrome, which happens all the time.
> | 
> | Perhaps "irq_desc_t" has been removed from that kernel?
> | I've got a slightly older 2.6.21-1.3125.fc7 source tree
> | hanging around that shows this:
> | 
> | /*
> |  * Migration helpers for obsolete names, they will go away:
> |  */
> | #define hw_interrupt_type       irq_chip
> | typedef struct irq_chip         hw_irq_controller;
> | #define no_irq_type             no_irq_chip
> | typedef struct irq_desc         irq_desc_t;
> | 
> | Interesting, the "go away" comment -- perhaps it's no longer
> | there in -1.3228?
> 
> I'm playing with linux-2.6.22-rc7 now.  It has the same problem with
> the crash irq command.
> 
> Those lines are still in
>   linux-2.6.22-rc7/include/linux/irq.h
> so I don't know why this problem has come up.
> 
> In any case, I have a patch that seems to fix the problem and that
> should be backward compatible.  It is based on the suggestions you
> outlined.  I'm starting with the crash-4.0-4.3.
> 
> ===================================================================
> RCS file: RCS/kernel.c,v
> retrieving revision 1.1
> diff -u -r1.1 kernel.c
> --- kernel.c	2007/07/07 17:23:06	1.1
> +++ kernel.c	2007/07/07 17:56:59
> @@ -49,7 +49,7 @@
>  static void BUG_bytes_init(void);
>  static int BUG_x86(void);
>  static int BUG_x86_64(void);
> -
> +static /*const*/ char *irq_desc_type_name;	
>  
>  
>  /*
> @@ -278,13 +278,19 @@
>  	STRUCT_SIZE_INIT(hlist_head, "hlist_head"); 
>  	STRUCT_SIZE_INIT(hlist_node, "hlist_node"); 
>  
> -	MEMBER_OFFSET_INIT(irq_desc_t_status,  "irq_desc_t", "status");
> -	if (MEMBER_EXISTS("irq_desc_t", "handler"))
> -		MEMBER_OFFSET_INIT(irq_desc_t_handler, "irq_desc_t", "handler");
> +	/* see linux-* /include/linux/irq.h to find how IRQ information is represented by the kernel */
> +	if (STRUCT_EXISTS("irq_desc_t"))
> +	    irq_desc_type_name = "irq_desc_t";
> +	else
> +	    irq_desc_type_name = "irq_desc";
> +
> +	MEMBER_OFFSET_INIT(irq_desc_t_status,  irq_desc_type_name, "status");
> +	if (MEMBER_EXISTS(irq_desc_type_name, "handler"))
> +		MEMBER_OFFSET_INIT(irq_desc_t_handler, irq_desc_type_name, "handler");
>  	else
> -		MEMBER_OFFSET_INIT(irq_desc_t_chip, "irq_desc_t", "chip");
> -	MEMBER_OFFSET_INIT(irq_desc_t_action, "irq_desc_t", "action");
> -	MEMBER_OFFSET_INIT(irq_desc_t_depth, "irq_desc_t", "depth");
> +		MEMBER_OFFSET_INIT(irq_desc_t_chip, irq_desc_type_name, "chip");
> +	MEMBER_OFFSET_INIT(irq_desc_t_action, irq_desc_type_name, "action");
> +	MEMBER_OFFSET_INIT(irq_desc_t_depth, irq_desc_type_name, "depth");
>  	if (STRUCT_EXISTS("hw_interrupt_type")) {
>  		MEMBER_OFFSET_INIT(hw_interrupt_type_typename,
>  			"hw_interrupt_type", "typename");
> @@ -346,7 +352,7 @@
>  	MEMBER_OFFSET_INIT(irqaction_dev_id, "irqaction", "dev_id");
>  	MEMBER_OFFSET_INIT(irqaction_next, "irqaction", "next");
>  
> -	STRUCT_SIZE_INIT(irq_desc_t, "irq_desc_t");
> +	STRUCT_SIZE_INIT(irq_desc_t, irq_desc_type_name);
>  
>          STRUCT_SIZE_INIT(irq_cpustat_t, "irq_cpustat_t");
>          MEMBER_OFFSET_INIT(irq_cpustat_t___softirq_active, 
> ================ end of patch ================
> 
>

I still don't understand why it's not being picked up in the
debuginfo data.  There was a problem with gcc 3.4.*, and then
subsequently a regression in gcc 4.0.0, both of which were related
to data structure information not being contained in the vmlinux
debuginfo data.

Anyway, thanks -- the patch looks good.  Even with the mystery
it's worth updating it in preparation for its eventual advertised
removal from the kernel.  In the Linux 2.2 days when the crash
code was originally written, and through 2.4, the kernel defined
it as:

     typedef struct {
         ...
     } irq_desc_t;

In 2.6 a "struct irq_desc" struct was introduced.

Queued for the next release.

Thanks,
   Dave





More information about the Crash-utility mailing list