[Crash-utility] Adding a new command rbtree
Dave Anderson
anderson at redhat.com
Tue May 22 15:15:27 UTC 2012
----- Original Message -----
> At 2012-5-22 4:21, Dave Anderson wrote:
> >
> >
> > ----- Original Message -----
> >> The patch has been modified.
> >
> > Whereas the radix_tree problem I showed in my last email seems to
> > be RHEL5-related, I cannot dump a red-black tree from an rb_root on
> > RHEL5, RHEL6 or Fedora.
>
> I didn't explain the address clearly.
>
> <cut>
> The meaning of the "start" argument, which can be expressed either
> symbolically or in hexadecimal format, depends upon whether the -N
> option is pre-pended or not:
> start The address of the structure where
> radix_tree_root(radix
> tree) or rb_node(red-black tree) is embeded.
> -N start The address of the structure radix_tree_node(radix
> tree)
> or rb_node(red-black tree)
> <cut>
>
> So you can only specified rb_node's related address. The following is
> about why the command doesn't support your situation.
>
> In your situation, the offset you offered is the offset of rb_root.
>
> struct rb_root
> {
> struct rb_node *rb_node;
> };
>
> So I can get the address of root node, then get the address of its
> offspring nodes. But now, I cannot convert the address of an
> rb_node(offspring node) to its related structure's information. In
> details, the rb_node may be embeded in a structure, but the offset of
> rb_node is not offered. So the offset should be the offset of
> rb_node.
OK, so this is what you currently have:
[-o] offset The offset within the structure to the radix_tree_root(radix tree)
or rb_node(red-black tree), default is 0.If non-zero, the offset
may be entered in either of two manners:
1. In "structure.member" format; the "-o" is not necessary.
2. A number of bytes; the "-o" is only necessary on processors
where the offset value could be misconstrued as a kernel
virtual address.
Doing it that way really confuses two different "offset" issues that are associated
with this command:
(1) the offset of an rb_root or radix_tree_node within a containing
data structure, and
(2) the offset of an rb_node within a containing data structure.
With respect to (1), typically the rb_root or radix_tree_root structure is
embedded within another containing data structure. The user will know the
containing structure's address, for example, the address of an mm_struct.
But the user should not have to first determine the mm_struct.mm_rb member
offset, and then have to add it to the mm_struct address in order to
pre-calulate the "start" parameter.
So for the "start" address, there needs to be an accompanying option that
indicates that the rb_root or radix_tree_root is embedded in another data
structure. Something like:
-r offset If the "start" argument is the address of a data structure that
contains the radix_tree_root or rb_root structure, then this is
the offset to that structure member. If the offset is non-zero,
then this option is required. The offset may be entered in either
of two manners:
1. In "structure.member" format.
2. A number of bytes.
If the "start" argument is the actual address of an rb_root or radix_tree_root,
or if the radix_tree_root or rb_root member offset is 0, then the -r option would
be unnecessary.
With respect to (2), there needs to be second option for embedded rb_node structures,
something like:
-n offset The offset of the rb_node within its containing data structure. If the
offset is non-zero, then this option is required. The offset may be
entered in either of two manners:
1. In "structure.member" format.
2. A number of bytes.
If the rb_node member offset is 0, then the -n option would be unnecessary.
And in both cases, forget trying to implement the "the -o is not necessary" and
"the -o is only necessary..." optimizations, because it would be almost impossible
to do.
Dave
More information about the Crash-utility
mailing list