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/