Compare changes

Choose any two refs to compare.

+21 -3
+7
include/linux/generic-radix-tree.h
··· 38 38 39 39 #include <asm/page.h> 40 40 #include <linux/bug.h> 41 + #include <linux/limits.h> 41 42 #include <linux/log2.h> 42 43 #include <linux/math.h> 43 44 #include <linux/types.h> ··· 184 185 static inline void __genradix_iter_advance(struct genradix_iter *iter, 185 186 size_t obj_size) 186 187 { 188 + if (iter->offset + obj_size < iter->offset) { 189 + iter->offset = SIZE_MAX; 190 + iter->pos = SIZE_MAX; 191 + return; 192 + } 193 + 187 194 iter->offset += obj_size; 188 195 189 196 if (!is_power_of_2(obj_size) &&
+14 -3
lib/generic-radix-tree.c
··· 166 166 struct genradix_root *r; 167 167 struct genradix_node *n; 168 168 unsigned level, i; 169 + 170 + if (iter->offset == SIZE_MAX) 171 + return NULL; 172 + 169 173 restart: 170 174 r = READ_ONCE(radix->root); 171 175 if (!r) ··· 184 188 (GENRADIX_ARY - 1); 185 189 186 190 while (!n->children[i]) { 191 + size_t objs_per_ptr = genradix_depth_size(level); 192 + 193 + if (iter->offset + objs_per_ptr < iter->offset) { 194 + iter->offset = SIZE_MAX; 195 + iter->pos = SIZE_MAX; 196 + return NULL; 197 + } 198 + 187 199 i++; 188 - iter->offset = round_down(iter->offset + 189 - genradix_depth_size(level), 190 - genradix_depth_size(level)); 200 + iter->offset = round_down(iter->offset + objs_per_ptr, 201 + objs_per_ptr); 191 202 iter->pos = (iter->offset >> PAGE_SHIFT) * 192 203 objs_per_page; 193 204 if (i == GENRADIX_ARY)