Compare changes

Choose any two refs to compare.

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