Only older kernel (v2.4) used h/w interrupt stack to store frames when
CPU received IPI. Memory used for this in 'struct machine_specific' is
useless for later kernels. For the sake of backward compatibility keep
h/w interrupt stack but dynamically allocate memory for it and save
some bytes from being wasted.

Signed-off-by: Hari Bathini <[email protected]>
---
 defs.h  |  2 +-
 ppc64.c | 48 +++++++++++++++++++-----------------------------
 2 files changed, 20 insertions(+), 30 deletions(-)

diff --git a/defs.h b/defs.h
index 7d3b734..d1d3ea9 100644
--- a/defs.h
+++ b/defs.h
@@ -6303,7 +6303,7 @@ struct ppc64_vmemmap {
  * Used to store the HW interrupt stack. It is only for 2.4.
  */
 struct machine_specific {
-        ulong hwintrstack[NR_CPUS];
+       ulong *hwintrstack;
         char *hwstackbuf;
         uint hwstacksize;
 
diff --git a/ppc64.c b/ppc64.c
index 0e1d867..fe96cfa 100644
--- a/ppc64.c
+++ b/ppc64.c
@@ -256,7 +256,7 @@ static int set_ppc64_max_physmem_bits(void)
 }
 
 struct machine_specific ppc64_machine_specific = { 
-       .hwintrstack = { 0 }, 
+       .hwintrstack = NULL,
        .hwstackbuf = 0,
        .hwstacksize = 0,
        .pte_rpn_shift = PTE_RPN_SHIFT_DEFAULT,
@@ -275,7 +275,7 @@ struct machine_specific ppc64_machine_specific = {
 };
 
 struct machine_specific book3e_machine_specific = {
-       .hwintrstack = { 0 },
+       .hwintrstack = NULL,
        .hwstackbuf = 0,
        .hwstacksize = 0,
        .pte_rpn_shift = PTE_RPN_SHIFT_L4_BOOK3E_64K,
@@ -676,6 +676,9 @@ ppc64_init(int when)
                         */
                        offset = MEMBER_OFFSET("paca_struct", "xHrdIntStack");
                        paca_sym  = symbol_value("paca");
+                       if (!(machdep->machspec->hwintrstack =
+                             (ulong *)calloc(NR_CPUS, sizeof(ulong))))
+                               error(FATAL, "cannot malloc hwintrstack 
space.");
                        for (cpu = 0; cpu < kt->cpus; cpu++)  {
                                readmem(paca_sym + (paca_size * cpu) + offset,
                                        KVADDR, 
@@ -686,14 +689,9 @@ ppc64_init(int when)
                        machdep->machspec->hwstacksize = 8 * machdep->pagesize;
                        if ((machdep->machspec->hwstackbuf = (char *)
                                malloc(machdep->machspec->hwstacksize)) == NULL)
-                               error(FATAL, "cannot malloc hwirqstack space.");
-               } else
-                       /*
-                        * 'xHrdIntStack' member in "paca_struct" is not 
-                        * available for 2.6 kernel. 
-                        */
-                       BZERO(&machdep->machspec->hwintrstack,
-                               NR_CPUS*sizeof(ulong));
+                               error(FATAL, "cannot malloc hwirqstack buffer 
space.");
+               }
+
                if (!machdep->hz) {
                        machdep->hz = HZ;
                        if (THIS_KERNEL_VERSION >= LINUX(2,6,0))
@@ -846,22 +844,13 @@ ppc64_dump_machdep_table(ulong arg)
        fprintf(fp, "            is_vmaddr: %s\n", 
                machdep->machspec->is_vmaddr == book3e_is_vmaddr ? 
                "book3e_is_vmaddr()" : "ppc64_is_vmaddr()");
-       fprintf(fp, "    hwintrstack[%d]: ", NR_CPUS);
-               for (c = 0; c < NR_CPUS; c++) {
-               for (others = 0, i = c; i < NR_CPUS; i++) {
-                       if (machdep->machspec->hwintrstack[i])
-                               others++;
+       if (machdep->machspec->hwintrstack) {
+               fprintf(fp, "    hwintrstack[%d]: ", NR_CPUS);
+               for (c = 0; c < NR_CPUS; c++) {
+                       fprintf(fp, "%s%016lx ",
+                               ((c % 4) == 0) ? "\n  " : "",
+                               machdep->machspec->hwintrstack[c]);
                }
-               if (!others) {
-                       fprintf(fp, "%s%s", 
-                               c && ((c % 4) == 0) ? "\n  " : "",
-                               c ? "(remainder unused)" : "(unused)");
-                       break;
-               }
-
-               fprintf(fp, "%s%016lx ", 
-                       ((c % 4) == 0) ? "\n  " : "",
-                       machdep->machspec->hwintrstack[c]);
        }
        fprintf(fp, "\n");
        fprintf(fp, "           hwstackbuf: %lx\n", 
(ulong)machdep->machspec->hwstackbuf);
@@ -1683,9 +1672,10 @@ ppc64_check_sp_in_HWintrstack(ulong sp, struct bt_info 
*bt)
         * 
         * Note: HW Interrupt stack is used only in 2.4 kernel.
         */
-       if (is_task_active(bt->task) && (tt->panic_task != bt->task) &&
-               machdep->machspec->hwintrstack[bt->tc->processor]) {
+       if (machdep->machspec->hwintrstack && is_task_active(bt->task) &&
+           (bt->task != tt->panic_task)) {
                ulong newsp;
+
                readmem(machdep->machspec->hwintrstack[bt->tc->processor],
                        KVADDR, &newsp, sizeof(ulong),
                        "stack pointer", FAULT_ON_ERROR);
@@ -1958,7 +1948,7 @@ ppc64_back_trace(struct gnu_request *req, struct bt_info 
*bt)
                        bt->stackbase = irqstack;
                        bt->stacktop = bt->stackbase + STACKSIZE();
                        alter_stackbuf(bt);
-               } else if (ms->hwintrstack[bt->tc->processor]) {
+               } else if (ms->hwintrstack) {
                        bt->stacktop = ms->hwintrstack[bt->tc->processor] +
                                sizeof(ulong);
                        bt->stackbase = ms->hwintrstack[bt->tc->processor] - 
@@ -2555,7 +2545,7 @@ retry:
                goto retry;
        } 
 
-       if (check_intrstack && ms->hwintrstack[bt->tc->processor]) {
+       if (check_intrstack && ms->hwintrstack) {
                bt->stacktop = ms->hwintrstack[bt->tc->processor] +
                        sizeof(ulong);
                bt->stackbase = ms->hwintrstack[bt->tc->processor] -
-- 
2.35.3

--
Crash-utility mailing list
[email protected]
https://listman.redhat.com/mailman/listinfo/crash-utility
Contribution Guidelines: https://github.com/crash-utility/crash/wiki

Reply via email to