[Crash-utility] crash help: using list for traversing pages through page.next

Dave Anderson anderson at redhat.com
Wed Apr 29 12:23:47 UTC 2020



----- Original Message -----
> Hi all,
> 
> Recently I found an slub related problem(kmalloc-1024 objects eat tons of
> memory):
> # ./slabinfo -l | grep "t-0001024"
> :t-0001024            46448117    1024    47.5G 4074/505/11608097    4 0   0
> 99 *
> 
> Then I make the memroy coredump trying to find out why, it seems something wrong with
> the slub's cpu_slab(kmem_cache_cpu) list. But as I want to walk through the page list
> like following, crash seems can't identify:
> 
> crash> struct page.next,pages,pobjects 0xffffea0049e85140
>        next = 0xffffea0014533c40
>        pages = 13511054
>        pobjects = -545576266
> crash> list page.next 0xffffea0049e85140
> list: invalid argument: page.next
> 
> While my usage case is similar to the case in the 'help list' man page:
>      crash> p file_systems
>      file_systems = $1 = (struct file_system_type *) 0xc03adc90
>      crash> list file_system_type.next -s file_system_type.name,fs_flags
>      c03adc90
> 
> 
> So what is wrong, is there a way that I can walk through the page list?

I'm not sure -- I can't reproduce the problem:
  
  crash> kmem -p | grep mapped
  fffffc97c41cc840 107321000 ffff9d5d65a12c88       52  1 17ffffc0020036 referenced,uptodate,lru,active,mappedtodisk
  fffffc97c41ce4c0 107393000 ffff9d5d65a12c88        0  1 17ffffc0020036 referenced,uptodate,lru,active,mappedtodisk
  ^C
  crash> list page.next fffffc97c41cc840
  fffffc97c41cc840
  fffffc97d090fac8
  fffffc97c41cc848
  fffffc97d092a988
  fffffc97d08f6bc8
  fffffc97d090e608
  fffffc97d0923308
  fffffc97d09fd548
  fffffc97d090cd48
  fffffc97d09bc448
  fffffc97d0994208
  fffffc97d0994348
  ...

For some reason, the "page.next" argument is not being resolved by arg_to_datatype(),
here in tools.c, line 3454:

   3452         while (args[optind]) {
   3453                 if (strstr(args[optind], ".") &&
   3454                     arg_to_datatype(args[optind], sm, RETURN_ON_ERROR) > 1) {
   3455                         if (ld->flags & LIST_OFFSET_ENTERED)
   3456                                 error(FATAL,
   3457                                    "offset value %ld (0x%lx) already entered\n",
   3458                                         ld->member_offset, ld->member_offset);
   3459                         ld->member_offset = sm->member_offset;
   3460                         ld->flags |= LIST_OFFSET_ENTERED;
   3461                 } else {

What happens if you just enter this:

  crash> page.next
  struct page {
     [8]                 struct page *next;
  }
  crash>

Or for that matter, what does "page -o" show?

You can always use the "-o offset" argument as a replacement for "page.next":

  crash> list -o 8 fffffc97c41cc840
  fffffc97c41cc840
  fffffc97d090fac8
  fffffc97c41cc848
  fffffc97d092a988
  fffffc97d08f6bc8
  fffffc97d090e608
  fffffc97d0923308
  fffffc97d09fd548
  fffffc97d090cd48
  fffffc97d09bc448
  fffffc97d0994208
  ...

Dave


 
> 
> thanks in advance~
> linfeng
> 
> 
> --
> Crash-utility mailing list
> Crash-utility at redhat.com
> https://www.redhat.com/mailman/listinfo/crash-utility
> 




More information about the Crash-utility mailing list