From: Chengming Zhou <zhouchengming@xxxxxxxxxxxxx> If we have alloc_hint > 0 and don't wrap, we need to recheck sb->map[index] with hint == 0 to exhaust the map. For example: we have 8 words to search, index == 4, hint > 0 In sb->map[4] word, we only search [hint, 63] bits in the first word search. Then we search left 7 words, the sb->map[4] [0, hint-1] bits aren't searched. This patch fix it by searching 9 words in this case, so we will search sb->map[4] the second time at last with hint == 0. Signed-off-by: Chengming Zhou <zhouchengming@xxxxxxxxxxxxx> --- lib/sbitmap.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/lib/sbitmap.c b/lib/sbitmap.c index ac4027884765..6e098a46be26 100644 --- a/lib/sbitmap.c +++ b/lib/sbitmap.c @@ -199,10 +199,18 @@ static int sbitmap_find_bit(struct sbitmap *sb, unsigned int alloc_hint, bool wrap) { + unsigned int map_nr = sb->map_nr; unsigned int i; int nr = -1; - for (i = 0; i < sb->map_nr; i++) { + /* + * If we have alloc_hint > 0 and don't wrap, we need to + * recheck sb->map[index] with hint == 0 to exhaust the map. + */ + if (alloc_hint && !wrap) + map_nr += 1; + + for (i = 0; i < map_nr; i++) { nr = sbitmap_find_bit_in_word(&sb->map[index], min_t(unsigned int, __map_depth(sb, index), -- 2.41.0