Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

idr: Add missing __rcu annotations

Where we use the radix tree iteration macros, we need to annotate 'slot'
with __rcu. Make sure we don't forget any new places in the future with
the same CFLAGS check used for radix-tree.c.

Signed-off-by: Matthew Wilcox <mawilcox@microsoft.com>

+8 -7
+1
lib/Makefile
··· 25 25 earlycpio.o seq_buf.o nmi_backtrace.o nodemask.o win_minmax.o 26 26 27 27 CFLAGS_radix-tree.o += -DCONFIG_SPARSE_RCU_POINTER 28 + CFLAGS_idr.o += -DCONFIG_SPARSE_RCU_POINTER 28 29 29 30 lib-$(CONFIG_MMU) += ioremap.o 30 31 lib-$(CONFIG_SMP) += cpumask.o
+7 -7
lib/idr.c
··· 28 28 */ 29 29 int idr_alloc(struct idr *idr, void *ptr, int start, int end, gfp_t gfp) 30 30 { 31 - void **slot; 31 + void __rcu **slot; 32 32 struct radix_tree_iter iter; 33 33 34 34 if (WARN_ON_ONCE(start < 0)) ··· 98 98 int (*fn)(int id, void *p, void *data), void *data) 99 99 { 100 100 struct radix_tree_iter iter; 101 - void **slot; 101 + void __rcu **slot; 102 102 103 103 radix_tree_for_each_slot(slot, &idr->idr_rt, &iter, 0) { 104 104 int ret = fn(iter.index, rcu_dereference_raw(*slot), data); ··· 123 123 void *idr_get_next(struct idr *idr, int *nextid) 124 124 { 125 125 struct radix_tree_iter iter; 126 - void **slot; 126 + void __rcu **slot; 127 127 128 128 slot = radix_tree_iter_find(&idr->idr_rt, &iter, *nextid); 129 129 if (!slot) ··· 151 151 void *idr_replace(struct idr *idr, void *ptr, int id) 152 152 { 153 153 struct radix_tree_node *node; 154 - void **slot = NULL; 154 + void __rcu **slot = NULL; 155 155 void *entry; 156 156 157 157 if (WARN_ON_ONCE(id < 0)) ··· 250 250 int ida_get_new_above(struct ida *ida, int start, int *id) 251 251 { 252 252 struct radix_tree_root *root = &ida->ida_rt; 253 - void **slot; 253 + void __rcu **slot; 254 254 struct radix_tree_iter iter; 255 255 struct ida_bitmap *bitmap; 256 256 unsigned long index; ··· 350 350 struct ida_bitmap *bitmap; 351 351 unsigned long *btmp; 352 352 struct radix_tree_iter iter; 353 - void **slot; 353 + void __rcu **slot; 354 354 355 355 slot = radix_tree_iter_lookup(&ida->ida_rt, &iter, index); 356 356 if (!slot) ··· 396 396 void ida_destroy(struct ida *ida) 397 397 { 398 398 struct radix_tree_iter iter; 399 - void **slot; 399 + void __rcu **slot; 400 400 401 401 radix_tree_for_each_slot(slot, &ida->ida_rt, &iter, 0) { 402 402 struct ida_bitmap *bitmap = rcu_dereference_raw(*slot);