Commit 08470a98 authored by Kemeng Shi's avatar Kemeng Shi Committed by Jens Axboe

sbitmap: rewrite sbitmap_find_bit_in_index to reduce repeat code

Rewrite sbitmap_find_bit_in_index as following:
1. Rename sbitmap_find_bit_in_index to sbitmap_find_bit_in_word
2. Accept "struct sbitmap_word *" directly instead of accepting
"struct sbitmap *" and "int index" to get "struct sbitmap_word *".
3. Accept depth/shallow_depth and wrap for __sbitmap_get_word from caller
to support need of both __sbitmap_get_shallow and __sbitmap_get.

With helper function sbitmap_find_bit_in_word, we can remove repeat
code in __sbitmap_get_shallow to find bit considring deferred clear.
Reviewed-by: default avatarJan Kara <jack@suse.cz>
Signed-off-by: default avatarKemeng Shi <shikemeng@huaweicloud.com>
Link: https://lore.kernel.org/r/20230116205059.3821738-4-shikemeng@huaweicloud.comSigned-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent 903e86f3
...@@ -167,15 +167,16 @@ static int __sbitmap_get_word(unsigned long *word, unsigned long depth, ...@@ -167,15 +167,16 @@ static int __sbitmap_get_word(unsigned long *word, unsigned long depth,
return nr; return nr;
} }
static int sbitmap_find_bit_in_index(struct sbitmap *sb, int index, static int sbitmap_find_bit_in_word(struct sbitmap_word *map,
unsigned int alloc_hint) unsigned int depth,
unsigned int alloc_hint,
bool wrap)
{ {
struct sbitmap_word *map = &sb->map[index];
int nr; int nr;
do { do {
nr = __sbitmap_get_word(&map->word, __map_depth(sb, index), nr = __sbitmap_get_word(&map->word, depth,
alloc_hint, !sb->round_robin); alloc_hint, wrap);
if (nr != -1) if (nr != -1)
break; break;
if (!sbitmap_deferred_clear(map)) if (!sbitmap_deferred_clear(map))
...@@ -203,7 +204,9 @@ static int __sbitmap_get(struct sbitmap *sb, unsigned int alloc_hint) ...@@ -203,7 +204,9 @@ static int __sbitmap_get(struct sbitmap *sb, unsigned int alloc_hint)
alloc_hint = 0; alloc_hint = 0;
for (i = 0; i < sb->map_nr; i++) { for (i = 0; i < sb->map_nr; i++) {
nr = sbitmap_find_bit_in_index(sb, index, alloc_hint); nr = sbitmap_find_bit_in_word(&sb->map[index],
__map_depth(sb, index),
alloc_hint, !sb->round_robin);
if (nr != -1) { if (nr != -1) {
nr += index << sb->shift; nr += index << sb->shift;
break; break;
...@@ -246,20 +249,17 @@ static int __sbitmap_get_shallow(struct sbitmap *sb, ...@@ -246,20 +249,17 @@ static int __sbitmap_get_shallow(struct sbitmap *sb,
alloc_hint = SB_NR_TO_BIT(sb, alloc_hint); alloc_hint = SB_NR_TO_BIT(sb, alloc_hint);
for (i = 0; i < sb->map_nr; i++) { for (i = 0; i < sb->map_nr; i++) {
again: nr = sbitmap_find_bit_in_word(&sb->map[index],
nr = __sbitmap_get_word(&sb->map[index].word, min_t(unsigned int,
min_t(unsigned int, __map_depth(sb, index),
__map_depth(sb, index), shallow_depth),
shallow_depth), alloc_hint, true);
alloc_hint, true);
if (nr != -1) { if (nr != -1) {
nr += index << sb->shift; nr += index << sb->shift;
break; break;
} }
if (sbitmap_deferred_clear(&sb->map[index]))
goto again;
/* Jump to next index. */ /* Jump to next index. */
alloc_hint = 0; alloc_hint = 0;
if (++index >= sb->map_nr) if (++index >= sb->map_nr)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment