[Crash-utility] Adding a new command rbtree

Dave Anderson anderson at redhat.com
Tue Jun 12 13:00:29 UTC 2012



----- Original Message -----
> At 2012-6-1 2:34, Dave Anderson wrote:
> > So I believe that the 1-bit should be stripped off when a user
> > inadvertently enters such an address as a -N radix_tree_node address.
> > With this change to cmd_tree():
> >
> >          if (hexadecimal_only(args[optind], 0)) {
> >                  value = htol(args[optind], FAULT_ON_ERROR, NULL);
> >                  if (IS_KVADDR(value)) {
> >                          td->start = value;
> > +                       if ((td->start&  1)&&
> > +                           (td->flags&  TREE_NODE_POINTER)&&
> > +                           (type_flag == RADIXTREE_REQUEST))
> > +                               td->start&= ~1;
> >                          goto next_arg;
> >                  }
> >          }
> >
> > it works OK regardless of the 1-bit setting:
> 
> Hello Dave,
> 
> I have to point out that you only involved the situation that user input
> a hexadecimal number. The tree command can get starting address from
> three place.
> 
> <cut>
> 
>          if ((sp = symbol_search(args[optind]))) {
>                  td->start = sp->value;
>                  goto next_arg;
>          }
> 
>          if (!IS_A_NUMBER(args[optind])) {
>                  if (can_eval(args[optind])) {
>                          value = eval(args[optind], FAULT_ON_ERROR,
>                          NULL);
>                          if (IS_KVADDR(value)) {
>                                  td->start = value;
>                                  goto next_arg;
>                          }
>                  }
>                  error(FATAL, "invalid argument: %s\n",
>                  args[optind]);
>          }
> 
>          if (hexadecimal_only(args[optind], 0)) {
>                  value = htol(args[optind], FAULT_ON_ERROR, NULL);
>                  if (IS_KVADDR(value)) {
>                          td->start = value;
>                          goto next_arg;
>                  }
>          }
> 
> <cut>

Right, there are 3 places above where the address can be entered,
but I purposely put the 1-bit check only in the hexadecimal case.

In the symbol_search() case, there would never be a symbol value
with the 1-bit set.  And for that matter, a radix tree node
would never be a symbol since radix tree nodes come from the slab
cache.

And in the !IS_A_NUMBER() case, the input of an (expression) would 
require that the user explicitly force the 1-bit to be set, which
would be nonsensical.  And for that matter, it would be highly 
unlikely that a user would ever use the (expression) construct
to enter a radix tree node address.

So for all practical purposes, only the hexadecimal_only() case
would ever be presented with the 1-bit (as a result of a cut-and-paste).

> So I prefer change like this.
> <cut>
>          if (td->flags & TREE_NODE_POINTER) {
>                  node_p = td->start;
> +
> +               if (node_p & 1)
> +                       node_p &= ~1;
> +
>                  if (VALID_MEMBER(radix_tree_node_height)) {
>                          readmem(node_p + OFFSET(radix_tree_node_height), KVADDR,
>                                  &height, sizeof(uint),
>                                  "radix_tree_node height",
>                                  FAULT_ON_ERROR);
> <cut>

That all being said, I agree that this is a cleaner place to put it, 
so I'll make the change for crash-6.0.8.

Thanks,
  Dave





More information about the Crash-utility mailing list