diff options
Diffstat (limited to 'mm/percpu.c')
-rw-r--r-- | mm/percpu.c | 16 |
1 files changed, 9 insertions, 7 deletions
diff --git a/mm/percpu.c b/mm/percpu.c index 5b1fcefdc386..773dafea181e 100644 --- a/mm/percpu.c +++ b/mm/percpu.c | |||
@@ -737,7 +737,9 @@ static struct pcpu_chunk * __init pcpu_alloc_first_chunk(unsigned long tmp_addr, | |||
737 | region_size = PFN_ALIGN(start_offset + map_size); | 737 | region_size = PFN_ALIGN(start_offset + map_size); |
738 | 738 | ||
739 | /* allocate chunk */ | 739 | /* allocate chunk */ |
740 | chunk = memblock_virt_alloc(pcpu_chunk_struct_size, 0); | 740 | chunk = memblock_virt_alloc(sizeof(struct pcpu_chunk) + |
741 | BITS_TO_LONGS(region_size >> PAGE_SHIFT), | ||
742 | 0); | ||
741 | 743 | ||
742 | INIT_LIST_HEAD(&chunk->list); | 744 | INIT_LIST_HEAD(&chunk->list); |
743 | INIT_LIST_HEAD(&chunk->map_extend_list); | 745 | INIT_LIST_HEAD(&chunk->map_extend_list); |
@@ -746,15 +748,15 @@ static struct pcpu_chunk * __init pcpu_alloc_first_chunk(unsigned long tmp_addr, | |||
746 | chunk->start_offset = start_offset; | 748 | chunk->start_offset = start_offset; |
747 | chunk->end_offset = region_size - chunk->start_offset - map_size; | 749 | chunk->end_offset = region_size - chunk->start_offset - map_size; |
748 | 750 | ||
749 | chunk->nr_pages = pcpu_unit_pages; | 751 | chunk->nr_pages = region_size >> PAGE_SHIFT; |
750 | 752 | ||
751 | chunk->map = map; | 753 | chunk->map = map; |
752 | chunk->map_alloc = init_map_size; | 754 | chunk->map_alloc = init_map_size; |
753 | 755 | ||
754 | /* manage populated page bitmap */ | 756 | /* manage populated page bitmap */ |
755 | chunk->immutable = true; | 757 | chunk->immutable = true; |
756 | bitmap_fill(chunk->populated, pcpu_unit_pages); | 758 | bitmap_fill(chunk->populated, chunk->nr_pages); |
757 | chunk->nr_populated = pcpu_unit_pages; | 759 | chunk->nr_populated = chunk->nr_pages; |
758 | 760 | ||
759 | chunk->contig_hint = chunk->free_size = map_size; | 761 | chunk->contig_hint = chunk->free_size = map_size; |
760 | 762 | ||
@@ -1212,7 +1214,7 @@ static void pcpu_balance_workfn(struct work_struct *work) | |||
1212 | list_for_each_entry_safe(chunk, next, &to_free, list) { | 1214 | list_for_each_entry_safe(chunk, next, &to_free, list) { |
1213 | int rs, re; | 1215 | int rs, re; |
1214 | 1216 | ||
1215 | pcpu_for_each_pop_region(chunk, rs, re, 0, pcpu_unit_pages) { | 1217 | pcpu_for_each_pop_region(chunk, rs, re, 0, chunk->nr_pages) { |
1216 | pcpu_depopulate_chunk(chunk, rs, re); | 1218 | pcpu_depopulate_chunk(chunk, rs, re); |
1217 | spin_lock_irq(&pcpu_lock); | 1219 | spin_lock_irq(&pcpu_lock); |
1218 | pcpu_chunk_depopulated(chunk, rs, re); | 1220 | pcpu_chunk_depopulated(chunk, rs, re); |
@@ -1269,7 +1271,7 @@ retry_pop: | |||
1269 | 1271 | ||
1270 | spin_lock_irq(&pcpu_lock); | 1272 | spin_lock_irq(&pcpu_lock); |
1271 | list_for_each_entry(chunk, &pcpu_slot[slot], list) { | 1273 | list_for_each_entry(chunk, &pcpu_slot[slot], list) { |
1272 | nr_unpop = pcpu_unit_pages - chunk->nr_populated; | 1274 | nr_unpop = chunk->nr_pages - chunk->nr_populated; |
1273 | if (nr_unpop) | 1275 | if (nr_unpop) |
1274 | break; | 1276 | break; |
1275 | } | 1277 | } |
@@ -1279,7 +1281,7 @@ retry_pop: | |||
1279 | continue; | 1281 | continue; |
1280 | 1282 | ||
1281 | /* @chunk can't go away while pcpu_alloc_mutex is held */ | 1283 | /* @chunk can't go away while pcpu_alloc_mutex is held */ |
1282 | pcpu_for_each_unpop_region(chunk, rs, re, 0, pcpu_unit_pages) { | 1284 | pcpu_for_each_unpop_region(chunk, rs, re, 0, chunk->nr_pages) { |
1283 | int nr = min(re - rs, nr_to_pop); | 1285 | int nr = min(re - rs, nr_to_pop); |
1284 | 1286 | ||
1285 | ret = pcpu_populate_chunk(chunk, rs, rs + nr); | 1287 | ret = pcpu_populate_chunk(chunk, rs, rs + nr); |