Re: [PATCH 1/12] radix_tree: exceptional entries and indices

From: Pekka Enberg
Date: Tue Jun 14 2011 - 07:22:09 EST


Hi Hugh!

On Tue, Jun 14, 2011 at 1:42 PM, Hugh Dickins <hughd@xxxxxxxxxx> wrote:
> @@ -39,7 +39,15 @@
>  * when it is shrunk, before we rcu free the node. See shrink code for
>  * details.
>  */
> -#define RADIX_TREE_INDIRECT_PTR        1
> +#define RADIX_TREE_INDIRECT_PTR                1
> +/*
> + * A common use of the radix tree is to store pointers to struct pages;
> + * but shmem/tmpfs needs also to store swap entries in the same tree:
> + * those are marked as exceptional entries to distinguish them.
> + * EXCEPTIONAL_ENTRY tests the bit, EXCEPTIONAL_SHIFT shifts content past it.
> + */
> +#define RADIX_TREE_EXCEPTIONAL_ENTRY   2
> +#define RADIX_TREE_EXCEPTIONAL_SHIFT   2
>
>  #define radix_tree_indirect_to_ptr(ptr) \
>        radix_tree_indirect_to_ptr((void __force *)(ptr))
> @@ -174,6 +182,28 @@ static inline int radix_tree_deref_retry
>  }
>
>  /**
> + * radix_tree_exceptional_entry        - radix_tree_deref_slot gave exceptional entry?
> + * @arg:       value returned by radix_tree_deref_slot
> + * Returns:    0 if well-aligned pointer, non-0 if exceptional entry.
> + */
> +static inline int radix_tree_exceptional_entry(void *arg)
> +{
> +       /* Not unlikely because radix_tree_exception often tested first */
> +       return (unsigned long)arg & RADIX_TREE_EXCEPTIONAL_ENTRY;
> +}
> +
> +/**
> + * radix_tree_exception        - radix_tree_deref_slot returned either exception?
> + * @arg:       value returned by radix_tree_deref_slot
> + * Returns:    0 if well-aligned pointer, non-0 if either kind of exception.
> + */
> +static inline int radix_tree_exception(void *arg)
> +{
> +       return unlikely((unsigned long)arg &
> +               (RADIX_TREE_INDIRECT_PTR | RADIX_TREE_EXCEPTIONAL_ENTRY));
> +}

Would something like radix_tree_augmented() be a better name for this
(with RADIX_TREE_AUGMENTED_MASK defined)? This one seems too easy to
confuse with radix_tree_exceptional_entry() to me which is not the
same thing, right?

Pekka
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/