diff options
-rw-r--r-- | mm/percpu.c | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/mm/percpu.c b/mm/percpu.c index 9903830aaebb..e2737e56b017 100644 --- a/mm/percpu.c +++ b/mm/percpu.c | |||
@@ -1961,7 +1961,8 @@ int __init pcpu_embed_first_chunk(size_t reserved_size, size_t dyn_size, | |||
1961 | void *base = (void *)ULONG_MAX; | 1961 | void *base = (void *)ULONG_MAX; |
1962 | void **areas = NULL; | 1962 | void **areas = NULL; |
1963 | struct pcpu_alloc_info *ai; | 1963 | struct pcpu_alloc_info *ai; |
1964 | size_t size_sum, areas_size, max_distance; | 1964 | size_t size_sum, areas_size; |
1965 | unsigned long max_distance; | ||
1965 | int group, i, rc; | 1966 | int group, i, rc; |
1966 | 1967 | ||
1967 | ai = pcpu_build_alloc_info(reserved_size, dyn_size, atom_size, | 1968 | ai = pcpu_build_alloc_info(reserved_size, dyn_size, atom_size, |
@@ -2023,17 +2024,18 @@ int __init pcpu_embed_first_chunk(size_t reserved_size, size_t dyn_size, | |||
2023 | } | 2024 | } |
2024 | 2025 | ||
2025 | /* base address is now known, determine group base offsets */ | 2026 | /* base address is now known, determine group base offsets */ |
2026 | max_distance = 0; | 2027 | i = 0; |
2027 | for (group = 0; group < ai->nr_groups; group++) { | 2028 | for (group = 0; group < ai->nr_groups; group++) { |
2028 | ai->groups[group].base_offset = areas[group] - base; | 2029 | ai->groups[group].base_offset = areas[group] - base; |
2029 | max_distance = max_t(size_t, max_distance, | 2030 | if (areas[group] > areas[i]) |
2030 | ai->groups[group].base_offset); | 2031 | i = group; |
2031 | } | 2032 | } |
2032 | max_distance += ai->unit_size; | 2033 | max_distance = ai->groups[i].base_offset + |
2034 | ai->unit_size * ai->groups[i].nr_units; | ||
2033 | 2035 | ||
2034 | /* warn if maximum distance is further than 75% of vmalloc space */ | 2036 | /* warn if maximum distance is further than 75% of vmalloc space */ |
2035 | if (max_distance > VMALLOC_TOTAL * 3 / 4) { | 2037 | if (max_distance > VMALLOC_TOTAL * 3 / 4) { |
2036 | pr_warn("max_distance=0x%zx too large for vmalloc space 0x%lx\n", | 2038 | pr_warn("max_distance=0x%lx too large for vmalloc space 0x%lx\n", |
2037 | max_distance, VMALLOC_TOTAL); | 2039 | max_distance, VMALLOC_TOTAL); |
2038 | #ifdef CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK | 2040 | #ifdef CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK |
2039 | /* and fail if we have fallback */ | 2041 | /* and fail if we have fallback */ |