Lines Matching full:ai

1583 static int __init pcpu_verify_alloc_info(const struct pcpu_alloc_info *ai);
2447 * Allocate ai which is large enough for @nr_groups groups containing
2448 * @nr_units units. The returned ai's groups[0].cpu_map points to the
2460 struct pcpu_alloc_info *ai; in pcpu_alloc_alloc_info() local
2465 base_size = ALIGN(struct_size(ai, groups, nr_groups), in pcpu_alloc_alloc_info()
2466 __alignof__(ai->groups[0].cpu_map[0])); in pcpu_alloc_alloc_info()
2467 ai_size = base_size + nr_units * sizeof(ai->groups[0].cpu_map[0]); in pcpu_alloc_alloc_info()
2472 ai = ptr; in pcpu_alloc_alloc_info()
2475 ai->groups[0].cpu_map = ptr; in pcpu_alloc_alloc_info()
2478 ai->groups[0].cpu_map[unit] = NR_CPUS; in pcpu_alloc_alloc_info()
2480 ai->nr_groups = nr_groups; in pcpu_alloc_alloc_info()
2481 ai->__ai_size = PFN_ALIGN(ai_size); in pcpu_alloc_alloc_info()
2483 return ai; in pcpu_alloc_alloc_info()
2488 * @ai: pcpu_alloc_info to free
2490 * Free @ai which was allocated by pcpu_alloc_alloc_info().
2492 void __init pcpu_free_alloc_info(struct pcpu_alloc_info *ai) in pcpu_free_alloc_info() argument
2494 memblock_free(ai, ai->__ai_size); in pcpu_free_alloc_info()
2500 * @ai: allocation info to dump
2502 * Print out information about @ai using loglevel @lvl.
2505 const struct pcpu_alloc_info *ai) in pcpu_dump_alloc_info() argument
2513 v = ai->nr_groups; in pcpu_dump_alloc_info()
2522 upa = ai->alloc_size / ai->unit_size; in pcpu_dump_alloc_info()
2527 lvl, ai->static_size, ai->reserved_size, ai->dyn_size, in pcpu_dump_alloc_info()
2528 ai->unit_size, ai->alloc_size / ai->atom_size, ai->atom_size); in pcpu_dump_alloc_info()
2530 for (group = 0; group < ai->nr_groups; group++) { in pcpu_dump_alloc_info()
2531 const struct pcpu_group_info *gi = &ai->groups[group]; in pcpu_dump_alloc_info()
2556 * @ai: pcpu_alloc_info describing how to percpu area is shaped
2563 * @ai contains all information necessary to initialize the first
2566 * @ai->static_size is the size of static percpu area.
2568 * @ai->reserved_size, if non-zero, specifies the amount of bytes to
2576 * @ai->dyn_size determines the number of bytes available for dynamic
2577 * allocation in the first chunk. The area between @ai->static_size +
2578 * @ai->reserved_size + @ai->dyn_size and @ai->unit_size is unused.
2580 * @ai->unit_size specifies unit size and must be aligned to PAGE_SIZE
2581 * and equal to or larger than @ai->static_size + @ai->reserved_size +
2582 * @ai->dyn_size.
2584 * @ai->atom_size is the allocation atom size and used as alignment
2587 * @ai->alloc_size is the allocation size and always multiple of
2588 * @ai->atom_size. This is larger than @ai->atom_size if
2589 * @ai->unit_size is larger than @ai->atom_size.
2591 * @ai->nr_groups and @ai->groups describe virtual memory layout of
2594 * groupings. If @ai->nr_groups is zero, a single group containing
2608 void __init pcpu_setup_first_chunk(const struct pcpu_alloc_info *ai, in pcpu_setup_first_chunk() argument
2611 size_t size_sum = ai->static_size + ai->reserved_size + ai->dyn_size; in pcpu_setup_first_chunk()
2627 pcpu_dump_alloc_info(KERN_EMERG, ai); \ in pcpu_setup_first_chunk()
2633 PCPU_SETUP_BUG_ON(ai->nr_groups <= 0); in pcpu_setup_first_chunk()
2635 PCPU_SETUP_BUG_ON(!ai->static_size); in pcpu_setup_first_chunk()
2640 PCPU_SETUP_BUG_ON(ai->unit_size < size_sum); in pcpu_setup_first_chunk()
2641 PCPU_SETUP_BUG_ON(offset_in_page(ai->unit_size)); in pcpu_setup_first_chunk()
2642 PCPU_SETUP_BUG_ON(ai->unit_size < PCPU_MIN_UNIT_SIZE); in pcpu_setup_first_chunk()
2643 PCPU_SETUP_BUG_ON(!IS_ALIGNED(ai->unit_size, PCPU_BITMAP_BLOCK_SIZE)); in pcpu_setup_first_chunk()
2644 PCPU_SETUP_BUG_ON(ai->dyn_size < PERCPU_DYNAMIC_EARLY_SIZE); in pcpu_setup_first_chunk()
2645 PCPU_SETUP_BUG_ON(!IS_ALIGNED(ai->reserved_size, PCPU_MIN_ALLOC_SIZE)); in pcpu_setup_first_chunk()
2648 PCPU_SETUP_BUG_ON(pcpu_verify_alloc_info(ai) < 0); in pcpu_setup_first_chunk()
2651 alloc_size = ai->nr_groups * sizeof(group_offsets[0]); in pcpu_setup_first_chunk()
2657 alloc_size = ai->nr_groups * sizeof(group_sizes[0]); in pcpu_setup_first_chunk()
2681 for (group = 0, unit = 0; group < ai->nr_groups; group++, unit += i) { in pcpu_setup_first_chunk()
2682 const struct pcpu_group_info *gi = &ai->groups[group]; in pcpu_setup_first_chunk()
2685 group_sizes[group] = gi->nr_units * ai->unit_size; in pcpu_setup_first_chunk()
2697 unit_off[cpu] = gi->base_offset + i * ai->unit_size; in pcpu_setup_first_chunk()
2715 pcpu_dump_alloc_info(KERN_DEBUG, ai); in pcpu_setup_first_chunk()
2717 pcpu_nr_groups = ai->nr_groups; in pcpu_setup_first_chunk()
2724 pcpu_unit_pages = ai->unit_size >> PAGE_SHIFT; in pcpu_setup_first_chunk()
2726 pcpu_atom_size = ai->atom_size; in pcpu_setup_first_chunk()
2730 pcpu_stats_save_ai(ai); in pcpu_setup_first_chunk()
2760 static_size = ALIGN(ai->static_size, PCPU_MIN_ALLOC_SIZE); in pcpu_setup_first_chunk()
2761 dyn_size = ai->dyn_size - (static_size - ai->static_size); in pcpu_setup_first_chunk()
2775 if (ai->reserved_size) in pcpu_setup_first_chunk()
2777 ai->reserved_size); in pcpu_setup_first_chunk()
2778 tmp_addr = (unsigned long)base_addr + static_size + ai->reserved_size; in pcpu_setup_first_chunk()
2878 struct pcpu_alloc_info *ai; in pcpu_build_alloc_info() local
2968 ai = pcpu_alloc_alloc_info(nr_groups, nr_units); in pcpu_build_alloc_info()
2969 if (!ai) in pcpu_build_alloc_info()
2971 cpu_map = ai->groups[0].cpu_map; in pcpu_build_alloc_info()
2974 ai->groups[group].cpu_map = cpu_map; in pcpu_build_alloc_info()
2978 ai->static_size = static_size; in pcpu_build_alloc_info()
2979 ai->reserved_size = reserved_size; in pcpu_build_alloc_info()
2980 ai->dyn_size = dyn_size; in pcpu_build_alloc_info()
2981 ai->unit_size = alloc_size / upa; in pcpu_build_alloc_info()
2982 ai->atom_size = atom_size; in pcpu_build_alloc_info()
2983 ai->alloc_size = alloc_size; in pcpu_build_alloc_info()
2986 struct pcpu_group_info *gi = &ai->groups[group]; in pcpu_build_alloc_info()
2993 gi->base_offset = unit * ai->unit_size; in pcpu_build_alloc_info()
3003 return ai; in pcpu_build_alloc_info()
3082 struct pcpu_alloc_info *ai; in pcpu_embed_first_chunk() local
3087 ai = pcpu_build_alloc_info(reserved_size, dyn_size, atom_size, in pcpu_embed_first_chunk()
3089 if (IS_ERR(ai)) in pcpu_embed_first_chunk()
3090 return PTR_ERR(ai); in pcpu_embed_first_chunk()
3092 size_sum = ai->static_size + ai->reserved_size + ai->dyn_size; in pcpu_embed_first_chunk()
3093 areas_size = PFN_ALIGN(ai->nr_groups * sizeof(void *)); in pcpu_embed_first_chunk()
3103 for (group = 0; group < ai->nr_groups; group++) { in pcpu_embed_first_chunk()
3104 struct pcpu_group_info *gi = &ai->groups[group]; in pcpu_embed_first_chunk()
3113 ptr = pcpu_fc_alloc(cpu, gi->nr_units * ai->unit_size, atom_size, cpu_to_nd_fn); in pcpu_embed_first_chunk()
3127 max_distance += ai->unit_size * ai->groups[highest_group].nr_units; in pcpu_embed_first_chunk()
3145 for (group = 0; group < ai->nr_groups; group++) { in pcpu_embed_first_chunk()
3146 struct pcpu_group_info *gi = &ai->groups[group]; in pcpu_embed_first_chunk()
3149 for (i = 0; i < gi->nr_units; i++, ptr += ai->unit_size) { in pcpu_embed_first_chunk()
3152 pcpu_fc_free(ptr, ai->unit_size); in pcpu_embed_first_chunk()
3156 memcpy(ptr, __per_cpu_load, ai->static_size); in pcpu_embed_first_chunk()
3157 pcpu_fc_free(ptr + size_sum, ai->unit_size - size_sum); in pcpu_embed_first_chunk()
3162 for (group = 0; group < ai->nr_groups; group++) { in pcpu_embed_first_chunk()
3163 ai->groups[group].base_offset = areas[group] - base; in pcpu_embed_first_chunk()
3167 PFN_DOWN(size_sum), ai->static_size, ai->reserved_size, in pcpu_embed_first_chunk()
3168 ai->dyn_size, ai->unit_size); in pcpu_embed_first_chunk()
3170 pcpu_setup_first_chunk(ai, base); in pcpu_embed_first_chunk()
3174 for (group = 0; group < ai->nr_groups; group++) in pcpu_embed_first_chunk()
3177 ai->groups[group].nr_units * ai->unit_size); in pcpu_embed_first_chunk()
3179 pcpu_free_alloc_info(ai); in pcpu_embed_first_chunk()
3267 struct pcpu_alloc_info *ai; in pcpu_page_first_chunk() local
3278 ai = pcpu_build_alloc_info(reserved_size, 0, PAGE_SIZE, NULL); in pcpu_page_first_chunk()
3279 if (IS_ERR(ai)) in pcpu_page_first_chunk()
3280 return PTR_ERR(ai); in pcpu_page_first_chunk()
3281 BUG_ON(ai->nr_groups != 1); in pcpu_page_first_chunk()
3282 upa = ai->alloc_size/ai->unit_size; in pcpu_page_first_chunk()
3284 if (WARN_ON(ai->groups[0].nr_units != nr_g0_units)) { in pcpu_page_first_chunk()
3285 pcpu_free_alloc_info(ai); in pcpu_page_first_chunk()
3289 unit_pages = ai->unit_size >> PAGE_SHIFT; in pcpu_page_first_chunk()
3302 unsigned int cpu = ai->groups[0].cpu_map[unit]; in pcpu_page_first_chunk()
3320 vm.size = num_possible_cpus() * ai->unit_size; in pcpu_page_first_chunk()
3325 (unsigned long)vm.addr + unit * ai->unit_size; in pcpu_page_first_chunk()
3336 flush_cache_vmap_early(unit_addr, unit_addr + ai->unit_size); in pcpu_page_first_chunk()
3339 memcpy((void *)unit_addr, __per_cpu_load, ai->static_size); in pcpu_page_first_chunk()
3344 unit_pages, psize_str, ai->static_size, in pcpu_page_first_chunk()
3345 ai->reserved_size, ai->dyn_size); in pcpu_page_first_chunk()
3347 pcpu_setup_first_chunk(ai, vm.addr); in pcpu_page_first_chunk()
3356 pcpu_free_alloc_info(ai); in pcpu_page_first_chunk()
3412 struct pcpu_alloc_info *ai; in setup_per_cpu_areas() local
3415 ai = pcpu_alloc_alloc_info(1, 1); in setup_per_cpu_areas()
3417 if (!ai || !fc) in setup_per_cpu_areas()
3422 ai->dyn_size = unit_size; in setup_per_cpu_areas()
3423 ai->unit_size = unit_size; in setup_per_cpu_areas()
3424 ai->atom_size = unit_size; in setup_per_cpu_areas()
3425 ai->alloc_size = unit_size; in setup_per_cpu_areas()
3426 ai->groups[0].nr_units = 1; in setup_per_cpu_areas()
3427 ai->groups[0].cpu_map[0] = 0; in setup_per_cpu_areas()
3429 pcpu_setup_first_chunk(ai, fc); in setup_per_cpu_areas()
3430 pcpu_free_alloc_info(ai); in setup_per_cpu_areas()