On Mon, 17 Nov 2014, Dave Anderson wrote:
----- Original Message -----
> On Mon, 17 Nov 2014, Dave Anderson wrote:
> > ----- Original Message -----
> > > Hi,
> > >
> > > here is a simple patch to rudimentary support the irq command on s390.
> > > Nothing special like irq statistics, just the plain list of irqs. Also
> > > this will only work on recent kernels. Old kernels (without
> > > GENERIC_HARDIRQ support) will print "cannot determine number of
IRQs".
> >
> > What's the starting kernel version for supporting this? I note that the
> > patch
> > doesn't help with RHEL6 or RHEL7:
>
> Linux 3.12. So if you're looking at distribution kernels you'd need Fedora
> or Sles12.
OK. I may just put this in untested on my part, but by any chance do you
have a pointer to a recent Fedora s390x kernel build? The most recent version
that I can find is an F-20 3.11-based s390x package.
BTW on a standard (or emulated) s390 system you'll not see much
of interest with regards to IRQs. Things will only get interesting when
dynamically allocated IRQs used by PCI devices and their drivers come into
play.
Regards,
Sebastian
Dave
> Regards,
> Sebastian
>
> >
> > crash> sys | grep RELEASE
> > RELEASE: 2.6.32-112.el6.s390x
> > crash> irq
> > irq: cannot determine number of IRQs
> > crash> irq -u
> > irq: WARNING: irq: -u option ignored: "no_irq_chip" or
"no_irq_type"
> > symbols do not exist
> > irq: cannot determine number of IRQs
> > crash>
> >
> >
> > crash> sys | grep RELEASE
> > RELEASE: 3.10.0-123.el7.s390x
> > crash> irq
> > irq: cannot determine number of IRQs
> > crash> irq -u
> > irq: WARNING: irq: -u option ignored: "no_irq_chip" or
"no_irq_type"
> > symbols do not exist
> > irq: cannot determine number of IRQs
> > crash>
> >
> > Thanks,
> > Dave
> >
> >
> > >
> > > Regards,
> > > Sebastian
> > >
> > > From aa13aff5450686ac4438d771596e0faa041aa454 Mon Sep 17 00:00:00 2001
> > > From: Sebastian Ott <sebott(a)linux.vnet.ibm.com>
> > > Date: Fri, 14 Nov 2014 13:52:54 +0100
> > > Subject: [PATCH] s390: support irq command via generic_dump_irq
> > >
> > > Signed-off-by: Sebastian Ott <sebott(a)linux.vnet.ibm.com>
> > > ---
> > > kernel.c | 6 ------
> > > s390.c | 25 ++++++++++++-------------
> > > s390x.c | 24 +++++++++++-------------
> > > 3 files changed, 23 insertions(+), 32 deletions(-)
> > >
> > > diff --git a/kernel.c b/kernel.c
> > > index 1cb0967..da1e48e 100644
> > > --- a/kernel.c
> > > +++ b/kernel.c
> > > @@ -5575,9 +5575,6 @@ cmd_irq(void)
> > > return;
> > >
> > > case 'u':
> > > - if (machine_type("S390") ||
machine_type("S390X"))
> > > - command_not_supported();
> > > -
> > > pc->curcmd_flags |= IRQ_IN_USE;
> > > if (kernel_symbol_exists("no_irq_chip"))
> > > pc->curcmd_private =
(ulonglong)symbol_value("no_irq_chip");
> > > @@ -5633,9 +5630,6 @@ cmd_irq(void)
> > > if (argerrs)
> > > cmd_usage(pc->curcmd, SYNOPSIS);
> > >
> > > - if (machine_type("S390") || machine_type("S390X"))
> > > - command_not_supported();
> > > -
> > > if ((nr_irqs = machdep->nr_irqs) == 0)
> > > error(FATAL, "cannot determine number of IRQs\n");
> > >
> > > diff --git a/s390.c b/s390.c
> > > index 45da7c4..7740fe3 100644
> > > --- a/s390.c
> > > +++ b/s390.c
> > > @@ -57,7 +57,6 @@ static int s390_translate_pte(ulong, void *,
> > > ulonglong);
> > > static ulong s390_processor_speed(void);
> > > static int s390_eframe_search(struct bt_info *);
> > > static void s390_back_trace_cmd(struct bt_info *);
> > > -static void s390_dump_irq(int);
> > > static void s390_get_stack_frame(struct bt_info *, ulong *, ulong *);
> > > static int s390_dis_filter(ulong, char *, unsigned int);
> > > static void s390_cmd_mach(void);
> > > @@ -146,9 +145,18 @@ s390_init(int when)
> > > break;
> > >
> > > case POST_GDB:
> > > - machdep->nr_irqs = 0; /* TBD */
> > > +
> > > + if (symbol_exists("irq_desc"))
> > > + ARRAY_LENGTH_INIT(machdep->nr_irqs, irq_desc,
> > > + "irq_desc", NULL, 0);
> > > + else if (kernel_symbol_exists("nr_irqs"))
> > > + get_symbol_data("nr_irqs", sizeof(unsigned int),
> > > + &machdep->nr_irqs);
> > > + else
> > > + machdep->nr_irqs = 0;
> > > +
> > > machdep->vmalloc_start = s390_vmalloc_start;
> > > - machdep->dump_irq = s390_dump_irq;
> > > + machdep->dump_irq = generic_dump_irq;
> > > if (!machdep->hz)
> > > machdep->hz = HZ;
> > > machdep->section_size_bits = _SECTION_SIZE_BITS;
> > > @@ -194,7 +202,7 @@ s390_dump_machdep_table(ulong arg)
> > > fprintf(fp, " uvtop: s390_uvtop()\n");
> > > fprintf(fp, " kvtop: s390_kvtop()\n");
> > > fprintf(fp, " get_task_pgd: s390_get_task_pgd()\n");
> > > - fprintf(fp, " dump_irq: s390_dump_irq()\n");
> > > + fprintf(fp, " dump_irq: generic_dump_irq()\n");
> > > fprintf(fp, " get_stack_frame: s390_get_stack_frame()\n");
> > > fprintf(fp, " get_stackbase:
generic_get_stackbase()\n");
> > > fprintf(fp, " get_stacktop: generic_get_stacktop()\n");
> > > @@ -954,15 +962,6 @@ s390_get_stack_frame(struct bt_info *bt, ulong *eip,
> > > ulong *esp)
> > > }
> > >
> > > /*
> > > - * cmd_irq() is not implemented for s390.
> > > - */
> > > -static void
> > > -s390_dump_irq(int irq)
> > > -{
> > > - error(FATAL, "s390_dump_irq: TBD\n");
> > > -}
> > > -
> > > -/*
> > > * Filter disassembly output if the output radix is not gdb's
default
> > > 10
> > > */
> > > static int
> > > diff --git a/s390x.c b/s390x.c
> > > index 5bd7a81..7d1310f 100644
> > > --- a/s390x.c
> > > +++ b/s390x.c
> > > @@ -104,7 +104,6 @@ static int s390x_translate_pte(ulong, void *,
> > > ulonglong);
> > > static ulong s390x_processor_speed(void);
> > > static int s390x_eframe_search(struct bt_info *);
> > > static void s390x_back_trace_cmd(struct bt_info *);
> > > -static void s390x_dump_irq(int);
> > > static void s390x_get_stack_frame(struct bt_info *, ulong *, ulong *);
> > > static int s390x_dis_filter(ulong, char *, unsigned int);
> > > static void s390x_cmd_mach(void);
> > > @@ -412,9 +411,17 @@ s390x_init(int when)
> > > break;
> > >
> > > case POST_GDB:
> > > - machdep->nr_irqs = 0; /* TBD */
> > > + if (symbol_exists("irq_desc"))
> > > + ARRAY_LENGTH_INIT(machdep->nr_irqs, irq_desc,
> > > + "irq_desc", NULL, 0);
> > > + else if (kernel_symbol_exists("nr_irqs"))
> > > + get_symbol_data("nr_irqs", sizeof(unsigned int),
> > > + &machdep->nr_irqs);
> > > + else
> > > + machdep->nr_irqs = 0;
> > > +
> > > machdep->vmalloc_start = s390x_vmalloc_start;
> > > - machdep->dump_irq = s390x_dump_irq;
> > > + machdep->dump_irq = generic_dump_irq;
> > > if (!machdep->hz)
> > > machdep->hz = HZ;
> > > machdep->section_size_bits = _SECTION_SIZE_BITS;
> > > @@ -462,7 +469,7 @@ s390x_dump_machdep_table(ulong arg)
> > > fprintf(fp, " uvtop: s390x_uvtop()\n");
> > > fprintf(fp, " kvtop: s390x_kvtop()\n");
> > > fprintf(fp, " get_task_pgd: s390x_get_task_pgd()\n");
> > > - fprintf(fp, " dump_irq: s390x_dump_irq()\n");
> > > + fprintf(fp, " dump_irq: generic_dump_irq()\n");
> > > fprintf(fp, " get_stack_frame:
s390x_get_stack_frame()\n");
> > > fprintf(fp, " get_stackbase:
generic_get_stackbase()\n");
> > > fprintf(fp, " get_stacktop: generic_get_stacktop()\n");
> > > @@ -1413,15 +1420,6 @@ s390x_get_stack_frame(struct bt_info *bt, ulong
> > > *eip,
> > > ulong *esp)
> > > }
> > >
> > > /*
> > > - * cmd_irq() is not implemented for s390x.
> > > - */
> > > -static void
> > > -s390x_dump_irq(int irq)
> > > -{
> > > - error(FATAL, "s390x_dump_irq: TBD\n");
> > > -}
> > > -
> > > -/*
> > > * Filter disassembly output if the output radix is not gdb's
default
> > > 10
> > > */
> > > static int
> > > --
> > > 1.8.5.5
> > >
> > >
> >
> >
>
>