qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH v20 0/7] Virtio-balloon Enhancement


From: Tetsuo Handa
Subject: Re: [Qemu-devel] [PATCH v20 0/7] Virtio-balloon Enhancement
Date: Wed, 20 Dec 2017 11:33:07 +0900

Matthew Wilcox wrote:
> > I think xb_find_set() has a bug in !node path.
> 
> Don't think.  Write a test-case.  Please.  If it shows a bug, then great,

+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) {
+                       index = (index | RADIX_TREE_MAP_MASK) + 1;

Why we don't need to reset "bit" to 0 here?
We will continue with wrong offset if "bit != 0", won't we?

+                       continue;
+               }
+
+               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

[Prev in Thread] Current Thread [Next in Thread]