summaryrefslogtreecommitdiffstats
path: root/mm/percpu.c
diff options
context:
space:
mode:
authorDennis Zhou (Facebook) <dennisszhou@gmail.com>2017-07-24 19:02:03 -0400
committerTejun Heo <tj@kernel.org>2017-07-26 10:23:52 -0400
commit6b9d7c8e8ecf35dc9ba6763a45d81e54ee3ffcde (patch)
tree840107bd729b045342ff0296aefa8e017aae173c /mm/percpu.c
parent10edf5b0b6e238f9102c88df8b92ba7ce8fdcc46 (diff)
percpu: end chunk area maps page aligned for the populated bitmap
The area map allocator manages the first chunk area by hiding all but the region it is responsible for serving in the area map. To align this with the populated page bitmap, end_offset is introduced to keep track of the delta to end page aligned. The area map is appended with the page aligned end when necessary to be in line with how the bitmap allocator requires the ending to be aligned with the LCM of PAGE_SIZE and the size of each bitmap block. percpu_stats is updated to ignore this region when present. Signed-off-by: Dennis Zhou <dennisszhou@gmail.com> Reviewed-by: Josef Bacik <jbacik@fb.com> Signed-off-by: Tejun Heo <tj@kernel.org>
Diffstat (limited to 'mm/percpu.c')
-rw-r--r--mm/percpu.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/mm/percpu.c b/mm/percpu.c
index 2e785a77ce14..1d2c980fde3f 100644
--- a/mm/percpu.c
+++ b/mm/percpu.c
@@ -715,12 +715,16 @@ static struct pcpu_chunk * __init pcpu_alloc_first_chunk(void *base_addr,
715 int init_map_size) 715 int init_map_size)
716{ 716{
717 struct pcpu_chunk *chunk; 717 struct pcpu_chunk *chunk;
718 int region_size;
719
720 region_size = PFN_ALIGN(start_offset + map_size);
718 721
719 chunk = memblock_virt_alloc(pcpu_chunk_struct_size, 0); 722 chunk = memblock_virt_alloc(pcpu_chunk_struct_size, 0);
720 INIT_LIST_HEAD(&chunk->list); 723 INIT_LIST_HEAD(&chunk->list);
721 INIT_LIST_HEAD(&chunk->map_extend_list); 724 INIT_LIST_HEAD(&chunk->map_extend_list);
722 chunk->base_addr = base_addr; 725 chunk->base_addr = base_addr;
723 chunk->start_offset = start_offset; 726 chunk->start_offset = start_offset;
727 chunk->end_offset = region_size - chunk->start_offset - map_size;
724 chunk->map = map; 728 chunk->map = map;
725 chunk->map_alloc = init_map_size; 729 chunk->map_alloc = init_map_size;
726 730
@@ -735,6 +739,11 @@ static struct pcpu_chunk * __init pcpu_alloc_first_chunk(void *base_addr,
735 chunk->map[2] = (chunk->start_offset + chunk->free_size) | 1; 739 chunk->map[2] = (chunk->start_offset + chunk->free_size) | 1;
736 chunk->map_used = 2; 740 chunk->map_used = 2;
737 741
742 if (chunk->end_offset) {
743 /* hide the end of the bitmap */
744 chunk->map[++chunk->map_used] = region_size | 1;
745 }
746
738 return chunk; 747 return chunk;
739} 748}
740 749