[Crash-utility] do_radix_tree() function in filesys.c
Dave Anderson
anderson at redhat.com
Mon Jan 21 18:38:19 UTC 2008
Alan Tyson wrote:
> I notice that there is a function to look at radix trees in filesys.c,
> but it's not called by anything in the crash executable from what I can
> see. In fact when I wrote a small extension to call it, I see that it
> simply doesn't work for several reasons (wrong structures, incorrect
> dereferencing of pointers). Attached is a patch which addresses these.
> I've tested it on i686, x86_64 and ia64.
>
> If you think that this type of ("utility") code is best left out of
> crash, then let's just remove this from the source and not clutter it
> with dead code. Personally, I think it's nice to have it there... when
> it works.
>
I don't care either way any more, but since you've made it work
again, I'll queue your changes for the next release.
Thanks,
Dave
> Regards,
>
> Alan Tyson, HP.
>
>
> ------------------------------------------------------------------------
>
> --- a/filesys.c 2008-01-11 19:35:32.000000000 +0000
> +++ b/filesys.c 2008-01-21 16:21:20.000000000 +0000
> @@ -3484,10 +3484,14 @@ cleanup_memory_driver(void)
> #define RADIX_TREE_MAP_SHIFT 6
> #define RADIX_TREE_MAP_SIZE (1UL << RADIX_TREE_MAP_SHIFT)
> #define RADIX_TREE_MAP_MASK (RADIX_TREE_MAP_SIZE-1)
> +#define RADIX_TREE_TAGS 2
> +#define RADIX_TREE_TAG_LONGS \
> + ((RADIX_TREE_MAP_SIZE + BITS_PER_LONG - 1) / BITS_PER_LONG)
>
> struct radix_tree_node {
> unsigned int count;
> void *slots[RADIX_TREE_MAP_SIZE];
> + unsigned long tags[RADIX_TREE_TAGS][RADIX_TREE_TAG_LONGS];
> };
>
> /*
> @@ -3639,16 +3643,15 @@ static void *
> radix_tree_lookup(ulong root_rnode, ulong index, int height)
> {
> unsigned int shift;
> - struct radix_tree_node **slot;
> + void *slot;
> struct radix_tree_node slotbuf;
> - void **kslotp, **uslotp;
>
> shift = (height-1) * RADIX_TREE_MAP_SHIFT;
> - kslotp = (void **)root_rnode;
> +
> + readmem(root_rnode, KVADDR, &slot, sizeof(void *),
> + "radix_tree_root rnode", FAULT_ON_ERROR);
>
> while (height > 0) {
> - readmem((ulong)kslotp, KVADDR, &slot, sizeof(void *),
> - "radix_tree_node slot", FAULT_ON_ERROR);
>
> if (slot == NULL)
> return NULL;
> @@ -3657,15 +3660,13 @@ radix_tree_lookup(ulong root_rnode, ulon
> sizeof(struct radix_tree_node),
> "radix_tree_node struct", FAULT_ON_ERROR);
>
> - uslotp = (void **)
> - (slotbuf.slots + ((index >> shift) & RADIX_TREE_MAP_MASK));
> - kslotp = *uslotp;
> -
> + slot = slotbuf.slots[((index >> shift) & RADIX_TREE_MAP_MASK)];
> +
> shift -= RADIX_TREE_MAP_SHIFT;
> height--;
> }
>
> - return (void *) kslotp;
> + return slot;
> }
>
> int
>
>
> ------------------------------------------------------------------------
>
> --
> 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