Dave Anderson wrote:
 Haren Myneni wrote:
   
> Dave Anderson wrote:
>
>     
>> Dave Anderson wrote:
>>
>>       
>>> "Sachin P. Sant" wrote:
>>>
>>>         
>>>> Hi Dave
>>>> Recently there were changes made to kexec tools to support 64K page
>>>>           
>>> size.
>>>         
>>>> With those changes vmcore file obtained from a kernel which
>>>>           
>>> supports 64K
>>>         
>>>> page size cannot be analyzed using crash on a machine running with
>>>>           
>>> kernel
>>>         
>>>> supporting 4K page size.
>>>>
>>>> The following changes in crash tool resolves the problem.
>>>> Look if the symbol __hash_page_64k exists. This symbol is defined only
>>>> for kernels with 64K PAGE SIZE support. If yes then the dump was taken
>>>> with a kernel supporting 64k page size. So use the vmcore page
>>>>           
>>> size[64K]
>>>         
>>>> instead of getpagesize().
>>>>
>>>> Thanks
>>>> -Sachin
>>>>
>>>>
>>>>           
>>>
------------------------------------------------------------------------------------------------------------------------
>>>
>>>         
>>>> * Recently there were changes made to kexec tools to support 64K
>>>>           
>>> page size.
>>>         
>>>>   With those changes vmcore file obtained from a kernel which
>>>>           
>>> supports 64K
>>>         
>>>>   page size cannot be analyzed using crash on a machine running
>>>>           
>>> with kernel
>>>         
>>>>   supporting 4K page size.
>>>>   The following change were made in crash tool to solve the problem.
>>>>   Look if the symbol __hash_page_64k exists. If yes then the dump
>>>>           
>>> was taken
>>>         
>>>>   with a kernel supporting 64k page size. So change the page size
>>>>           
>>> accordingly.
>>>         
>>>> Signed-Off-By: Sachin Sant <sachinp(a)in.ibm.com>
>>>> --
>>>>
>>>> diff -Naurp crash-4.0/defs.h crash-4.0-new/defs.h
>>>> --- crash-4.0/defs.h    2006-09-14 21:41:50.000000000 -0400
>>>> +++ crash-4.0-new/defs.h        2006-09-14 21:48:37.000000000 -0400
>>>> @@ -2297,6 +2297,7 @@ struct efi_memory_desc_t {
>>>>  #define _64BIT_
>>>>  #define MACHINE_TYPE       "PPC64"
>>>>
>>>> +#define PPC64_64K_PAGE_SIZE    65536
>>>>  #define PAGEBASE(X)  (((ulong)(X)) & (ulong)machdep->pagemask)
>>>>
>>>>  #define PTOV(X)            ((unsigned long)(X)+(machdep->kvbase))
>>>> diff -Naurp crash-4.0/ppc64.c crash-4.0-new/ppc64.c
>>>> --- crash-4.0/ppc64.c   2006-09-14 21:41:50.000000000 -0400
>>>> +++ crash-4.0-new/ppc64.c       2006-09-14 21:50:26.000000000 -0400
>>>> @@ -67,19 +67,6 @@ ppc64_init(int when)
>>>>                 machdep->verify_symbol = ppc64_verify_symbol;
>>>>                 if (pc->flags & KERNEL_DEBUG_QUERY)
>>>>                         return;
>>>> -               machdep->pagesize = memory_page_size();
>>>> -               machdep->pageshift = ffs(machdep->pagesize) - 1;
>>>> -               machdep->pageoffset = machdep->pagesize - 1;
>>>> -               machdep->pagemask =
~((ulonglong)machdep->pageoffset);
>>>> -               machdep->stacksize = 4 * machdep->pagesize;
>>>> -               if ((machdep->pgd = (char *)malloc(PAGESIZE())) ==
>>>>           
>>> NULL)
>>>         
>>>> -                       error(FATAL, "cannot malloc pgd
space.");
>>>> -               if ((machdep->pmd = (char *)malloc(PAGESIZE())) ==
>>>>           
>>> NULL)
>>>         
>>>> -                       error(FATAL, "cannot malloc pmd
space.");
>>>> -               if ((machdep->ptbl = (char *)malloc(PAGESIZE())) ==
>>>>           
>>> NULL)
>>>         
>>>> -                       error(FATAL, "cannot malloc ptbl
space.");
>>>> -               if ((machdep->machspec->level4 = (char
>>>>           
>>> *)malloc(PAGESIZE())) == NULL)
>>>         
>>>> -                       error(FATAL, "cannot malloc level4
space.");
>>>>                 machdep->last_pgd_read = 0;
>>>>                  machdep->last_pmd_read = 0;
>>>>                  machdep->last_ptbl_read = 0;
>>>> @@ -93,6 +80,40 @@ ppc64_init(int when)
>>>>                 break;
>>>>
>>>>         case PRE_GDB:
>>>> +               /*
>>>> +                * Recently there were changes made to kexec tools
>>>> +                * to support 64K page size. With those changes
>>>> +                * vmcore file obtained from a kernel which supports
>>>> +                * 64K page size cannot be analyzed using crash on a
>>>> +                * machine running with kernel supporting 4K page size
>>>> +                *
>>>> +                * The following modifications are required in crash
>>>> +                * tool to be in sync with kexec tools.
>>>> +                *
>>>> +                * Look if the following symbol exists. If yes then
>>>> +                * the dump was taken with a kernel supporting 64k
>>>> +                * page size. So change the page size accordingly.
>>>> +                *
>>>> +                * Also moved the following code block from
>>>> +                * PRE_SYMTAB case here.
>>>> +                */
>>>> +                if (symbol_exists("__hash_page_64K"))
>>>> +                        machdep->pagesize = PPC64_64K_PAGE_SIZE;
>>>> +                else
>>>> +                       machdep->pagesize = memory_page_size();
>>>> +               machdep->pageshift = ffs(machdep->pagesize) - 1;
>>>> +               machdep->pageoffset = machdep->pagesize - 1;
>>>> +               machdep->pagemask =
~((ulonglong)machdep->pageoffset);
>>>> +               machdep->stacksize = 4 * machdep->pagesize;
>>>> +               if ((machdep->pgd = (char *)malloc(PAGESIZE())) ==
>>>>           
>>> NULL)
>>>         
>>>> +                       error(FATAL, "cannot malloc pgd
space.");
>>>> +               if ((machdep->pmd = (char *)malloc(PAGESIZE())) ==
>>>>           
>>> NULL)
>>>         
>>>> +                       error(FATAL, "cannot malloc pmd
space.");
>>>> +               if ((machdep->ptbl = (char *)malloc(PAGESIZE())) ==
>>>>           
>>> NULL)
>>>         
>>>> +                       error(FATAL, "cannot malloc ptbl
space.");
>>>> +               if ((machdep->machspec->level4 = (char
>>>>           
>>> *)malloc(PAGESIZE())) == NULL)
>>>         
>>>> +                       error(FATAL, "cannot malloc level4
space.");
>>>> +
>>>>                 machdep->kvbase = symbol_value("_stext");
>>>>                 machdep->identity_map_base = machdep->kvbase;
>>>>                  machdep->is_kvaddr = generic_is_kvaddr;
>>>>           
>>> The patch looks safe enough.
>>>
>>> A couple things I just noticed though...
>>>
>>> Is it true that the process stack size will be 256K?  And the
>>> ppc64 hardware interrupt stack would be 512K?  Based upon
>>> the machdep->pagesize value, these inititializations get done
>>> later:
>>>
>>>    machdep->stacksize = 4 * machdep->pagesize;
>>>
>>>    machdep->machspec->hwstacksize = 8 * machdep->pagesize;
>>>
>>> If they have not increased, won't the backtrace code get confused?
>>>
>>> Thanks,
>>>   Dave
>>>
>>>         
>> The kernel's asm-powerpc/thread_info.h file doesn't
>> show any change in stack size, which I didn't expect
>> it would anyway:
>>
>>   #ifdef __KERNEL__
>>
>>   /* We have 8k stacks on ppc32 and 16k on ppc64 */
>>
>>   #ifdef CONFIG_PPC64
>>   #define THREAD_SHIFT            14
>>   #else
>>   #define THREAD_SHIFT            13
>>   #endif
>>
>>   #define THREAD_SIZE             (1 << THREAD_SHIFT)
>>
>> and the hardware interrupt stack seems to only be in
>> the paca_struct in 2.4 kernels.
>>
>> I think we can safely hardwire those two values anyway,
>> right?
>>
>>       
> Sachin, Yes, we should be hardcoding the stack size value (16K). It does
> not matter for hardware intr stack which is used only for 2.4 kernel and
> supports only 4K page. Uses soft IRQ and hard IRQ stacks in 2.6 kernel
> for interrupt context and their sizes are the same as THREAD_SIZE.
>
> This patch should also support backward compatibility since the symbol
> __hash_page_64K does not exist and thus the page size is always 4K.
>
>     
 Thanks, Haren.  Sachin is probably blissfully asleep and not aware of
 this discussion, so I will go ahead and modify his patch to:
 (1) hardwire the process stack size, and
 (2) as you state, it doesn't really make a difference for the 2.4 kernel
     since it won't ever see the larger pagesize.
    
Thanks Haren, Dave . I was travelling back to india, so missed this part 
of the
discussion. 
 Thanks,
   Dave
 --
 Crash-utility mailing list
 Crash-utility(a)redhat.com
 
https://www.redhat.com/mailman/listinfo/crash-utility