Lines Matching refs:chunk

215 static bool pcpu_addr_in_chunk(struct pcpu_chunk *chunk, void *addr)  in pcpu_addr_in_chunk()  argument
219 if (!chunk) in pcpu_addr_in_chunk()
222 start_addr = chunk->base_addr + chunk->start_offset; in pcpu_addr_in_chunk()
223 end_addr = chunk->base_addr + chunk->nr_pages * PAGE_SIZE - in pcpu_addr_in_chunk()
224 chunk->end_offset; in pcpu_addr_in_chunk()
242 static int pcpu_chunk_slot(const struct pcpu_chunk *chunk) in pcpu_chunk_slot() argument
244 const struct pcpu_block_md *chunk_md = &chunk->chunk_md; in pcpu_chunk_slot()
246 if (chunk->free_bytes < PCPU_MIN_ALLOC_SIZE || in pcpu_chunk_slot()
275 static unsigned long pcpu_chunk_addr(struct pcpu_chunk *chunk, in pcpu_chunk_addr() argument
278 return (unsigned long)chunk->base_addr + in pcpu_chunk_addr()
286 static unsigned long *pcpu_index_alloc_map(struct pcpu_chunk *chunk, int index) in pcpu_index_alloc_map() argument
288 return chunk->alloc_map + in pcpu_index_alloc_map()
365 static void pcpu_next_md_free_region(struct pcpu_chunk *chunk, int *bit_off, in pcpu_next_md_free_region() argument
373 for (block = chunk->md_blocks + i; i < pcpu_chunk_nr_blocks(chunk); in pcpu_next_md_free_region()
420 static void pcpu_next_fit_region(struct pcpu_chunk *chunk, int alloc_bits, in pcpu_next_fit_region() argument
428 for (block = chunk->md_blocks + i; i < pcpu_chunk_nr_blocks(chunk); in pcpu_next_fit_region()
468 *bit_off = pcpu_chunk_map_bits(chunk); in pcpu_next_fit_region()
477 #define pcpu_for_each_md_free_region(chunk, bit_off, bits) \ argument
478 for (pcpu_next_md_free_region((chunk), &(bit_off), &(bits)); \
479 (bit_off) < pcpu_chunk_map_bits((chunk)); \
481 pcpu_next_md_free_region((chunk), &(bit_off), &(bits)))
483 #define pcpu_for_each_fit_region(chunk, alloc_bits, align, bit_off, bits) \ argument
484 for (pcpu_next_fit_region((chunk), (alloc_bits), (align), &(bit_off), \
486 (bit_off) < pcpu_chunk_map_bits((chunk)); \
488 pcpu_next_fit_region((chunk), (alloc_bits), (align), &(bit_off), \
526 static void __pcpu_chunk_move(struct pcpu_chunk *chunk, int slot, in __pcpu_chunk_move() argument
529 if (chunk != pcpu_reserved_chunk) { in __pcpu_chunk_move()
531 list_move(&chunk->list, &pcpu_chunk_lists[slot]); in __pcpu_chunk_move()
533 list_move_tail(&chunk->list, &pcpu_chunk_lists[slot]); in __pcpu_chunk_move()
537 static void pcpu_chunk_move(struct pcpu_chunk *chunk, int slot) in pcpu_chunk_move() argument
539 __pcpu_chunk_move(chunk, slot, true); in pcpu_chunk_move()
555 static void pcpu_chunk_relocate(struct pcpu_chunk *chunk, int oslot) in pcpu_chunk_relocate() argument
557 int nslot = pcpu_chunk_slot(chunk); in pcpu_chunk_relocate()
560 if (chunk->isolated) in pcpu_chunk_relocate()
564 __pcpu_chunk_move(chunk, nslot, oslot < nslot); in pcpu_chunk_relocate()
567 static void pcpu_isolate_chunk(struct pcpu_chunk *chunk) in pcpu_isolate_chunk() argument
571 if (!chunk->isolated) { in pcpu_isolate_chunk()
572 chunk->isolated = true; in pcpu_isolate_chunk()
573 pcpu_nr_empty_pop_pages -= chunk->nr_empty_pop_pages; in pcpu_isolate_chunk()
575 list_move(&chunk->list, &pcpu_chunk_lists[pcpu_to_depopulate_slot]); in pcpu_isolate_chunk()
578 static void pcpu_reintegrate_chunk(struct pcpu_chunk *chunk) in pcpu_reintegrate_chunk() argument
582 if (chunk->isolated) { in pcpu_reintegrate_chunk()
583 chunk->isolated = false; in pcpu_reintegrate_chunk()
584 pcpu_nr_empty_pop_pages += chunk->nr_empty_pop_pages; in pcpu_reintegrate_chunk()
585 pcpu_chunk_relocate(chunk, -1); in pcpu_reintegrate_chunk()
598 static inline void pcpu_update_empty_pages(struct pcpu_chunk *chunk, int nr) in pcpu_update_empty_pages() argument
600 chunk->nr_empty_pop_pages += nr; in pcpu_update_empty_pages()
601 if (chunk != pcpu_reserved_chunk && !chunk->isolated) in pcpu_update_empty_pages()
712 static void pcpu_block_update_scan(struct pcpu_chunk *chunk, int bit_off, in pcpu_block_update_scan() argument
724 block = chunk->md_blocks + s_index; in pcpu_block_update_scan()
727 l_bit = find_last_bit(pcpu_index_alloc_map(chunk, s_index), s_off); in pcpu_block_update_scan()
745 static void pcpu_chunk_refresh_hint(struct pcpu_chunk *chunk, bool full_scan) in pcpu_chunk_refresh_hint() argument
747 struct pcpu_block_md *chunk_md = &chunk->chunk_md; in pcpu_chunk_refresh_hint()
762 pcpu_for_each_md_free_region(chunk, bit_off, bits) in pcpu_chunk_refresh_hint()
774 static void pcpu_block_refresh_hint(struct pcpu_chunk *chunk, int index) in pcpu_block_refresh_hint() argument
776 struct pcpu_block_md *block = chunk->md_blocks + index; in pcpu_block_refresh_hint()
777 unsigned long *alloc_map = pcpu_index_alloc_map(chunk, index); in pcpu_block_refresh_hint()
808 static void pcpu_block_update_hint_alloc(struct pcpu_chunk *chunk, int bit_off, in pcpu_block_update_hint_alloc() argument
811 struct pcpu_block_md *chunk_md = &chunk->chunk_md; in pcpu_block_update_hint_alloc()
828 s_block = chunk->md_blocks + s_index; in pcpu_block_update_hint_alloc()
829 e_block = chunk->md_blocks + e_index; in pcpu_block_update_hint_alloc()
844 pcpu_index_alloc_map(chunk, s_index), in pcpu_block_update_hint_alloc()
862 pcpu_block_refresh_hint(chunk, s_index); in pcpu_block_update_hint_alloc()
885 pcpu_index_alloc_map(chunk, e_index), in pcpu_block_update_hint_alloc()
898 pcpu_block_refresh_hint(chunk, e_index); in pcpu_block_update_hint_alloc()
923 pcpu_update_empty_pages(chunk, -nr_empty_pages); in pcpu_block_update_hint_alloc()
942 pcpu_chunk_refresh_hint(chunk, false); in pcpu_block_update_hint_alloc()
963 static void pcpu_block_update_hint_free(struct pcpu_chunk *chunk, int bit_off, in pcpu_block_update_hint_free() argument
983 s_block = chunk->md_blocks + s_index; in pcpu_block_update_hint_free()
984 e_block = chunk->md_blocks + e_index; in pcpu_block_update_hint_free()
1006 int l_bit = find_last_bit(pcpu_index_alloc_map(chunk, s_index), in pcpu_block_update_hint_free()
1015 end = find_next_bit(pcpu_index_alloc_map(chunk, e_index), in pcpu_block_update_hint_free()
1044 pcpu_update_empty_pages(chunk, nr_empty_pages); in pcpu_block_update_hint_free()
1053 pcpu_chunk_refresh_hint(chunk, true); in pcpu_block_update_hint_free()
1055 pcpu_block_update(&chunk->chunk_md, in pcpu_block_update_hint_free()
1073 static bool pcpu_is_populated(struct pcpu_chunk *chunk, int bit_off, int bits, in pcpu_is_populated() argument
1081 start = find_next_zero_bit(chunk->populated, end, start); in pcpu_is_populated()
1085 end = find_next_bit(chunk->populated, end, start + 1); in pcpu_is_populated()
1110 static int pcpu_find_block_fit(struct pcpu_chunk *chunk, int alloc_bits, in pcpu_find_block_fit() argument
1113 struct pcpu_block_md *chunk_md = &chunk->chunk_md; in pcpu_find_block_fit()
1126 pcpu_for_each_fit_region(chunk, alloc_bits, align, bit_off, bits) { in pcpu_find_block_fit()
1127 if (!pop_only || pcpu_is_populated(chunk, bit_off, bits, in pcpu_find_block_fit()
1135 if (bit_off == pcpu_chunk_map_bits(chunk)) in pcpu_find_block_fit()
1216 static int pcpu_alloc_area(struct pcpu_chunk *chunk, int alloc_bits, in pcpu_alloc_area() argument
1219 struct pcpu_block_md *chunk_md = &chunk->chunk_md; in pcpu_alloc_area()
1226 oslot = pcpu_chunk_slot(chunk); in pcpu_alloc_area()
1232 pcpu_chunk_map_bits(chunk)); in pcpu_alloc_area()
1233 bit_off = pcpu_find_zero_area(chunk->alloc_map, end, start, alloc_bits, in pcpu_alloc_area()
1239 pcpu_block_update_scan(chunk, area_off, area_bits); in pcpu_alloc_area()
1242 bitmap_set(chunk->alloc_map, bit_off, alloc_bits); in pcpu_alloc_area()
1245 set_bit(bit_off, chunk->bound_map); in pcpu_alloc_area()
1246 bitmap_clear(chunk->bound_map, bit_off + 1, alloc_bits - 1); in pcpu_alloc_area()
1247 set_bit(bit_off + alloc_bits, chunk->bound_map); in pcpu_alloc_area()
1249 chunk->free_bytes -= alloc_bits * PCPU_MIN_ALLOC_SIZE; in pcpu_alloc_area()
1254 chunk->alloc_map, in pcpu_alloc_area()
1255 pcpu_chunk_map_bits(chunk), in pcpu_alloc_area()
1258 pcpu_block_update_hint_alloc(chunk, bit_off, alloc_bits); in pcpu_alloc_area()
1260 pcpu_chunk_relocate(chunk, oslot); in pcpu_alloc_area()
1276 static int pcpu_free_area(struct pcpu_chunk *chunk, int off) in pcpu_free_area() argument
1278 struct pcpu_block_md *chunk_md = &chunk->chunk_md; in pcpu_free_area()
1282 pcpu_stats_area_dealloc(chunk); in pcpu_free_area()
1284 oslot = pcpu_chunk_slot(chunk); in pcpu_free_area()
1289 end = find_next_bit(chunk->bound_map, pcpu_chunk_map_bits(chunk), in pcpu_free_area()
1292 bitmap_clear(chunk->alloc_map, bit_off, bits); in pcpu_free_area()
1297 chunk->free_bytes += freed; in pcpu_free_area()
1302 pcpu_block_update_hint_free(chunk, bit_off, bits); in pcpu_free_area()
1304 pcpu_chunk_relocate(chunk, oslot); in pcpu_free_area()
1319 static void pcpu_init_md_blocks(struct pcpu_chunk *chunk) in pcpu_init_md_blocks() argument
1324 pcpu_init_md_block(&chunk->chunk_md, pcpu_chunk_map_bits(chunk)); in pcpu_init_md_blocks()
1326 for (md_block = chunk->md_blocks; in pcpu_init_md_blocks()
1327 md_block != chunk->md_blocks + pcpu_chunk_nr_blocks(chunk); in pcpu_init_md_blocks()
1348 struct pcpu_chunk *chunk; in pcpu_alloc_first_chunk() local
1360 alloc_size = struct_size(chunk, populated, in pcpu_alloc_first_chunk()
1362 chunk = memblock_alloc_or_panic(alloc_size, SMP_CACHE_BYTES); in pcpu_alloc_first_chunk()
1364 INIT_LIST_HEAD(&chunk->list); in pcpu_alloc_first_chunk()
1366 chunk->base_addr = (void *)aligned_addr; in pcpu_alloc_first_chunk()
1367 chunk->start_offset = start_offset; in pcpu_alloc_first_chunk()
1368 chunk->end_offset = region_size - chunk->start_offset - map_size; in pcpu_alloc_first_chunk()
1370 chunk->nr_pages = region_size >> PAGE_SHIFT; in pcpu_alloc_first_chunk()
1371 region_bits = pcpu_chunk_map_bits(chunk); in pcpu_alloc_first_chunk()
1373 alloc_size = BITS_TO_LONGS(region_bits) * sizeof(chunk->alloc_map[0]); in pcpu_alloc_first_chunk()
1374 chunk->alloc_map = memblock_alloc_or_panic(alloc_size, SMP_CACHE_BYTES); in pcpu_alloc_first_chunk()
1377 BITS_TO_LONGS(region_bits + 1) * sizeof(chunk->bound_map[0]); in pcpu_alloc_first_chunk()
1378 chunk->bound_map = memblock_alloc_or_panic(alloc_size, SMP_CACHE_BYTES); in pcpu_alloc_first_chunk()
1380 alloc_size = pcpu_chunk_nr_blocks(chunk) * sizeof(chunk->md_blocks[0]); in pcpu_alloc_first_chunk()
1381 chunk->md_blocks = memblock_alloc_or_panic(alloc_size, SMP_CACHE_BYTES); in pcpu_alloc_first_chunk()
1384 chunk->obj_exts = NULL; in pcpu_alloc_first_chunk()
1386 pcpu_init_md_blocks(chunk); in pcpu_alloc_first_chunk()
1389 chunk->immutable = true; in pcpu_alloc_first_chunk()
1390 bitmap_fill(chunk->populated, chunk->nr_pages); in pcpu_alloc_first_chunk()
1391 chunk->nr_populated = chunk->nr_pages; in pcpu_alloc_first_chunk()
1392 chunk->nr_empty_pop_pages = chunk->nr_pages; in pcpu_alloc_first_chunk()
1394 chunk->free_bytes = map_size; in pcpu_alloc_first_chunk()
1396 if (chunk->start_offset) { in pcpu_alloc_first_chunk()
1398 offset_bits = chunk->start_offset / PCPU_MIN_ALLOC_SIZE; in pcpu_alloc_first_chunk()
1399 bitmap_set(chunk->alloc_map, 0, offset_bits); in pcpu_alloc_first_chunk()
1400 set_bit(0, chunk->bound_map); in pcpu_alloc_first_chunk()
1401 set_bit(offset_bits, chunk->bound_map); in pcpu_alloc_first_chunk()
1403 chunk->chunk_md.first_free = offset_bits; in pcpu_alloc_first_chunk()
1405 pcpu_block_update_hint_alloc(chunk, 0, offset_bits); in pcpu_alloc_first_chunk()
1408 if (chunk->end_offset) { in pcpu_alloc_first_chunk()
1410 offset_bits = chunk->end_offset / PCPU_MIN_ALLOC_SIZE; in pcpu_alloc_first_chunk()
1411 bitmap_set(chunk->alloc_map, in pcpu_alloc_first_chunk()
1412 pcpu_chunk_map_bits(chunk) - offset_bits, in pcpu_alloc_first_chunk()
1415 chunk->bound_map); in pcpu_alloc_first_chunk()
1416 set_bit(region_bits, chunk->bound_map); in pcpu_alloc_first_chunk()
1418 pcpu_block_update_hint_alloc(chunk, pcpu_chunk_map_bits(chunk) in pcpu_alloc_first_chunk()
1422 return chunk; in pcpu_alloc_first_chunk()
1427 struct pcpu_chunk *chunk; in pcpu_alloc_chunk() local
1430 chunk = pcpu_mem_zalloc(pcpu_chunk_struct_size, gfp); in pcpu_alloc_chunk()
1431 if (!chunk) in pcpu_alloc_chunk()
1434 INIT_LIST_HEAD(&chunk->list); in pcpu_alloc_chunk()
1435 chunk->nr_pages = pcpu_unit_pages; in pcpu_alloc_chunk()
1436 region_bits = pcpu_chunk_map_bits(chunk); in pcpu_alloc_chunk()
1438 chunk->alloc_map = pcpu_mem_zalloc(BITS_TO_LONGS(region_bits) * in pcpu_alloc_chunk()
1439 sizeof(chunk->alloc_map[0]), gfp); in pcpu_alloc_chunk()
1440 if (!chunk->alloc_map) in pcpu_alloc_chunk()
1443 chunk->bound_map = pcpu_mem_zalloc(BITS_TO_LONGS(region_bits + 1) * in pcpu_alloc_chunk()
1444 sizeof(chunk->bound_map[0]), gfp); in pcpu_alloc_chunk()
1445 if (!chunk->bound_map) in pcpu_alloc_chunk()
1448 chunk->md_blocks = pcpu_mem_zalloc(pcpu_chunk_nr_blocks(chunk) * in pcpu_alloc_chunk()
1449 sizeof(chunk->md_blocks[0]), gfp); in pcpu_alloc_chunk()
1450 if (!chunk->md_blocks) in pcpu_alloc_chunk()
1455 chunk->obj_exts = in pcpu_alloc_chunk()
1456 pcpu_mem_zalloc(pcpu_chunk_map_bits(chunk) * in pcpu_alloc_chunk()
1458 if (!chunk->obj_exts) in pcpu_alloc_chunk()
1463 pcpu_init_md_blocks(chunk); in pcpu_alloc_chunk()
1466 chunk->free_bytes = chunk->nr_pages * PAGE_SIZE; in pcpu_alloc_chunk()
1468 return chunk; in pcpu_alloc_chunk()
1472 pcpu_mem_free(chunk->md_blocks); in pcpu_alloc_chunk()
1475 pcpu_mem_free(chunk->bound_map); in pcpu_alloc_chunk()
1477 pcpu_mem_free(chunk->alloc_map); in pcpu_alloc_chunk()
1479 pcpu_mem_free(chunk); in pcpu_alloc_chunk()
1484 static void pcpu_free_chunk(struct pcpu_chunk *chunk) in pcpu_free_chunk() argument
1486 if (!chunk) in pcpu_free_chunk()
1489 pcpu_mem_free(chunk->obj_exts); in pcpu_free_chunk()
1491 pcpu_mem_free(chunk->md_blocks); in pcpu_free_chunk()
1492 pcpu_mem_free(chunk->bound_map); in pcpu_free_chunk()
1493 pcpu_mem_free(chunk->alloc_map); in pcpu_free_chunk()
1494 pcpu_mem_free(chunk); in pcpu_free_chunk()
1507 static void pcpu_chunk_populated(struct pcpu_chunk *chunk, int page_start, in pcpu_chunk_populated() argument
1514 bitmap_set(chunk->populated, page_start, nr); in pcpu_chunk_populated()
1515 chunk->nr_populated += nr; in pcpu_chunk_populated()
1518 pcpu_update_empty_pages(chunk, nr); in pcpu_chunk_populated()
1531 static void pcpu_chunk_depopulated(struct pcpu_chunk *chunk, in pcpu_chunk_depopulated() argument
1538 bitmap_clear(chunk->populated, page_start, nr); in pcpu_chunk_depopulated()
1539 chunk->nr_populated -= nr; in pcpu_chunk_depopulated()
1542 pcpu_update_empty_pages(chunk, -nr); in pcpu_chunk_depopulated()
1561 static int pcpu_populate_chunk(struct pcpu_chunk *chunk,
1563 static void pcpu_depopulate_chunk(struct pcpu_chunk *chunk,
1565 static void pcpu_post_unmap_tlb_flush(struct pcpu_chunk *chunk,
1568 static void pcpu_destroy_chunk(struct pcpu_chunk *chunk);
1630 struct pcpu_chunk *chunk, int off, in pcpu_memcg_post_alloc_hook() argument
1636 if (likely(chunk && chunk->obj_exts)) { in pcpu_memcg_post_alloc_hook()
1638 chunk->obj_exts[off >> PCPU_MIN_ALLOC_SHIFT].cgroup = objcg; in pcpu_memcg_post_alloc_hook()
1649 static void pcpu_memcg_free_hook(struct pcpu_chunk *chunk, int off, size_t size) in pcpu_memcg_free_hook() argument
1653 if (unlikely(!chunk->obj_exts)) in pcpu_memcg_free_hook()
1656 objcg = chunk->obj_exts[off >> PCPU_MIN_ALLOC_SHIFT].cgroup; in pcpu_memcg_free_hook()
1659 chunk->obj_exts[off >> PCPU_MIN_ALLOC_SHIFT].cgroup = NULL; in pcpu_memcg_free_hook()
1679 struct pcpu_chunk *chunk, int off, in pcpu_memcg_post_alloc_hook() argument
1684 static void pcpu_memcg_free_hook(struct pcpu_chunk *chunk, int off, size_t size) in pcpu_memcg_free_hook() argument
1690 static void pcpu_alloc_tag_alloc_hook(struct pcpu_chunk *chunk, int off, in pcpu_alloc_tag_alloc_hook() argument
1693 if (mem_alloc_profiling_enabled() && likely(chunk->obj_exts)) { in pcpu_alloc_tag_alloc_hook()
1694 alloc_tag_add(&chunk->obj_exts[off >> PCPU_MIN_ALLOC_SHIFT].tag, in pcpu_alloc_tag_alloc_hook()
1699 static void pcpu_alloc_tag_free_hook(struct pcpu_chunk *chunk, int off, size_t size) in pcpu_alloc_tag_free_hook() argument
1701 if (mem_alloc_profiling_enabled() && likely(chunk->obj_exts)) in pcpu_alloc_tag_free_hook()
1702 alloc_tag_sub(&chunk->obj_exts[off >> PCPU_MIN_ALLOC_SHIFT].tag, size); in pcpu_alloc_tag_free_hook()
1705 static void pcpu_alloc_tag_alloc_hook(struct pcpu_chunk *chunk, int off, in pcpu_alloc_tag_alloc_hook() argument
1710 static void pcpu_alloc_tag_free_hook(struct pcpu_chunk *chunk, int off, size_t size) in pcpu_alloc_tag_free_hook() argument
1738 struct pcpu_chunk *chunk, *next; in pcpu_alloc_noprof() local
1792 chunk = pcpu_reserved_chunk; in pcpu_alloc_noprof()
1794 off = pcpu_find_block_fit(chunk, bits, bit_align, is_atomic); in pcpu_alloc_noprof()
1800 off = pcpu_alloc_area(chunk, bits, bit_align, off); in pcpu_alloc_noprof()
1811 list_for_each_entry_safe(chunk, next, &pcpu_chunk_lists[slot], in pcpu_alloc_noprof()
1813 off = pcpu_find_block_fit(chunk, bits, bit_align, in pcpu_alloc_noprof()
1817 pcpu_chunk_move(chunk, 0); in pcpu_alloc_noprof()
1821 off = pcpu_alloc_area(chunk, bits, bit_align, off); in pcpu_alloc_noprof()
1823 pcpu_reintegrate_chunk(chunk); in pcpu_alloc_noprof()
1838 chunk = pcpu_create_chunk(pcpu_gfp); in pcpu_alloc_noprof()
1839 if (!chunk) { in pcpu_alloc_noprof()
1845 pcpu_chunk_relocate(chunk, -1); in pcpu_alloc_noprof()
1853 pcpu_stats_area_alloc(chunk, size); in pcpu_alloc_noprof()
1867 for_each_clear_bitrange_from(rs, re, chunk->populated, page_end) { in pcpu_alloc_noprof()
1868 WARN_ON(chunk->immutable); in pcpu_alloc_noprof()
1870 ret = pcpu_populate_chunk(chunk, rs, re, pcpu_gfp); in pcpu_alloc_noprof()
1874 pcpu_free_area(chunk, off); in pcpu_alloc_noprof()
1878 pcpu_chunk_populated(chunk, rs, re); in pcpu_alloc_noprof()
1887 memset((void *)pcpu_chunk_addr(chunk, cpu, 0) + off, 0, size); in pcpu_alloc_noprof()
1889 ptr = __addr_to_pcpu_ptr(chunk->base_addr + off); in pcpu_alloc_noprof()
1893 chunk->base_addr, off, ptr, in pcpu_alloc_noprof()
1896 pcpu_memcg_post_alloc_hook(objcg, chunk, off, size); in pcpu_alloc_noprof()
1898 pcpu_alloc_tag_alloc_hook(chunk, off, size); in pcpu_alloc_noprof()
1949 struct pcpu_chunk *chunk, *next; in pcpu_balance_free() local
1957 list_for_each_entry_safe(chunk, next, free_head, list) { in pcpu_balance_free()
1958 WARN_ON(chunk->immutable); in pcpu_balance_free()
1961 if (chunk == list_first_entry(free_head, struct pcpu_chunk, list)) in pcpu_balance_free()
1964 if (!empty_only || chunk->nr_empty_pop_pages == 0) in pcpu_balance_free()
1965 list_move(&chunk->list, &to_free); in pcpu_balance_free()
1972 list_for_each_entry_safe(chunk, next, &to_free, list) { in pcpu_balance_free()
1975 for_each_set_bitrange(rs, re, chunk->populated, chunk->nr_pages) { in pcpu_balance_free()
1976 pcpu_depopulate_chunk(chunk, rs, re); in pcpu_balance_free()
1978 pcpu_chunk_depopulated(chunk, rs, re); in pcpu_balance_free()
1981 pcpu_destroy_chunk(chunk); in pcpu_balance_free()
2003 struct pcpu_chunk *chunk; in pcpu_balance_populated() local
2035 list_for_each_entry(chunk, &pcpu_chunk_lists[slot], list) { in pcpu_balance_populated()
2036 nr_unpop = chunk->nr_pages - chunk->nr_populated; in pcpu_balance_populated()
2045 for_each_clear_bitrange(rs, re, chunk->populated, chunk->nr_pages) { in pcpu_balance_populated()
2049 ret = pcpu_populate_chunk(chunk, rs, rs + nr, gfp); in pcpu_balance_populated()
2054 pcpu_chunk_populated(chunk, rs, rs + nr); in pcpu_balance_populated()
2067 chunk = pcpu_create_chunk(gfp); in pcpu_balance_populated()
2070 if (chunk) { in pcpu_balance_populated()
2071 pcpu_chunk_relocate(chunk, -1); in pcpu_balance_populated()
2094 struct pcpu_chunk *chunk; in pcpu_reclaim_populated() local
2108 while ((chunk = list_first_entry_or_null( in pcpu_reclaim_populated()
2111 WARN_ON(chunk->immutable); in pcpu_reclaim_populated()
2117 freed_page_start = chunk->nr_pages; in pcpu_reclaim_populated()
2120 for (i = chunk->nr_pages - 1, end = -1; i >= 0; i--) { in pcpu_reclaim_populated()
2122 if (chunk->nr_empty_pop_pages == 0) in pcpu_reclaim_populated()
2137 block = chunk->md_blocks + i; in pcpu_reclaim_populated()
2139 test_bit(i, chunk->populated)) { in pcpu_reclaim_populated()
2152 pcpu_depopulate_chunk(chunk, i + 1, end + 1); in pcpu_reclaim_populated()
2156 pcpu_chunk_depopulated(chunk, i + 1, end + 1); in pcpu_reclaim_populated()
2167 pcpu_post_unmap_tlb_flush(chunk, in pcpu_reclaim_populated()
2174 if (reintegrate || chunk->free_bytes == pcpu_unit_size) in pcpu_reclaim_populated()
2175 pcpu_reintegrate_chunk(chunk); in pcpu_reclaim_populated()
2177 list_move_tail(&chunk->list, in pcpu_reclaim_populated()
2229 struct pcpu_chunk *chunk; in free_percpu() local
2240 chunk = pcpu_chunk_addr_search(addr); in free_percpu()
2241 off = addr - chunk->base_addr; in free_percpu()
2244 size = pcpu_free_area(chunk, off); in free_percpu()
2246 pcpu_alloc_tag_free_hook(chunk, off, size); in free_percpu()
2248 pcpu_memcg_free_hook(chunk, off, size); in free_percpu()
2255 if (!chunk->isolated && chunk->free_bytes == pcpu_unit_size) { in free_percpu()
2259 if (pos != chunk) { in free_percpu()
2263 } else if (pcpu_should_reclaim_chunk(chunk)) { in free_percpu()
2264 pcpu_isolate_chunk(chunk); in free_percpu()
2268 trace_percpu_free_percpu(chunk->base_addr, off, ptr); in free_percpu()