Wei Wang wrote:
> Thanks for the effort. That's actually caused by the previous "!node" 
> path, which incorrectly changed "index = (index | RADIX_TREE_MAP_MASK) + 
> 1". With the change below, it will run pretty well with the test cases.
> 
> if (!node && !bitmap)
>      return size;
> 
> Would you mind to have a try with the v20 RESEND patch that was just 
> shared?

No. Please explain what "!node" situation indicates. Why did you try
"index = (index | RADIX_TREE_MAP_MASK) + 1; continue;" in the previous patch?

+unsigned long xb_find_set(struct xb *xb, unsigned long size,
+                         unsigned long offset)
+{
+       struct radix_tree_root *root = &xb->xbrt;
+       struct radix_tree_node *node;
+       void __rcu **slot;
+       struct ida_bitmap *bitmap;
+       unsigned long index = offset / IDA_BITMAP_BITS;
+       unsigned long index_end = size / IDA_BITMAP_BITS;
+       unsigned long bit = offset % IDA_BITMAP_BITS;
+
+       if (unlikely(offset >= size))
+               return size;
+
+       while (index <= index_end) {
+               unsigned long ret;
+               unsigned int nbits = size - index * IDA_BITMAP_BITS;
+
+               bitmap = __radix_tree_lookup(root, index, &node, &slot);
+
+               if (!node && !bitmap)
+                       return size;
+
+               if (bitmap) {
+                       if (nbits > IDA_BITMAP_BITS)
+                               nbits = IDA_BITMAP_BITS;
+
+                       ret = find_next_bit(bitmap->bitmap, nbits, bit);
+                       if (ret != nbits)
+                               return ret + index * IDA_BITMAP_BITS;
+               }
+               bit = 0;
+               index++;
+       }
+
+       return size;
+}

Reply via email to