From b65ccfc7a4e36d152c8ab8af57da783eca965a4c Mon Sep 17 00:00:00 2001 From: Theodore Ts'o Date: Sat, 24 Nov 2012 19:02:48 -0500 Subject: [PATCH] libext2fs: optimize rb_get_bmap_range() for mostly allocated bmaps This optimizies the CPU utilization of the rb_get_bmap_range() function when most of the bitmap is allocated. Signed-off-by: "Theodore Ts'o" Reviewed-by: Lukas Czerner --- lib/ext2fs/blkmap64_rb.c | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/lib/ext2fs/blkmap64_rb.c b/lib/ext2fs/blkmap64_rb.c index eb56c856..7196e906 100644 --- a/lib/ext2fs/blkmap64_rb.c +++ b/lib/ext2fs/blkmap64_rb.c @@ -721,6 +721,7 @@ static errcode_t rb_get_bmap_range(ext2fs_generic_bitmap bitmap, struct rb_node *parent = NULL, *next, **n; struct ext2fs_rb_private *bp; struct bmap_rb_extent *ext; + int count; __u64 pos; bp = (struct ext2fs_rb_private *) bitmap->private; @@ -748,14 +749,32 @@ static errcode_t rb_get_bmap_range(ext2fs_generic_bitmap bitmap, ext = ext2fs_rb_entry(parent, struct bmap_rb_extent, node); pos = ext->start; - if (pos < start) + count = ext->count; + if (pos >= start + num) + break; + if (pos < start) { + count -= start - pos; + if (count < 0) + continue; pos = start; + } + if (pos + count > start + num) + count = start + num - pos; - while (pos < (ext->start + ext->count)) { - if ((pos - start) >= num) - return 0; + while (count > 0) { + if ((count >= 8) && + ((pos - start) % 8) == 0) { + int nbytes = count >> 3; + int offset = (pos - start) >> 3; + + memset(out + offset, 0xFF, nbytes); + pos += nbytes << 3; + count -= nbytes << 3; + continue; + } ext2fs_fast_set_bit64((pos - start), out); pos++; + count--; } } return 0;