From: xie xingguo Date: Wed, 18 May 2016 02:34:26 +0000 (+0800) Subject: os/bluestore/BitAllocator: set_bits() in batch X-Git-Tag: v11.0.0~367^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=a1277976b8b24528d966b1d2a4ab3cd5833db403;p=ceph.git os/bluestore/BitAllocator: set_bits() in batch Which is simpler and faster. Signed-off-by: xie xingguo --- diff --git a/src/os/bluestore/BitAllocator.cc b/src/os/bluestore/BitAllocator.cc index 4d419d4f1947..68f8a7c317da 100644 --- a/src/os/bluestore/BitAllocator.cc +++ b/src/os/bluestore/BitAllocator.cc @@ -163,10 +163,12 @@ void BmapEntry::clear_bits(int offset, int num_bits) void BmapEntry::set_bits(int offset, int num_bits) { - for (int i = 0; i < num_bits; i++) { - bmap_t bmask = bit_mask(i + offset); - (void) std::atomic_fetch_or(&m_bits, bmask); + if (num_bits == 0) { + return; } + + bmap_t bmask = BmapEntry::align_mask(num_bits) >> offset; + (void) std::atomic_fetch_or(&m_bits, bmask); } /*