summaryrefslogtreecommitdiff
path: root/lib/sbitmap.c
diff options
context:
space:
mode:
authorKemeng Shi <shikemeng@huaweicloud.com>2023-01-17 04:50:55 +0800
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2024-08-03 08:49:29 +0200
commitfda080767ccde23b07e614ba2e2ee9a34287137a (patch)
treea89bcafd7d385daf668c60ea20b35b4551ee561c /lib/sbitmap.c
parentcc8b7284d5076722e0b8062373b68d8e47c3bace (diff)
sbitmap: remove unnecessary calculation of alloc_hint in __sbitmap_get_shallow
[ Upstream commit f1591a8bb3e02713f4ee2efe20df0d84ed80da48 ] Updates to alloc_hint in the loop in __sbitmap_get_shallow() are mostly pointless and equivalent to setting alloc_hint to zero (because SB_NR_TO_BIT() considers only low sb->shift bits from alloc_hint). So simplify the logic. Reviewed-by: Jan Kara <jack@suse.cz> Signed-off-by: Kemeng Shi <shikemeng@huaweicloud.com> Link: https://lore.kernel.org/r/20230116205059.3821738-2-shikemeng@huaweicloud.com Signed-off-by: Jens Axboe <axboe@kernel.dk> Stable-dep-of: 72d04bdcf3f7 ("sbitmap: fix io hung due to race on sbitmap_word::cleared") Signed-off-by: Sasha Levin <sashal@kernel.org>
Diffstat (limited to 'lib/sbitmap.c')
-rw-r--r--lib/sbitmap.c11
1 files changed, 4 insertions, 7 deletions
diff --git a/lib/sbitmap.c b/lib/sbitmap.c
index c515072eca29..b9dd0a0a28f8 100644
--- a/lib/sbitmap.c
+++ b/lib/sbitmap.c
@@ -243,6 +243,7 @@ static int __sbitmap_get_shallow(struct sbitmap *sb,
int nr = -1;
index = SB_NR_TO_INDEX(sb, alloc_hint);
+ alloc_hint = SB_NR_TO_BIT(sb, alloc_hint);
for (i = 0; i < sb->map_nr; i++) {
again:
@@ -250,7 +251,7 @@ again:
min_t(unsigned int,
__map_depth(sb, index),
shallow_depth),
- SB_NR_TO_BIT(sb, alloc_hint), true);
+ alloc_hint, true);
if (nr != -1) {
nr += index << sb->shift;
break;
@@ -260,13 +261,9 @@ again:
goto again;
/* Jump to next index. */
- index++;
- alloc_hint = index << sb->shift;
-
- if (index >= sb->map_nr) {
+ alloc_hint = 0;
+ if (++index >= sb->map_nr)
index = 0;
- alloc_hint = 0;
- }
}
return nr;