aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--mm/percpu.c16
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);