mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-01 10:45:49 +00:00
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: Jan Kara <jack@suse.cz> Signed-off-by: Kemeng Shi <shikemeng@huaweicloud.com> Link: https://lore.kernel.org/r/20230116205059.3821738-4-shikemeng@huaweicloud.com Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
parent
903e86f3a6
commit
08470a98a7
@ -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)
|
|||||||
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,
|
|||||||
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)
|
||||||
|
Loading…
Reference in New Issue
Block a user