1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */ 21366c37eSMatthew Wilcox #include <linux/gfp.h> 31366c37eSMatthew Wilcox #include <linux/types.h> 41366c37eSMatthew Wilcox #include <linux/radix-tree.h> 51366c37eSMatthew Wilcox #include <linux/rcupdate.h> 61366c37eSMatthew Wilcox 71366c37eSMatthew Wilcox struct item { 83e252fa7SRoss Zwisler struct rcu_head rcu_head; 91366c37eSMatthew Wilcox unsigned long index; 10101d9607SMatthew Wilcox unsigned int order; 111366c37eSMatthew Wilcox }; 121366c37eSMatthew Wilcox 13101d9607SMatthew Wilcox struct item *item_create(unsigned long index, unsigned int order); 14101d9607SMatthew Wilcox int __item_insert(struct radix_tree_root *root, struct item *item); 151366c37eSMatthew Wilcox int item_insert(struct radix_tree_root *root, unsigned long index); 16fd8f58c4SRoss Zwisler void item_sanity(struct item *item, unsigned long index); 174f3755d1SMatthew Wilcox int item_insert_order(struct radix_tree_root *root, unsigned long index, 184f3755d1SMatthew Wilcox unsigned order); 191366c37eSMatthew Wilcox int item_delete(struct radix_tree_root *root, unsigned long index); 203e252fa7SRoss Zwisler int item_delete_rcu(struct radix_tree_root *root, unsigned long index); 211366c37eSMatthew Wilcox struct item *item_lookup(struct radix_tree_root *root, unsigned long index); 221366c37eSMatthew Wilcox 231366c37eSMatthew Wilcox void item_check_present(struct radix_tree_root *root, unsigned long index); 241366c37eSMatthew Wilcox void item_check_absent(struct radix_tree_root *root, unsigned long index); 251366c37eSMatthew Wilcox void item_gang_check_present(struct radix_tree_root *root, 261366c37eSMatthew Wilcox unsigned long start, unsigned long nr, 271366c37eSMatthew Wilcox int chunk, int hop); 281366c37eSMatthew Wilcox void item_full_scan(struct radix_tree_root *root, unsigned long start, 291366c37eSMatthew Wilcox unsigned long nr, int chunk); 301366c37eSMatthew Wilcox void item_kill_tree(struct radix_tree_root *root); 311366c37eSMatthew Wilcox 32268f42deSMatthew Wilcox int tag_tagged_items(struct radix_tree_root *, pthread_mutex_t *, 33268f42deSMatthew Wilcox unsigned long start, unsigned long end, unsigned batch, 34268f42deSMatthew Wilcox unsigned iftag, unsigned thentag); 35478922e2SMatthew Wilcox unsigned long find_item(struct radix_tree_root *, void *item); 36478922e2SMatthew Wilcox 371366c37eSMatthew Wilcox void tag_check(void); 384f3755d1SMatthew Wilcox void multiorder_checks(void); 393e3cdc68SMatthew Wilcox void iteration_test(unsigned order, unsigned duration); 40cfa40bcfSKonstantin Khlebnikov void benchmark(void); 410a835c4fSMatthew Wilcox void idr_checks(void); 428ab8ba38SMatthew Wilcox void ida_tests(void); 431366c37eSMatthew Wilcox 441366c37eSMatthew Wilcox struct item * 451366c37eSMatthew Wilcox item_tag_set(struct radix_tree_root *root, unsigned long index, int tag); 461366c37eSMatthew Wilcox struct item * 471366c37eSMatthew Wilcox item_tag_clear(struct radix_tree_root *root, unsigned long index, int tag); 481366c37eSMatthew Wilcox int item_tag_get(struct radix_tree_root *root, unsigned long index, int tag); 491366c37eSMatthew Wilcox void tree_verify_min_height(struct radix_tree_root *root, int maxindex); 501366c37eSMatthew Wilcox void verify_tag_consistency(struct radix_tree_root *root, unsigned int tag); 511366c37eSMatthew Wilcox 521366c37eSMatthew Wilcox extern int nr_allocated; 531366c37eSMatthew Wilcox 541366c37eSMatthew Wilcox /* Normally private parts of lib/radix-tree.c */ 55148deab2SMatthew Wilcox struct radix_tree_node *entry_to_node(void *ptr); 560796c583SRoss Zwisler void radix_tree_dump(struct radix_tree_root *root); 571366c37eSMatthew Wilcox int root_tag_get(struct radix_tree_root *root, unsigned int tag); 580694f0c9SMatthew Wilcox unsigned long node_maxindex(struct radix_tree_node *); 590694f0c9SMatthew Wilcox unsigned long shift_maxindex(unsigned int shift); 606df5ee78SMatthew Wilcox int radix_tree_cpu_dead(unsigned int cpu); 612791653aSMatthew Wilcox struct radix_tree_preload { 622791653aSMatthew Wilcox unsigned nr; 632791653aSMatthew Wilcox struct radix_tree_node *nodes; 642791653aSMatthew Wilcox }; 652791653aSMatthew Wilcox extern struct radix_tree_preload radix_tree_preloads; 66