----- Original Message -----
Hello Dave,
I was talking about the users pace. The "vtop -u" or "rd -u" commands
do
not work for user space memory mapped above 8 PB. Memory is reported as
not mapped. See the sample below:
Ok good -- the patch is queued for crash-7.2.0:
https://github.com/crash-utility/crash/commit/c30fbd7a43be118c9a342064180...
Thanks,
Dave
*crash> rd -u 0x60000000000000
rd: invalid user virtual address: 60000000000000 type: "64-bit UVADDR"
crash> vtop -u 0x60000000000000
VIRTUAL PHYSICAL
60000000000000 (not mapped)
VMA START END FLAGS FILE
62e5bde8 60000000000000 60000000001000 8100073
*
Thanks,
Mikhail Zaslonko
On 11.05.2017 20:26, Dave Anderson wrote:
>
> ----- Original Message -----
>> Hello Dave,
>>
>> We have recently found that Crash is not capable of processing 5 level
>> page tables virtual addresses (higher than 8 Petabytes). Please find the
>> enclosed patch below.
>>
>> Thanks,
>> Mikhail Zaslonko
> Hi Mikhail,
>
> For the changelog, can you give an example of the symptoms of the
> failure? Does it fail to handle kernel modules during session
> initialization, or what?
>
> Thanks,
> Dave
>
>
>>
>> [PATCH] s390x: Fix virtual address check for 5 level page tables
>>
>>
>> The current validity check for virtual addresses fails for
>> five level page tables because in that case it uses a 64 bit
>> left-shift operation which is undefined in the C standard.
>>
>> Quote from C99 standard:
>>
>> If the value of the right operand is negative or is
>> greater than or equal to the width of the promoted left operand,
>> the behavior is undefined.
>>
>> To fix this, we just skip the validity check in case of highest
>> page-level (level = 3) due to redundancy
>>
>> Signed-off-by: Mikhail Zaslonko <zaslonko(a)linux.vnet.ibm.com>
>> ---
>> s390x.c | 2 +-
>> 1 file changed, 1 insertion(+), 1 deletion(-)
>>
>> diff --git a/s390x.c b/s390x.c
>> index e13bd59..96ce3dc 100644
>> --- a/s390x.c
>> +++ b/s390x.c
>> @@ -688,7 +688,7 @@ int s390x_vtop(ulong table, ulong vaddr, physaddr_t
>> *phys_addr, int verbose)
>> /* Read the first entry to find the number of page table levels. */
>> readmem(table, KVADDR, &entry, sizeof(entry), "entry",
>> FAULT_ON_ERROR);
>> level = (entry & 0xcULL) >> 2;
>> - if ((vaddr >> (31 + 11*level)) != 0ULL) {
>> + if ((level < 3) && (vaddr >> (31 + 11*level)) != 0ULL) {
>> /* Address too big for the number of page table levels. */
>> return FALSE;
>> }
>> --
>> 2.10.2
>>
>>