Hi, I can confirm that hooking in generic_show_interrupts() and generic_get_irq_affinity() results in meaningful output for ARM as well, using PATCH v3. I've got another suggestion however. How about mimicking the kernel code a little closer? fs/proc/interrupts.c will keep going for one more iteration, i.e. while <=nr_irqs and kernel/irq/proc.c:show_interrupts() will call arch_show_interrupts() when called with ==nr_irqs. In Crash we could do this in cmd_irq for (i = 0; i <= nr_irqs; i++) machdep->show_interrupts(i, cpus); and this at the start of generic_show_interrupts(): if (irq >= machdep->nr_irqs) { return; } making it possible to have machdep->show_interrupts point to a wrapper function like: static void arm_show_interrupts(int irq, ulong *cpus) { if (irq == machdep->nr_irqs) { // Show FIQ // Show IPI } else { generic_show_interrupts(irq, cpus); } } Just an idea. Regards, Per On Wed, Jan 18, 2012 at 9:11 PM, Dave Anderson <anderson@xxxxxxxxxx> wrote: > > > ----- Original Message ----- >> Hello, Dave >> >> Re-posting two patches as attachments. Very sorry for incorrectly >> changing the behaviour of the original "irq" command in the last >> patches. >> >> Thanks, >> Zhang Yanfei > > I should first note that I would have preferred that the patch were > written to address the other actively-supported architectures, given > that the irq_data and irq_desc structures are not x86/x86_64-specific. > However, I understand that you may not have access to the other > architectures. That being the case, I invite the s390x, ia64, arm, > ppc32 and ppc64 maintainers to look at this patch, and if you are > interested, please apply it for those architectures as well. > > Anyway, I made a number of changes to the patch as written. > > (1) I changed the "irq" option letters to something more meaningful: > > (a) For IRQ affinity, I changed it from "irq -s" to "irq -a". > (b) For IRQ stats, I changed it from "irq -S" to "irq -s". > > (2) In generic_show_interrupts(), I changed the output so that it > does not append additional unnecessary spaces to the end of > the output line, i.e., from this: > > fprintf(fp, " %-20s ", name_buf); > fprintf(fp, "\n"); > > to simply this: > > fprintf(fp, " %s\n", name_buf); > > (3) In cmd_irq(), I changed the two new command_not_supported() calls > to be option_not_supported(c). > > (4) The "irq -s" option fails on earlier kernels, for example, with > the RHEL4 kernel: > > crash> irq -s > IRQ NAME AFFINITY > > irq: invalid structure member offset: irq_desc_t_affinity > FILE: kernel.c LINE: 5543 FUNCTION: generic_get_irq_affinity() > > [/home/anderson/crash-6.0.2/crash] error trace: 459c05 => 4bf432 => 4c1d31 => 4fb70e > > 4fb70e: OFFSET_verify+222 > 4c1d31: generic_get_irq_affinity+1153 > 4bf432: cmd_irq+530 > 459c05: exec_command+821 > > irq: invalid structure member offset: irq_desc_t_affinity > > The "irq -s" option would also fail on recent kernels if they are > not configured with CONFIG_SMP, because irq_data.affinity > member would not exist: > > struct irq_data { > unsigned int irq; > unsigned long hwirq; > unsigned int node; > unsigned int state_use_accessors; > struct irq_chip *chip; > struct irq_domain *domain; > void *handler_data; > void *chip_data; > struct msi_desc *msi_desc; > #ifdef CONFIG_SMP > cpumask_var_t affinity; > #endif > }; > > To handle those two possibilities, I added this to cmd_irq() > for the "-a" option: > > if (VALID_STRUCT(irq_data)) { > if (INVALID_MEMBER(irq_data_affinity)) > option_not_supported(c); > } else if (INVALID_MEMBER(irq_desc_t_affinity)) > option_not_supported(c); > > > (5) In x86.c, it makes no sense to set machdep->get_irq_affinity > and machdep->show_interrupts in x86_init_hyper() given that the > "irq" command is not supported for the Xen hypervisor analysis. > (See the xen_hyper_command_table[] in xen_hyper_global_data.c) > > (6) In defs.h, I moved: > > (a) get_irq_affinity and show_interrupts to the end of the > machdep_table structure > (b) irq_desc_t_irq_data, irq_desc_t_kstat_irqs, irq_desc_t_affinity, > irq_data_chip, irq_data_affinity and kernel_stat_irqs to the > end of the offset_table structure. > (c) kernel_stat to the end of the size_table structure. > > This would allow an extension module built with an earlier version > of the crash utility to still work without recompiling due to > structure member offset changes. > > (7) I updated dump_offset_table() to show the new members of the > offset_table and the size_table for the "help -o" command. > > (8) And lastly, I reworked the "help irq" page. > > I will continue testing it on various kernels and architectures, > and if all goes well, I will queue it for crash-6.0.3. > > Dave > > -- > Crash-utility mailing list > Crash-utility@xxxxxxxxxx > https://www.redhat.com/mailman/listinfo/crash-utility
diff --git a/arm.c b/arm.c index 5eb5649..eea082e 100644 --- a/arm.c +++ b/arm.c @@ -245,6 +245,8 @@ arm_init(int when) machdep->value_to_symbol = generic_machdep_value_to_symbol; machdep->init_kernel_pgd = NULL; machdep->dump_irq = generic_dump_irq; + machdep->show_interrupts = generic_show_interrupts; + machdep->get_irq_affinity = generic_get_irq_affinity; arm_init_machspec(); break; diff --git a/kernel.c b/kernel.c index 2343a74..0e758fe 100755 --- a/kernel.c +++ b/kernel.c @@ -4799,7 +4799,7 @@ cmd_irq(void) break; case 's': - if (!(machine_type("X86") || machine_type("X86_64"))) + if (!(machine_type("X86") || machine_type("X86_64") || machine_type("ARM"))) command_not_supported(); if ((nr_irqs = machdep->nr_irqs) == 0) @@ -4842,7 +4842,7 @@ cmd_irq(void) error(FATAL, "cannot determine number of IRQs\n"); if (show_intr) { - if (!(machine_type("X86") || machine_type("X86_64"))) + if (!(machine_type("X86") || machine_type("X86_64") || machine_type("ARM"))) command_not_supported(); if ((len = STRUCT_SIZE("cpumask_t")) < 0)
-- Crash-utility mailing list Crash-utility@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/crash-utility