On 3/8/2019 3:13 PM, Dave Anderson wrote: > > > ----- Original Message ----- >> Fix for the "kmem -i" option on Linux 5.0 and later kernels that >> contain commit ca79b0c211af63fa3276f0e3fd7dd9ada2439839, titled >> "mm: convert totalram_pages and totalhigh_pages variables to atomic". >> Without the patch, the command prints some incorrect values, and >> besides doesn't print high/low memory information on kernels which >> are configured with CONFIG_HIGHMEM. > > Hi Kazu, > > Thanks again -- the patch is queued for crash-7.2.6: > > https://github.com/crash-utility/crash/commit/942d813cda354a5f4234fd36e9c6734140e3ffcb > > Dave Hi Dave, Thank you for the quick response as always! That's very helpful for me to test makedumpfile :) Kazu > > >> crash> kmem -i >> PAGES TOTAL PERCENTAGE >> TOTAL MEM -4395174638254716088 53602483503169.4 GB ---- >> FREE 398314 1.5 GB 0% of TOTAL MEM >> USED -4395174638255114402 53602483503167.9 GB 0% of TOTAL MEM >> ... >> >> Tested with 5.0 and 4.20 Fedora kernels for x86_64 and x86. >> >> Signed-off-by: Kazuhito Hagio <k-hagio@xxxxxxxxxxxxx> >> --- >> memory.c | 75 +++++++++++++++++++++++++++----------------------------- >> 1 file changed, 36 insertions(+), 39 deletions(-) >> >> diff --git a/memory.c b/memory.c >> index 9c1019a..ab561b3 100644 >> --- a/memory.c >> +++ b/memory.c >> @@ -910,26 +910,40 @@ vm_init(void) >> if (IS_VMALLOC_ADDR(vt->mem_map)) >> vt->flags |= V_MEM_MAP; >> vt->total_pages = BTOP(VTOP(vt->high_memory)); >> - switch (get_syment_array("totalram_pages", sp_array, 2)) >> - { >> - case 1: >> - get_symbol_data("totalram_pages", sizeof(ulong), >> - &vt->totalram_pages); >> - break; >> - case 2: >> - if (!(readmem(sp_array[0]->value, KVADDR, >> - &value1, sizeof(ulong), >> - "totalram_pages #1", RETURN_ON_ERROR))) >> + >> + if (symbol_exists("_totalram_pages")) { >> + readmem(symbol_value("_totalram_pages") + >> + OFFSET(atomic_t_counter), KVADDR, >> + &vt->totalram_pages, sizeof(ulong), >> + "_totalram_pages", FAULT_ON_ERROR); >> + } else { >> + switch (get_syment_array("totalram_pages", sp_array, 2)) >> + { >> + case 1: >> + get_symbol_data("totalram_pages", sizeof(ulong), >> + &vt->totalram_pages); >> break; >> - if (!(readmem(sp_array[1]->value, KVADDR, >> - &value2, sizeof(ulong), >> - "totalram_pages #2", RETURN_ON_ERROR))) >> - break; >> - vt->totalram_pages = MAX(value1, value2); >> - break; >> + case 2: >> + if (!(readmem(sp_array[0]->value, KVADDR, >> + &value1, sizeof(ulong), >> + "totalram_pages #1", RETURN_ON_ERROR))) >> + break; >> + if (!(readmem(sp_array[1]->value, KVADDR, >> + &value2, sizeof(ulong), >> + "totalram_pages #2", RETURN_ON_ERROR))) >> + break; >> + vt->totalram_pages = MAX(value1, value2); >> + break; >> + } >> } >> >> - if (symbol_exists("totalhigh_pages")) { >> + if (symbol_exists("_totalhigh_pages")) { >> + readmem(symbol_value("_totalhigh_pages") + >> + OFFSET(atomic_t_counter), KVADDR, >> + &vt->totalhigh_pages, sizeof(ulong), >> + "_totalhigh_pages", FAULT_ON_ERROR); >> + vt->total_pages += vt->totalhigh_pages; >> + } else if (symbol_exists("totalhigh_pages")) { >> switch (get_syment_array("totalhigh_pages", sp_array, 2)) >> { >> case 1: >> @@ -8169,7 +8183,6 @@ dump_kmeminfo(void) >> long nr_file_pages, nr_slab; >> ulong swapper_space_nrpages; >> ulong pct; >> - ulong value1, value2; >> uint tmp; >> struct meminfo meminfo; >> struct gnu_request req; >> @@ -8177,7 +8190,6 @@ dump_kmeminfo(void) >> ulong get_totalram; >> ulong get_buffers; >> ulong get_slabs; >> - struct syment *sp_array[2]; >> char buf[BUFSIZE]; >> >> >> @@ -8210,7 +8222,8 @@ dump_kmeminfo(void) >> * Prior to 2.3.36, count all mem_map pages minus the reserved >> ones. >> * From 2.3.36 onwards, use "totalram_pages" if set. >> */ >> - if (symbol_exists("totalram_pages")) { >> + if (symbol_exists("totalram_pages") || >> + symbol_exists("_totalram_pages")) { >> totalram_pages = vt->totalram_pages ? >> vt->totalram_pages : get_totalram; >> } else >> @@ -8362,25 +8375,9 @@ dump_kmeminfo(void) >> fprintf(fp, "%13s %7ld %11s %3ld%% of TOTAL MEM\n", >> "SLAB", get_slabs, pages_to_size(get_slabs, buf), pct); >> >> - if (symbol_exists("totalhigh_pages")) { >> - switch (get_syment_array("totalhigh_pages", sp_array, 2)) >> - { >> - case 1: >> - get_symbol_data("totalhigh_pages", sizeof(ulong), >> - &totalhigh_pages); >> - break; >> - case 2: >> - if (!(readmem(sp_array[0]->value, KVADDR, >> - &value1, sizeof(ulong), >> - "totalhigh_pages #1", RETURN_ON_ERROR))) >> - break; >> - if (!(readmem(sp_array[1]->value, KVADDR, >> - &value2, sizeof(ulong), >> - "totalhigh_pages #2", RETURN_ON_ERROR))) >> - break; >> - totalhigh_pages = MAX(value1, value2); >> - break; >> - } >> + if (symbol_exists("totalhigh_pages") || >> + symbol_exists("_totalhigh_pages")) { >> + totalhigh_pages = vt->totalhigh_pages; >> >> pct = totalhigh_pages ? >> (totalhigh_pages * 100)/totalram_pages : 0; >> -- >> 2.17.0 >> >> -- >> Crash-utility mailing list >> Crash-utility@xxxxxxxxxx >> https://www.redhat.com/mailman/listinfo/crash-utility >> > > -- > Crash-utility mailing list > Crash-utility@xxxxxxxxxx > https://www.redhat.com/mailman/listinfo/crash-utility > -- Crash-utility mailing list Crash-utility@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/crash-utility