diff options
Diffstat (limited to 'include/linux/radix-tree.h')
-rw-r--r-- | include/linux/radix-tree.h | 32 |
1 files changed, 24 insertions, 8 deletions
diff --git a/include/linux/radix-tree.h b/include/linux/radix-tree.h index 13636c40bc42..33170dbd9db4 100644 --- a/include/linux/radix-tree.h +++ b/include/linux/radix-tree.h | |||
@@ -72,21 +72,37 @@ static inline int radix_tree_is_indirect_ptr(void *ptr) | |||
72 | #define RADIX_TREE_TAG_LONGS \ | 72 | #define RADIX_TREE_TAG_LONGS \ |
73 | ((RADIX_TREE_MAP_SIZE + BITS_PER_LONG - 1) / BITS_PER_LONG) | 73 | ((RADIX_TREE_MAP_SIZE + BITS_PER_LONG - 1) / BITS_PER_LONG) |
74 | 74 | ||
75 | #define RADIX_TREE_INDEX_BITS (8 /* CHAR_BIT */ * sizeof(unsigned long)) | ||
76 | #define RADIX_TREE_MAX_PATH (DIV_ROUND_UP(RADIX_TREE_INDEX_BITS, \ | ||
77 | RADIX_TREE_MAP_SHIFT)) | ||
78 | |||
79 | /* Height component in node->path */ | ||
80 | #define RADIX_TREE_HEIGHT_SHIFT (RADIX_TREE_MAX_PATH + 1) | ||
81 | #define RADIX_TREE_HEIGHT_MASK ((1UL << RADIX_TREE_HEIGHT_SHIFT) - 1) | ||
82 | |||
83 | /* Internally used bits of node->count */ | ||
84 | #define RADIX_TREE_COUNT_SHIFT (RADIX_TREE_MAP_SHIFT + 1) | ||
85 | #define RADIX_TREE_COUNT_MASK ((1UL << RADIX_TREE_COUNT_SHIFT) - 1) | ||
86 | |||
75 | struct radix_tree_node { | 87 | struct radix_tree_node { |
76 | unsigned int height; /* Height from the bottom */ | 88 | unsigned int path; /* Offset in parent & height from the bottom */ |
77 | unsigned int count; | 89 | unsigned int count; |
78 | union { | 90 | union { |
79 | struct radix_tree_node *parent; /* Used when ascending tree */ | 91 | struct { |
80 | struct rcu_head rcu_head; /* Used when freeing node */ | 92 | /* Used when ascending tree */ |
93 | struct radix_tree_node *parent; | ||
94 | /* For tree user */ | ||
95 | void *private_data; | ||
96 | }; | ||
97 | /* Used when freeing node */ | ||
98 | struct rcu_head rcu_head; | ||
81 | }; | 99 | }; |
100 | /* For tree user */ | ||
101 | struct list_head private_list; | ||
82 | void __rcu *slots[RADIX_TREE_MAP_SIZE]; | 102 | void __rcu *slots[RADIX_TREE_MAP_SIZE]; |
83 | unsigned long tags[RADIX_TREE_MAX_TAGS][RADIX_TREE_TAG_LONGS]; | 103 | unsigned long tags[RADIX_TREE_MAX_TAGS][RADIX_TREE_TAG_LONGS]; |
84 | }; | 104 | }; |
85 | 105 | ||
86 | #define RADIX_TREE_INDEX_BITS (8 /* CHAR_BIT */ * sizeof(unsigned long)) | ||
87 | #define RADIX_TREE_MAX_PATH (DIV_ROUND_UP(RADIX_TREE_INDEX_BITS, \ | ||
88 | RADIX_TREE_MAP_SHIFT)) | ||
89 | |||
90 | /* root tags are stored in gfp_mask, shifted by __GFP_BITS_SHIFT */ | 106 | /* root tags are stored in gfp_mask, shifted by __GFP_BITS_SHIFT */ |
91 | struct radix_tree_root { | 107 | struct radix_tree_root { |
92 | unsigned int height; | 108 | unsigned int height; |
@@ -251,7 +267,7 @@ void *__radix_tree_lookup(struct radix_tree_root *root, unsigned long index, | |||
251 | struct radix_tree_node **nodep, void ***slotp); | 267 | struct radix_tree_node **nodep, void ***slotp); |
252 | void *radix_tree_lookup(struct radix_tree_root *, unsigned long); | 268 | void *radix_tree_lookup(struct radix_tree_root *, unsigned long); |
253 | void **radix_tree_lookup_slot(struct radix_tree_root *, unsigned long); | 269 | void **radix_tree_lookup_slot(struct radix_tree_root *, unsigned long); |
254 | bool __radix_tree_delete_node(struct radix_tree_root *root, unsigned long index, | 270 | bool __radix_tree_delete_node(struct radix_tree_root *root, |
255 | struct radix_tree_node *node); | 271 | struct radix_tree_node *node); |
256 | void *radix_tree_delete_item(struct radix_tree_root *, unsigned long, void *); | 272 | void *radix_tree_delete_item(struct radix_tree_root *, unsigned long, void *); |
257 | void *radix_tree_delete(struct radix_tree_root *, unsigned long); | 273 | void *radix_tree_delete(struct radix_tree_root *, unsigned long); |