[Crash-utility] Adding a new command rbtree
qiaonuohan
qiaonuohan at cn.fujitsu.com
Wed May 30 03:48:01 UTC 2012
Modified. I remain the "-N" option. But for radix tree on RHEL5 or
below, the height does not exist. So "-N" is not supported for radix
tree on these version.
At 2012-5-30 3:56, Dave Anderson wrote:
>
>
> ----- Original Message -----
>>
>>
>> ----- Original Message -----
>
>> As it turns out, the radix tree problem I reported seems to be an issue
>> associated with the kernel version.
>
>> But when I try the same thing on a RHEL5 kernel, it always fails like
>> this:
>>
>> crash> tree -t radix -r address_space.page_tree ffff81012eab2e00
>> radix_tree_node at ffff81011f9932e8
>> struct radix_tree_node {
>> count = 0x6,
>> slots = {0xffff810103c06490, 0xffff810103c1c760,
>> 0xffff810103c58580, 0xffff810103bfb750, 0xffff810103e84cd8,
>> 0xffff810103bf8b5
>> 8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
>> 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
>> 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
>> 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
>> , 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
>> tags = {{0x0}, {0x0}}
>> }
>> tree: height 1536 is greater than height_to_maxindex[]
>> index 12
>> crash>
>
> The reason that the command fails on RHEL5 is due to this part of
> your patch:
>
> 3766 void rdtree_iteration(ulong node_p, struct tree_data *td, char * ppos, ulong indexnum)
> 3767 {
> 3768 uint height;
> 3769 ulong slot;
> 3770 int index;
> 3771 int i;
> 3772 char pos[BUFSIZE];
> 3773
> 3774 if (indexnum != -1)
> 3775 sprintf(pos, "%s/%ld", ppos, indexnum);
> 3776 else
> 3777 sprintf(pos, "%s", ppos);
> 3778
> 3779 readmem(node_p + MEMBER_OFFSET("radix_tree_node", "height"), KVADDR,
> 3780&height, sizeof(uint), "radix_tree_node height", FAULT_ON_ERROR);
> 3781
> 3782 if (height> ARRAY_LENGTH(height_to_maxindex)) {
> 3783 fprintf(fp, "radix_tree_node at %lx\n", node_p);
> 3784 dump_struct("radix_tree_node", node_p, RADIX(16));
> 3785 error(FATAL, "height %d is greater than height_to_maxindex[] \
> 3786 index %ld\n", height, ARRAY_LENGTH(height_to_maxindex));
> 3787 }
>
> In line 3779, you calculate "height" using: MEMBER_OFFSET("radix_tree_node", "height")
> which returns -1, because RHEL5's radix_tree_node does not have a "height" member:
>
> crash> radix_tree_node
> struct radix_tree_node {
> unsigned int count;
> void *slots[64];
> long unsigned int tags[2][1];
> }
> SIZE: 536
> crash>
>
> In RHEL6, a radix_tree_node structure does have a "height" member:
>
> crash> radix_tree_node
> struct radix_tree_node {
> unsigned int height;
> unsigned int count;
> struct rcu_head rcu_head;
> void *slots[64];
> long unsigned int tags[3][1];
> }
> SIZE: 560
> crash>
>
> In any case, I now see that your patch uses MEMBER_OFFSET(...) in 4 places:
>
> $ grep MEMBER_OFFSET 0001-add-a-new-command-tree.patch
> + readmem(node_p + MEMBER_OFFSET("radix_tree_node", "height"), KVADDR,
> + readmem(td->start + MEMBER_OFFSET("rb_root", "rb_node"), KVADDR,
> + readmem(node_p+MEMBER_OFFSET("rb_node", "rb_left"), KVADDR,&left_p,
> + readmem(node_p+MEMBER_OFFSET("rb_node", "rb_right"), KVADDR,&right_p,
> $
>
> which is not acceptable, because it hides these kinds of programming errors.
>
> For each of the 4 structure members above, add them to the offset_table[] array,
> initialize them with MEMBER_OFFSET_INIT(), and use OFFSET(...) instead of
> MEMBER_OFFSET(). Then if your code is incorrect as above, it will fail
> immediately and show a meaningful error message.
>
> Dave
>
>
>
> --
> Crash-utility mailing list
> Crash-utility at redhat.com
> https://www.redhat.com/mailman/listinfo/crash-utility
>
>
--
--
Regards
Qiao Nuohan
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-add-a-new-command-tree.patch
Type: text/x-patch
Size: 20223 bytes
Desc: not available
URL: <http://listman.redhat.com/archives/crash-utility/attachments/20120530/0af5cc48/attachment.bin>
More information about the Crash-utility
mailing list