Re: [PATCH v3] add option -s and -S for subcommand irq

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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

[Index of Archives]     [Fedora Development]     [Fedora Desktop]     [Fedora SELinux]     [Yosemite News]     [KDE Users]     [Fedora Tools]

 

Powered by Linux