Merge tag 'bitmap-5.17-rc1' of git://github.com/norov/linux
[linux-block.git] / mm / percpu.c
index a188ac9a267d25f12f64d422528c6471e32c378d..ea28db283044eb40c84e78632663256dd7a14e9b 100644 (file)
@@ -779,7 +779,7 @@ static void pcpu_block_refresh_hint(struct pcpu_chunk *chunk, int index)
 {
        struct pcpu_block_md *block = chunk->md_blocks + index;
        unsigned long *alloc_map = pcpu_index_alloc_map(chunk, index);
-       unsigned int rs, re, start;     /* region start, region end */
+       unsigned int start, end;        /* region start, region end */
 
        /* promote scan_hint to contig_hint */
        if (block->scan_hint) {
@@ -795,9 +795,8 @@ static void pcpu_block_refresh_hint(struct pcpu_chunk *chunk, int index)
        block->right_free = 0;
 
        /* iterate over free areas and update the contig hints */
-       bitmap_for_each_clear_region(alloc_map, rs, re, start,
-                                    PCPU_BITMAP_BLOCK_BITS)
-               pcpu_block_update(block, rs, re);
+       for_each_clear_bitrange_from(start, end, alloc_map, PCPU_BITMAP_BLOCK_BITS)
+               pcpu_block_update(block, start, end);
 }
 
 /**
@@ -1070,17 +1069,18 @@ static void pcpu_block_update_hint_free(struct pcpu_chunk *chunk, int bit_off,
 static bool pcpu_is_populated(struct pcpu_chunk *chunk, int bit_off, int bits,
                              int *next_off)
 {
-       unsigned int page_start, page_end, rs, re;
+       unsigned int start, end;
 
-       page_start = PFN_DOWN(bit_off * PCPU_MIN_ALLOC_SIZE);
-       page_end = PFN_UP((bit_off + bits) * PCPU_MIN_ALLOC_SIZE);
+       start = PFN_DOWN(bit_off * PCPU_MIN_ALLOC_SIZE);
+       end = PFN_UP((bit_off + bits) * PCPU_MIN_ALLOC_SIZE);
 
-       rs = page_start;
-       bitmap_next_clear_region(chunk->populated, &rs, &re, page_end);
-       if (rs >= page_end)
+       start = find_next_zero_bit(chunk->populated, end, start);
+       if (start >= end)
                return true;
 
-       *next_off = re * PAGE_SIZE / PCPU_MIN_ALLOC_SIZE;
+       end = find_next_bit(chunk->populated, end, start + 1);
+
+       *next_off = end * PAGE_SIZE / PCPU_MIN_ALLOC_SIZE;
        return false;
 }
 
@@ -1851,13 +1851,12 @@ area_found:
 
        /* populate if not all pages are already there */
        if (!is_atomic) {
-               unsigned int page_start, page_end, rs, re;
+               unsigned int page_end, rs, re;
 
-               page_start = PFN_DOWN(off);
+               rs = PFN_DOWN(off);
                page_end = PFN_UP(off + size);
 
-               bitmap_for_each_clear_region(chunk->populated, rs, re,
-                                            page_start, page_end) {
+               for_each_clear_bitrange_from(rs, re, chunk->populated, page_end) {
                        WARN_ON(chunk->immutable);
 
                        ret = pcpu_populate_chunk(chunk, rs, re, pcpu_gfp);
@@ -2013,8 +2012,7 @@ static void pcpu_balance_free(bool empty_only)
        list_for_each_entry_safe(chunk, next, &to_free, list) {
                unsigned int rs, re;
 
-               bitmap_for_each_set_region(chunk->populated, rs, re, 0,
-                                          chunk->nr_pages) {
+               for_each_set_bitrange(rs, re, chunk->populated, chunk->nr_pages) {
                        pcpu_depopulate_chunk(chunk, rs, re);
                        spin_lock_irq(&pcpu_lock);
                        pcpu_chunk_depopulated(chunk, rs, re);
@@ -2084,8 +2082,7 @@ retry_pop:
                        continue;
 
                /* @chunk can't go away while pcpu_alloc_mutex is held */
-               bitmap_for_each_clear_region(chunk->populated, rs, re, 0,
-                                            chunk->nr_pages) {
+               for_each_clear_bitrange(rs, re, chunk->populated, chunk->nr_pages) {
                        int nr = min_t(int, re - rs, nr_to_pop);
 
                        spin_unlock_irq(&pcpu_lock);