Commit Graph

5 Commits

Author SHA1 Message Date
Kazuhito Hagio
f0b5952462 Fix segmentation fault by "tree -s" option with Maple Tree
Without the patch, do_mt_entry() can call dump_struct_members_for_tree()
with a NULL entry, and parse_for_member_extended() will cause a
segmentation fault during strncpy().

This is caused by "tree -t maple -s struct.member.member" style multiple
level member access:

  crash> tree -t maple -s irq_desc.irq_data.irq  sparse_irqs
  ffff936980188400
    irq_data.irq = 0,
  ffff93698018be00
    irq_data.irq = 1,
  ...
  ffff936980f38e00
    irq_data.irq = 19,
  Segmentation fault (core dumped)

  (gdb) bt
  #0  0x00007faaf8e51635 in __strncpy_avx2 () from /lib64/libc.so.6
  #1  0x00000000005e5927 in parse_for_member_extended (dm=dm@entry=0x7ffcb9e6d860, ...
  #2  0x0000000000603c45 in dump_struct_member (s=s@entry=0x128cde0 <shared_bufs+1024> ...
  #3  0x0000000000513cf5 in dump_struct_members_for_tree (td=td@entry=0x7ffcb9e6eeb0, ...
  #4  0x0000000000651f15 in do_mt_entry (entry=0, min=min@entry=20, max=max@entry=119, ...
  ...

Signed-off-by: Kazuhito Hagio <k-hagio-ab@nec.com>
2023-07-13 09:14:06 +09:00
Kazuhito Hagio
d17d51a92a Exclude zero entries from do_maple_tree() return value
While the return value of do_radix_tree() and do_xarray() does not
contain NULL entries, do_maple_tree()'s one contains NULL entries.

Make this behavior consistent with the previous tree functions to make
replacement easier, especially for the following patch.

Signed-off-by: Kazuhito Hagio <k-hagio-ab@nec.com>
2023-07-13 09:11:51 +09:00
Tao Liu
222176a0a6 Add do_maple_tree() for maple tree operations
do_maple_tree() is similar to do_radix_tree() and do_xarray(), which
takes the same do_maple_tree_traverse entry as tree command.

Signed-off-by: Tao Liu <ltao@redhat.com>
2023-01-12 14:36:20 +09:00
Tao Liu
16a696762c Add maple tree support to "tree" command
The maple tree is a new data structure for crash, so "tree" command
needs to support it for users to dump and view the content of maple
trees.  This patch achieves this by using ported mt_dump() and its
related functions from kernel and adapting them with "tree" command.

Also introduce a new -v arg specifically for dumping the complete
content of a maple tree:

    crash> tree -t maple 0xffff9034c006aec0 -v

    maple_tree(ffff9034c006aec0) flags 309, height 2 root 0xffff9034de70041e

    0-18446744073709551615: node 0xffff9034de700400 depth 0 type 3 parent 0xffff9034c006aec1 contents:...
      0-140112331583487: node 0xffff9034c01e8800 depth 1 type 1 parent 0xffff9034de700406 contents:...
        0-94643156942847: (nil)
        94643156942848-94643158024191: 0xffff9035131754c0
        94643158024192-94643160117247: (nil)
        ...

The existing options of "tree" command can work as well:

    crash> tree -t maple -r mm_struct.mm_mt 0xffff9034c006aec0 -p
    ffff9035131754c0
      index: 1  position: root/0/1
    ffff9035131751c8
      index: 2  position: root/0/3
    ffff9035131757b8
      index: 3  position: root/0/4
    ...

    crash> tree -t maple 0xffff9034c006aec0 -p -x -s vm_area_struct.vm_start,vm_end
    ffff9035131754c0
      index: 1  position: root/0/1
      vm_start = 0x5613d3c00000,
      vm_end = 0x5613d3d08000,
    ffff9035131751c8
      index: 2  position: root/0/3
      vm_start = 0x5613d3f07000,
      vm_end = 0x5613d3f0b000,
    ffff9035131757b8
      index: 3  position: root/0/4
      vm_start = 0x5613d3f0b000,
      vm_end = 0x5613d3f14000,
    ....

Signed-off-by: Tao Liu <ltao@redhat.com>
2023-01-12 14:36:20 +09:00
Tao Liu
872cad2d63 Port the maple tree data structures and functions
There have been two ways to iterate vm_area_struct until Linux 6.0:
 1) by rbtree, aka vma.vm_rb;
 2) by linked list, aka vma.vm_{next,prev}.
However with the maple tree patches[1][2] in Linux 6.1, vm_rb and
vm_{next,prev} are removed from vm_area_struct. The vm_area_dump()
in crash mainly uses the linked list for vma iteration, which will
not work for this case. So the maple tree iteration needs to be
ported to crash.

For crash, currently it only iteratively reads the maple tree,
no more rcu safe or maple tree modification features needed.
So we only port a subset of kernel maple tree features.
In addition, we need to modify the ported kernel source code,
making it compatible with crash.

This patch deals with the two issues:
 1) Poring mt_dump() function and all its dependencies from
    kernel source to crash, to enable crash maple tree iteration,
 2) adapting the ported code with crash.

[1]: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=524e00b36e8c547f5582eef3fb645a8d9fc5e3df
[2]: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=763ecb035029f500d7e6dc99acd1ad299b7726a1

Signed-off-by: Tao Liu <ltao@redhat.com>
2023-01-12 14:36:20 +09:00