1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56#include <linux/bitmap.h>
57#include <linux/bootmem.h>
58#include <linux/err.h>
59#include <linux/list.h>
60#include <linux/log2.h>
61#include <linux/mm.h>
62#include <linux/module.h>
63#include <linux/mutex.h>
64#include <linux/percpu.h>
65#include <linux/pfn.h>
66#include <linux/slab.h>
67#include <linux/spinlock.h>
68#include <linux/vmalloc.h>
69#include <linux/workqueue.h>
70
71#include <asm/cacheflush.h>
72#include <asm/sections.h>
73#include <asm/tlbflush.h>
74#include <asm/io.h>
75
76#define PCPU_SLOT_BASE_SHIFT 5
77#define PCPU_DFL_MAP_ALLOC 16
78
79#ifdef CONFIG_SMP
80
81#ifndef __addr_to_pcpu_ptr
82#define __addr_to_pcpu_ptr(addr) \
83 (void __percpu *)((unsigned long)(addr) - \
84 (unsigned long)pcpu_base_addr + \
85 (unsigned long)__per_cpu_start)
86#endif
87#ifndef __pcpu_ptr_to_addr
88#define __pcpu_ptr_to_addr(ptr) \
89 (void __force *)((unsigned long)(ptr) + \
90 (unsigned long)pcpu_base_addr - \
91 (unsigned long)__per_cpu_start)
92#endif
93#else
94
95#define __addr_to_pcpu_ptr(addr) (void __percpu *)(addr)
96#define __pcpu_ptr_to_addr(ptr) (void __force *)(ptr)
97#endif
98
99struct pcpu_chunk {
100 struct list_head list;
101 int free_size;
102 int contig_hint;
103 void *base_addr;
104 int map_used;
105 int map_alloc;
106 int *map;
107 void *data;
108 bool immutable;
109 unsigned long populated[];
110};
111
112static int pcpu_unit_pages __read_mostly;
113static int pcpu_unit_size __read_mostly;
114static int pcpu_nr_units __read_mostly;
115static int pcpu_atom_size __read_mostly;
116static int pcpu_nr_slots __read_mostly;
117static size_t pcpu_chunk_struct_size __read_mostly;
118
119
120static unsigned int pcpu_low_unit_cpu __read_mostly;
121static unsigned int pcpu_high_unit_cpu __read_mostly;
122
123
124void *pcpu_base_addr __read_mostly;
125EXPORT_SYMBOL_GPL(pcpu_base_addr);
126
127static const int *pcpu_unit_map __read_mostly;
128const unsigned long *pcpu_unit_offsets __read_mostly;
129
130
131static int pcpu_nr_groups __read_mostly;
132static const unsigned long *pcpu_group_offsets __read_mostly;
133static const size_t *pcpu_group_sizes __read_mostly;
134
135
136
137
138
139
140static struct pcpu_chunk *pcpu_first_chunk;
141
142
143
144
145
146
147
148
149static struct pcpu_chunk *pcpu_reserved_chunk;
150static int pcpu_reserved_chunk_limit;
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176static DEFINE_MUTEX(pcpu_alloc_mutex);
177static DEFINE_SPINLOCK(pcpu_lock);
178
179static struct list_head *pcpu_slot __read_mostly;
180
181
182static void pcpu_reclaim(struct work_struct *work);
183static DECLARE_WORK(pcpu_reclaim_work, pcpu_reclaim);
184
185static bool pcpu_addr_in_first_chunk(void *addr)
186{
187 void *first_start = pcpu_first_chunk->base_addr;
188
189 return addr >= first_start && addr < first_start + pcpu_unit_size;
190}
191
192static bool pcpu_addr_in_reserved_chunk(void *addr)
193{
194 void *first_start = pcpu_first_chunk->base_addr;
195
196 return addr >= first_start &&
197 addr < first_start + pcpu_reserved_chunk_limit;
198}
199
200static int __pcpu_size_to_slot(int size)
201{
202 int highbit = fls(size);
203 return max(highbit - PCPU_SLOT_BASE_SHIFT + 2, 1);
204}
205
206static int pcpu_size_to_slot(int size)
207{
208 if (size == pcpu_unit_size)
209 return pcpu_nr_slots - 1;
210 return __pcpu_size_to_slot(size);
211}
212
213static int pcpu_chunk_slot(const struct pcpu_chunk *chunk)
214{
215 if (chunk->free_size < sizeof(int) || chunk->contig_hint < sizeof(int))
216 return 0;
217
218 return pcpu_size_to_slot(chunk->free_size);
219}
220
221
222static void pcpu_set_page_chunk(struct page *page, struct pcpu_chunk *pcpu)
223{
224 page->index = (unsigned long)pcpu;
225}
226
227
228static struct pcpu_chunk *pcpu_get_page_chunk(struct page *page)
229{
230 return (struct pcpu_chunk *)page->index;
231}
232
233static int __maybe_unused pcpu_page_idx(unsigned int cpu, int page_idx)
234{
235 return pcpu_unit_map[cpu] * pcpu_unit_pages + page_idx;
236}
237
238static unsigned long pcpu_chunk_addr(struct pcpu_chunk *chunk,
239 unsigned int cpu, int page_idx)
240{
241 return (unsigned long)chunk->base_addr + pcpu_unit_offsets[cpu] +
242 (page_idx << PAGE_SHIFT);
243}
244
245static void __maybe_unused pcpu_next_unpop(struct pcpu_chunk *chunk,
246 int *rs, int *re, int end)
247{
248 *rs = find_next_zero_bit(chunk->populated, end, *rs);
249 *re = find_next_bit(chunk->populated, end, *rs + 1);
250}
251
252static void __maybe_unused pcpu_next_pop(struct pcpu_chunk *chunk,
253 int *rs, int *re, int end)
254{
255 *rs = find_next_bit(chunk->populated, end, *rs);
256 *re = find_next_zero_bit(chunk->populated, end, *rs + 1);
257}
258
259
260
261
262
263
264
265#define pcpu_for_each_unpop_region(chunk, rs, re, start, end) \
266 for ((rs) = (start), pcpu_next_unpop((chunk), &(rs), &(re), (end)); \
267 (rs) < (re); \
268 (rs) = (re) + 1, pcpu_next_unpop((chunk), &(rs), &(re), (end)))
269
270#define pcpu_for_each_pop_region(chunk, rs, re, start, end) \
271 for ((rs) = (start), pcpu_next_pop((chunk), &(rs), &(re), (end)); \
272 (rs) < (re); \
273 (rs) = (re) + 1, pcpu_next_pop((chunk), &(rs), &(re), (end)))
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289static void *pcpu_mem_alloc(size_t size)
290{
291 if (WARN_ON_ONCE(!slab_is_available()))
292 return NULL;
293
294 if (size <= PAGE_SIZE)
295 return kzalloc(size, GFP_KERNEL);
296 else
297 return vzalloc(size);
298}
299
300
301
302
303
304
305
306
307static void pcpu_mem_free(void *ptr, size_t size)
308{
309 if (size <= PAGE_SIZE)
310 kfree(ptr);
311 else
312 vfree(ptr);
313}
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328static void pcpu_chunk_relocate(struct pcpu_chunk *chunk, int oslot)
329{
330 int nslot = pcpu_chunk_slot(chunk);
331
332 if (chunk != pcpu_reserved_chunk && oslot != nslot) {
333 if (oslot < nslot)
334 list_move(&chunk->list, &pcpu_slot[nslot]);
335 else
336 list_move_tail(&chunk->list, &pcpu_slot[nslot]);
337 }
338}
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354static int pcpu_need_to_extend(struct pcpu_chunk *chunk)
355{
356 int new_alloc;
357
358 if (chunk->map_alloc >= chunk->map_used + 2)
359 return 0;
360
361 new_alloc = PCPU_DFL_MAP_ALLOC;
362 while (new_alloc < chunk->map_used + 2)
363 new_alloc *= 2;
364
365 return new_alloc;
366}
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381static int pcpu_extend_area_map(struct pcpu_chunk *chunk, int new_alloc)
382{
383 int *old = NULL, *new = NULL;
384 size_t old_size = 0, new_size = new_alloc * sizeof(new[0]);
385 unsigned long flags;
386
387 new = pcpu_mem_alloc(new_size);
388 if (!new)
389 return -ENOMEM;
390
391
392 spin_lock_irqsave(&pcpu_lock, flags);
393
394 if (new_alloc <= chunk->map_alloc)
395 goto out_unlock;
396
397 old_size = chunk->map_alloc * sizeof(chunk->map[0]);
398 old = chunk->map;
399
400 memcpy(new, old, old_size);
401
402 chunk->map_alloc = new_alloc;
403 chunk->map = new;
404 new = NULL;
405
406out_unlock:
407 spin_unlock_irqrestore(&pcpu_lock, flags);
408
409
410
411
412
413 pcpu_mem_free(old, old_size);
414 pcpu_mem_free(new, new_size);
415
416 return 0;
417}
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439static void pcpu_split_block(struct pcpu_chunk *chunk, int i,
440 int head, int tail)
441{
442 int nr_extra = !!head + !!tail;
443
444 BUG_ON(chunk->map_alloc < chunk->map_used + nr_extra);
445
446
447 memmove(&chunk->map[i + nr_extra], &chunk->map[i],
448 sizeof(chunk->map[0]) * (chunk->map_used - i));
449 chunk->map_used += nr_extra;
450
451 if (head) {
452 chunk->map[i + 1] = chunk->map[i] - head;
453 chunk->map[i++] = head;
454 }
455 if (tail) {
456 chunk->map[i++] -= tail;
457 chunk->map[i] = tail;
458 }
459}
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480static int pcpu_alloc_area(struct pcpu_chunk *chunk, int size, int align)
481{
482 int oslot = pcpu_chunk_slot(chunk);
483 int max_contig = 0;
484 int i, off;
485
486 for (i = 0, off = 0; i < chunk->map_used; off += abs(chunk->map[i++])) {
487 bool is_last = i + 1 == chunk->map_used;
488 int head, tail;
489
490
491 head = ALIGN(off, align) - off;
492 BUG_ON(i == 0 && head != 0);
493
494 if (chunk->map[i] < 0)
495 continue;
496 if (chunk->map[i] < head + size) {
497 max_contig = max(chunk->map[i], max_contig);
498 continue;
499 }
500
501
502
503
504
505
506
507 if (head && (head < sizeof(int) || chunk->map[i - 1] > 0)) {
508 if (chunk->map[i - 1] > 0)
509 chunk->map[i - 1] += head;
510 else {
511 chunk->map[i - 1] -= head;
512 chunk->free_size -= head;
513 }
514 chunk->map[i] -= head;
515 off += head;
516 head = 0;
517 }
518
519
520 tail = chunk->map[i] - head - size;
521 if (tail < sizeof(int))
522 tail = 0;
523
524
525 if (head || tail) {
526 pcpu_split_block(chunk, i, head, tail);
527 if (head) {
528 i++;
529 off += head;
530 max_contig = max(chunk->map[i - 1], max_contig);
531 }
532 if (tail)
533 max_contig = max(chunk->map[i + 1], max_contig);
534 }
535
536
537 if (is_last)
538 chunk->contig_hint = max_contig;
539 else
540 chunk->contig_hint = max(chunk->contig_hint,
541 max_contig);
542
543 chunk->free_size -= chunk->map[i];
544 chunk->map[i] = -chunk->map[i];
545
546 pcpu_chunk_relocate(chunk, oslot);
547 return off;
548 }
549
550 chunk->contig_hint = max_contig;
551 pcpu_chunk_relocate(chunk, oslot);
552
553
554 return -1;
555}
556
557
558
559
560
561
562
563
564
565
566
567
568
569static void pcpu_free_area(struct pcpu_chunk *chunk, int freeme)
570{
571 int oslot = pcpu_chunk_slot(chunk);
572 int i, off;
573
574 for (i = 0, off = 0; i < chunk->map_used; off += abs(chunk->map[i++]))
575 if (off == freeme)
576 break;
577 BUG_ON(off != freeme);
578 BUG_ON(chunk->map[i] > 0);
579
580 chunk->map[i] = -chunk->map[i];
581 chunk->free_size += chunk->map[i];
582
583
584 if (i > 0 && chunk->map[i - 1] >= 0) {
585 chunk->map[i - 1] += chunk->map[i];
586 chunk->map_used--;
587 memmove(&chunk->map[i], &chunk->map[i + 1],
588 (chunk->map_used - i) * sizeof(chunk->map[0]));
589 i--;
590 }
591
592 if (i + 1 < chunk->map_used && chunk->map[i + 1] >= 0) {
593 chunk->map[i] += chunk->map[i + 1];
594 chunk->map_used--;
595 memmove(&chunk->map[i + 1], &chunk->map[i + 2],
596 (chunk->map_used - (i + 1)) * sizeof(chunk->map[0]));
597 }
598
599 chunk->contig_hint = max(chunk->map[i], chunk->contig_hint);
600 pcpu_chunk_relocate(chunk, oslot);
601}
602
603static struct pcpu_chunk *pcpu_alloc_chunk(void)
604{
605 struct pcpu_chunk *chunk;
606
607 chunk = pcpu_mem_alloc(pcpu_chunk_struct_size);
608 if (!chunk)
609 return NULL;
610
611 chunk->map = pcpu_mem_alloc(PCPU_DFL_MAP_ALLOC * sizeof(chunk->map[0]));
612 if (!chunk->map) {
613 kfree(chunk);
614 return NULL;
615 }
616
617 chunk->map_alloc = PCPU_DFL_MAP_ALLOC;
618 chunk->map[chunk->map_used++] = pcpu_unit_size;
619
620 INIT_LIST_HEAD(&chunk->list);
621 chunk->free_size = pcpu_unit_size;
622 chunk->contig_hint = pcpu_unit_size;
623
624 return chunk;
625}
626
627static void pcpu_free_chunk(struct pcpu_chunk *chunk)
628{
629 if (!chunk)
630 return;
631 pcpu_mem_free(chunk->map, chunk->map_alloc * sizeof(chunk->map[0]));
632 kfree(chunk);
633}
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650static int pcpu_populate_chunk(struct pcpu_chunk *chunk, int off, int size);
651static void pcpu_depopulate_chunk(struct pcpu_chunk *chunk, int off, int size);
652static struct pcpu_chunk *pcpu_create_chunk(void);
653static void pcpu_destroy_chunk(struct pcpu_chunk *chunk);
654static struct page *pcpu_addr_to_page(void *addr);
655static int __init pcpu_verify_alloc_info(const struct pcpu_alloc_info *ai);
656
657#ifdef CONFIG_NEED_PER_CPU_KM
658#include "percpu-km.c"
659#else
660#include "percpu-vm.c"
661#endif
662
663
664
665
666
667
668
669
670static struct pcpu_chunk *pcpu_chunk_addr_search(void *addr)
671{
672
673 if (pcpu_addr_in_first_chunk(addr)) {
674
675 if (pcpu_addr_in_reserved_chunk(addr))
676 return pcpu_reserved_chunk;
677 return pcpu_first_chunk;
678 }
679
680
681
682
683
684
685
686
687 addr += pcpu_unit_offsets[raw_smp_processor_id()];
688 return pcpu_get_page_chunk(pcpu_addr_to_page(addr));
689}
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705static void __percpu *pcpu_alloc(size_t size, size_t align, bool reserved)
706{
707 static int warn_limit = 10;
708 struct pcpu_chunk *chunk;
709 const char *err;
710 int slot, off, new_alloc;
711 unsigned long flags;
712
713 if (unlikely(!size || size > PCPU_MIN_UNIT_SIZE || align > PAGE_SIZE)) {
714 WARN(true, "illegal size (%zu) or align (%zu) for "
715 "percpu allocation\n", size, align);
716 return NULL;
717 }
718
719 mutex_lock(&pcpu_alloc_mutex);
720 spin_lock_irqsave(&pcpu_lock, flags);
721
722
723 if (reserved && pcpu_reserved_chunk) {
724 chunk = pcpu_reserved_chunk;
725
726 if (size > chunk->contig_hint) {
727 err = "alloc from reserved chunk failed";
728 goto fail_unlock;
729 }
730
731 while ((new_alloc = pcpu_need_to_extend(chunk))) {
732 spin_unlock_irqrestore(&pcpu_lock, flags);
733 if (pcpu_extend_area_map(chunk, new_alloc) < 0) {
734 err = "failed to extend area map of reserved chunk";
735 goto fail_unlock_mutex;
736 }
737 spin_lock_irqsave(&pcpu_lock, flags);
738 }
739
740 off = pcpu_alloc_area(chunk, size, align);
741 if (off >= 0)
742 goto area_found;
743
744 err = "alloc from reserved chunk failed";
745 goto fail_unlock;
746 }
747
748restart:
749
750 for (slot = pcpu_size_to_slot(size); slot < pcpu_nr_slots; slot++) {
751 list_for_each_entry(chunk, &pcpu_slot[slot], list) {
752 if (size > chunk->contig_hint)
753 continue;
754
755 new_alloc = pcpu_need_to_extend(chunk);
756 if (new_alloc) {
757 spin_unlock_irqrestore(&pcpu_lock, flags);
758 if (pcpu_extend_area_map(chunk,
759 new_alloc) < 0) {
760 err = "failed to extend area map";
761 goto fail_unlock_mutex;
762 }
763 spin_lock_irqsave(&pcpu_lock, flags);
764
765
766
767
768 goto restart;
769 }
770
771 off = pcpu_alloc_area(chunk, size, align);
772 if (off >= 0)
773 goto area_found;
774 }
775 }
776
777
778 spin_unlock_irqrestore(&pcpu_lock, flags);
779
780 chunk = pcpu_create_chunk();
781 if (!chunk) {
782 err = "failed to allocate new chunk";
783 goto fail_unlock_mutex;
784 }
785
786 spin_lock_irqsave(&pcpu_lock, flags);
787 pcpu_chunk_relocate(chunk, -1);
788 goto restart;
789
790area_found:
791 spin_unlock_irqrestore(&pcpu_lock, flags);
792
793
794 if (pcpu_populate_chunk(chunk, off, size)) {
795 spin_lock_irqsave(&pcpu_lock, flags);
796 pcpu_free_area(chunk, off);
797 err = "failed to populate";
798 goto fail_unlock;
799 }
800
801 mutex_unlock(&pcpu_alloc_mutex);
802
803
804 return __addr_to_pcpu_ptr(chunk->base_addr + off);
805
806fail_unlock:
807 spin_unlock_irqrestore(&pcpu_lock, flags);
808fail_unlock_mutex:
809 mutex_unlock(&pcpu_alloc_mutex);
810 if (warn_limit) {
811 pr_warning("PERCPU: allocation failed, size=%zu align=%zu, "
812 "%s\n", size, align, err);
813 dump_stack();
814 if (!--warn_limit)
815 pr_info("PERCPU: limit reached, disable warning\n");
816 }
817 return NULL;
818}
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834void __percpu *__alloc_percpu(size_t size, size_t align)
835{
836 return pcpu_alloc(size, align, false);
837}
838EXPORT_SYMBOL_GPL(__alloc_percpu);
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856void __percpu *__alloc_reserved_percpu(size_t size, size_t align)
857{
858 return pcpu_alloc(size, align, true);
859}
860
861
862
863
864
865
866
867
868
869
870static void pcpu_reclaim(struct work_struct *work)
871{
872 LIST_HEAD(todo);
873 struct list_head *head = &pcpu_slot[pcpu_nr_slots - 1];
874 struct pcpu_chunk *chunk, *next;
875
876 mutex_lock(&pcpu_alloc_mutex);
877 spin_lock_irq(&pcpu_lock);
878
879 list_for_each_entry_safe(chunk, next, head, list) {
880 WARN_ON(chunk->immutable);
881
882
883 if (chunk == list_first_entry(head, struct pcpu_chunk, list))
884 continue;
885
886 list_move(&chunk->list, &todo);
887 }
888
889 spin_unlock_irq(&pcpu_lock);
890
891 list_for_each_entry_safe(chunk, next, &todo, list) {
892 pcpu_depopulate_chunk(chunk, 0, pcpu_unit_size);
893 pcpu_destroy_chunk(chunk);
894 }
895
896 mutex_unlock(&pcpu_alloc_mutex);
897}
898
899
900
901
902
903
904
905
906
907
908void free_percpu(void __percpu *ptr)
909{
910 void *addr;
911 struct pcpu_chunk *chunk;
912 unsigned long flags;
913 int off;
914
915 if (!ptr)
916 return;
917
918 addr = __pcpu_ptr_to_addr(ptr);
919
920 spin_lock_irqsave(&pcpu_lock, flags);
921
922 chunk = pcpu_chunk_addr_search(addr);
923 off = addr - chunk->base_addr;
924
925 pcpu_free_area(chunk, off);
926
927
928 if (chunk->free_size == pcpu_unit_size) {
929 struct pcpu_chunk *pos;
930
931 list_for_each_entry(pos, &pcpu_slot[pcpu_nr_slots - 1], list)
932 if (pos != chunk) {
933 schedule_work(&pcpu_reclaim_work);
934 break;
935 }
936 }
937
938 spin_unlock_irqrestore(&pcpu_lock, flags);
939}
940EXPORT_SYMBOL_GPL(free_percpu);
941
942
943
944
945
946
947
948
949
950
951
952
953bool is_kernel_percpu_address(unsigned long addr)
954{
955#ifdef CONFIG_SMP
956 const size_t static_size = __per_cpu_end - __per_cpu_start;
957 void __percpu *base = __addr_to_pcpu_ptr(pcpu_base_addr);
958 unsigned int cpu;
959
960 for_each_possible_cpu(cpu) {
961 void *start = per_cpu_ptr(base, cpu);
962
963 if ((void *)addr >= start && (void *)addr < start + static_size)
964 return true;
965 }
966#endif
967
968 return false;
969}
970
971
972
973
974
975
976
977
978
979
980
981
982
983phys_addr_t per_cpu_ptr_to_phys(void *addr)
984{
985 void __percpu *base = __addr_to_pcpu_ptr(pcpu_base_addr);
986 bool in_first_chunk = false;
987 unsigned long first_low, first_high;
988 unsigned int cpu;
989
990
991
992
993
994
995 first_low = pcpu_chunk_addr(pcpu_first_chunk, pcpu_low_unit_cpu, 0);
996 first_high = pcpu_chunk_addr(pcpu_first_chunk, pcpu_high_unit_cpu,
997 pcpu_unit_pages);
998 if ((unsigned long)addr >= first_low &&
999 (unsigned long)addr < first_high) {
1000 for_each_possible_cpu(cpu) {
1001 void *start = per_cpu_ptr(base, cpu);
1002
1003 if (addr >= start && addr < start + pcpu_unit_size) {
1004 in_first_chunk = true;
1005 break;
1006 }
1007 }
1008 }
1009
1010 if (in_first_chunk) {
1011 if (!is_vmalloc_addr(addr))
1012 return __pa(addr);
1013 else
1014 return page_to_phys(vmalloc_to_page(addr));
1015 } else
1016 return page_to_phys(pcpu_addr_to_page(addr));
1017}
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034struct pcpu_alloc_info * __init pcpu_alloc_alloc_info(int nr_groups,
1035 int nr_units)
1036{
1037 struct pcpu_alloc_info *ai;
1038 size_t base_size, ai_size;
1039 void *ptr;
1040 int unit;
1041
1042 base_size = ALIGN(sizeof(*ai) + nr_groups * sizeof(ai->groups[0]),
1043 __alignof__(ai->groups[0].cpu_map[0]));
1044 ai_size = base_size + nr_units * sizeof(ai->groups[0].cpu_map[0]);
1045
1046 ptr = alloc_bootmem_nopanic(PFN_ALIGN(ai_size));
1047 if (!ptr)
1048 return NULL;
1049 ai = ptr;
1050 ptr += base_size;
1051
1052 ai->groups[0].cpu_map = ptr;
1053
1054 for (unit = 0; unit < nr_units; unit++)
1055 ai->groups[0].cpu_map[unit] = NR_CPUS;
1056
1057 ai->nr_groups = nr_groups;
1058 ai->__ai_size = PFN_ALIGN(ai_size);
1059
1060 return ai;
1061}
1062
1063
1064
1065
1066
1067
1068
1069void __init pcpu_free_alloc_info(struct pcpu_alloc_info *ai)
1070{
1071 free_bootmem(__pa(ai), ai->__ai_size);
1072}
1073
1074
1075
1076
1077
1078
1079
1080
1081static void pcpu_dump_alloc_info(const char *lvl,
1082 const struct pcpu_alloc_info *ai)
1083{
1084 int group_width = 1, cpu_width = 1, width;
1085 char empty_str[] = "--------";
1086 int alloc = 0, alloc_end = 0;
1087 int group, v;
1088 int upa, apl;
1089
1090 v = ai->nr_groups;
1091 while (v /= 10)
1092 group_width++;
1093
1094 v = num_possible_cpus();
1095 while (v /= 10)
1096 cpu_width++;
1097 empty_str[min_t(int, cpu_width, sizeof(empty_str) - 1)] = '\0';
1098
1099 upa = ai->alloc_size / ai->unit_size;
1100 width = upa * (cpu_width + 1) + group_width + 3;
1101 apl = rounddown_pow_of_two(max(60 / width, 1));
1102
1103 printk("%spcpu-alloc: s%zu r%zu d%zu u%zu alloc=%zu*%zu",
1104 lvl, ai->static_size, ai->reserved_size, ai->dyn_size,
1105 ai->unit_size, ai->alloc_size / ai->atom_size, ai->atom_size);
1106
1107 for (group = 0; group < ai->nr_groups; group++) {
1108 const struct pcpu_group_info *gi = &ai->groups[group];
1109 int unit = 0, unit_end = 0;
1110
1111 BUG_ON(gi->nr_units % upa);
1112 for (alloc_end += gi->nr_units / upa;
1113 alloc < alloc_end; alloc++) {
1114 if (!(alloc % apl)) {
1115 printk("\n");
1116 printk("%spcpu-alloc: ", lvl);
1117 }
1118 printk("[%0*d] ", group_width, group);
1119
1120 for (unit_end += upa; unit < unit_end; unit++)
1121 if (gi->cpu_map[unit] != NR_CPUS)
1122 printk("%0*d ", cpu_width,
1123 gi->cpu_map[unit]);
1124 else
1125 printk("%s ", empty_str);
1126 }
1127 }
1128 printk("\n");
1129}
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187int __init pcpu_setup_first_chunk(const struct pcpu_alloc_info *ai,
1188 void *base_addr)
1189{
1190 static char cpus_buf[4096] __initdata;
1191 static int smap[PERCPU_DYNAMIC_EARLY_SLOTS] __initdata;
1192 static int dmap[PERCPU_DYNAMIC_EARLY_SLOTS] __initdata;
1193 size_t dyn_size = ai->dyn_size;
1194 size_t size_sum = ai->static_size + ai->reserved_size + dyn_size;
1195 struct pcpu_chunk *schunk, *dchunk = NULL;
1196 unsigned long *group_offsets;
1197 size_t *group_sizes;
1198 unsigned long *unit_off;
1199 unsigned int cpu;
1200 int *unit_map;
1201 int group, unit, i;
1202
1203 cpumask_scnprintf(cpus_buf, sizeof(cpus_buf), cpu_possible_mask);
1204
1205#define PCPU_SETUP_BUG_ON(cond) do { \
1206 if (unlikely(cond)) { \
1207 pr_emerg("PERCPU: failed to initialize, %s", #cond); \
1208 pr_emerg("PERCPU: cpu_possible_mask=%s\n", cpus_buf); \
1209 pcpu_dump_alloc_info(KERN_EMERG, ai); \
1210 BUG(); \
1211 } \
1212} while (0)
1213
1214
1215 PCPU_SETUP_BUG_ON(ai->nr_groups <= 0);
1216#ifdef CONFIG_SMP
1217 PCPU_SETUP_BUG_ON(!ai->static_size);
1218 PCPU_SETUP_BUG_ON((unsigned long)__per_cpu_start & ~PAGE_MASK);
1219#endif
1220 PCPU_SETUP_BUG_ON(!base_addr);
1221 PCPU_SETUP_BUG_ON((unsigned long)base_addr & ~PAGE_MASK);
1222 PCPU_SETUP_BUG_ON(ai->unit_size < size_sum);
1223 PCPU_SETUP_BUG_ON(ai->unit_size & ~PAGE_MASK);
1224 PCPU_SETUP_BUG_ON(ai->unit_size < PCPU_MIN_UNIT_SIZE);
1225 PCPU_SETUP_BUG_ON(ai->dyn_size < PERCPU_DYNAMIC_EARLY_SIZE);
1226 PCPU_SETUP_BUG_ON(pcpu_verify_alloc_info(ai) < 0);
1227
1228
1229 group_offsets = alloc_bootmem(ai->nr_groups * sizeof(group_offsets[0]));
1230 group_sizes = alloc_bootmem(ai->nr_groups * sizeof(group_sizes[0]));
1231 unit_map = alloc_bootmem(nr_cpu_ids * sizeof(unit_map[0]));
1232 unit_off = alloc_bootmem(nr_cpu_ids * sizeof(unit_off[0]));
1233
1234 for (cpu = 0; cpu < nr_cpu_ids; cpu++)
1235 unit_map[cpu] = UINT_MAX;
1236
1237 pcpu_low_unit_cpu = NR_CPUS;
1238 pcpu_high_unit_cpu = NR_CPUS;
1239
1240 for (group = 0, unit = 0; group < ai->nr_groups; group++, unit += i) {
1241 const struct pcpu_group_info *gi = &ai->groups[group];
1242
1243 group_offsets[group] = gi->base_offset;
1244 group_sizes[group] = gi->nr_units * ai->unit_size;
1245
1246 for (i = 0; i < gi->nr_units; i++) {
1247 cpu = gi->cpu_map[i];
1248 if (cpu == NR_CPUS)
1249 continue;
1250
1251 PCPU_SETUP_BUG_ON(cpu > nr_cpu_ids);
1252 PCPU_SETUP_BUG_ON(!cpu_possible(cpu));
1253 PCPU_SETUP_BUG_ON(unit_map[cpu] != UINT_MAX);
1254
1255 unit_map[cpu] = unit + i;
1256 unit_off[cpu] = gi->base_offset + i * ai->unit_size;
1257
1258
1259 if (pcpu_low_unit_cpu == NR_CPUS ||
1260 unit_off[cpu] < unit_off[pcpu_low_unit_cpu])
1261 pcpu_low_unit_cpu = cpu;
1262 if (pcpu_high_unit_cpu == NR_CPUS ||
1263 unit_off[cpu] > unit_off[pcpu_high_unit_cpu])
1264 pcpu_high_unit_cpu = cpu;
1265 }
1266 }
1267 pcpu_nr_units = unit;
1268
1269 for_each_possible_cpu(cpu)
1270 PCPU_SETUP_BUG_ON(unit_map[cpu] == UINT_MAX);
1271
1272
1273#undef PCPU_SETUP_BUG_ON
1274 pcpu_dump_alloc_info(KERN_DEBUG, ai);
1275
1276 pcpu_nr_groups = ai->nr_groups;
1277 pcpu_group_offsets = group_offsets;
1278 pcpu_group_sizes = group_sizes;
1279 pcpu_unit_map = unit_map;
1280 pcpu_unit_offsets = unit_off;
1281
1282
1283 pcpu_unit_pages = ai->unit_size >> PAGE_SHIFT;
1284 pcpu_unit_size = pcpu_unit_pages << PAGE_SHIFT;
1285 pcpu_atom_size = ai->atom_size;
1286 pcpu_chunk_struct_size = sizeof(struct pcpu_chunk) +
1287 BITS_TO_LONGS(pcpu_unit_pages) * sizeof(unsigned long);
1288
1289
1290
1291
1292
1293 pcpu_nr_slots = __pcpu_size_to_slot(pcpu_unit_size) + 2;
1294 pcpu_slot = alloc_bootmem(pcpu_nr_slots * sizeof(pcpu_slot[0]));
1295 for (i = 0; i < pcpu_nr_slots; i++)
1296 INIT_LIST_HEAD(&pcpu_slot[i]);
1297
1298
1299
1300
1301
1302
1303
1304
1305 schunk = alloc_bootmem(pcpu_chunk_struct_size);
1306 INIT_LIST_HEAD(&schunk->list);
1307 schunk->base_addr = base_addr;
1308 schunk->map = smap;
1309 schunk->map_alloc = ARRAY_SIZE(smap);
1310 schunk->immutable = true;
1311 bitmap_fill(schunk->populated, pcpu_unit_pages);
1312
1313 if (ai->reserved_size) {
1314 schunk->free_size = ai->reserved_size;
1315 pcpu_reserved_chunk = schunk;
1316 pcpu_reserved_chunk_limit = ai->static_size + ai->reserved_size;
1317 } else {
1318 schunk->free_size = dyn_size;
1319 dyn_size = 0;
1320 }
1321 schunk->contig_hint = schunk->free_size;
1322
1323 schunk->map[schunk->map_used++] = -ai->static_size;
1324 if (schunk->free_size)
1325 schunk->map[schunk->map_used++] = schunk->free_size;
1326
1327
1328 if (dyn_size) {
1329 dchunk = alloc_bootmem(pcpu_chunk_struct_size);
1330 INIT_LIST_HEAD(&dchunk->list);
1331 dchunk->base_addr = base_addr;
1332 dchunk->map = dmap;
1333 dchunk->map_alloc = ARRAY_SIZE(dmap);
1334 dchunk->immutable = true;
1335 bitmap_fill(dchunk->populated, pcpu_unit_pages);
1336
1337 dchunk->contig_hint = dchunk->free_size = dyn_size;
1338 dchunk->map[dchunk->map_used++] = -pcpu_reserved_chunk_limit;
1339 dchunk->map[dchunk->map_used++] = dchunk->free_size;
1340 }
1341
1342
1343 pcpu_first_chunk = dchunk ?: schunk;
1344 pcpu_chunk_relocate(pcpu_first_chunk, -1);
1345
1346
1347 pcpu_base_addr = base_addr;
1348 return 0;
1349}
1350
1351#ifdef CONFIG_SMP
1352
1353const char *pcpu_fc_names[PCPU_FC_NR] __initdata = {
1354 [PCPU_FC_AUTO] = "auto",
1355 [PCPU_FC_EMBED] = "embed",
1356 [PCPU_FC_PAGE] = "page",
1357};
1358
1359enum pcpu_fc pcpu_chosen_fc __initdata = PCPU_FC_AUTO;
1360
1361static int __init percpu_alloc_setup(char *str)
1362{
1363 if (0)
1364 ;
1365#ifdef CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK
1366 else if (!strcmp(str, "embed"))
1367 pcpu_chosen_fc = PCPU_FC_EMBED;
1368#endif
1369#ifdef CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK
1370 else if (!strcmp(str, "page"))
1371 pcpu_chosen_fc = PCPU_FC_PAGE;
1372#endif
1373 else
1374 pr_warning("PERCPU: unknown allocator %s specified\n", str);
1375
1376 return 0;
1377}
1378early_param("percpu_alloc", percpu_alloc_setup);
1379
1380
1381
1382
1383
1384
1385#if defined(CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK) || \
1386 !defined(CONFIG_HAVE_SETUP_PER_CPU_AREA)
1387#define BUILD_EMBED_FIRST_CHUNK
1388#endif
1389
1390
1391#if defined(CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK)
1392#define BUILD_PAGE_FIRST_CHUNK
1393#endif
1394
1395
1396#if defined(BUILD_EMBED_FIRST_CHUNK) || defined(BUILD_PAGE_FIRST_CHUNK)
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418static struct pcpu_alloc_info * __init pcpu_build_alloc_info(
1419 size_t reserved_size, size_t dyn_size,
1420 size_t atom_size,
1421 pcpu_fc_cpu_distance_fn_t cpu_distance_fn)
1422{
1423 static int group_map[NR_CPUS] __initdata;
1424 static int group_cnt[NR_CPUS] __initdata;
1425 const size_t static_size = __per_cpu_end - __per_cpu_start;
1426 int nr_groups = 1, nr_units = 0;
1427 size_t size_sum, min_unit_size, alloc_size;
1428 int upa, max_upa, uninitialized_var(best_upa);
1429 int last_allocs, group, unit;
1430 unsigned int cpu, tcpu;
1431 struct pcpu_alloc_info *ai;
1432 unsigned int *cpu_map;
1433
1434
1435 memset(group_map, 0, sizeof(group_map));
1436 memset(group_cnt, 0, sizeof(group_cnt));
1437
1438
1439 size_sum = PFN_ALIGN(static_size + reserved_size +
1440 max_t(size_t, dyn_size, PERCPU_DYNAMIC_EARLY_SIZE));
1441 dyn_size = size_sum - static_size - reserved_size;
1442
1443
1444
1445
1446
1447
1448
1449 min_unit_size = max_t(size_t, size_sum, PCPU_MIN_UNIT_SIZE);
1450
1451 alloc_size = roundup(min_unit_size, atom_size);
1452 upa = alloc_size / min_unit_size;
1453 while (alloc_size % upa || ((alloc_size / upa) & ~PAGE_MASK))
1454 upa--;
1455 max_upa = upa;
1456
1457
1458 for_each_possible_cpu(cpu) {
1459 group = 0;
1460 next_group:
1461 for_each_possible_cpu(tcpu) {
1462 if (cpu == tcpu)
1463 break;
1464 if (group_map[tcpu] == group && cpu_distance_fn &&
1465 (cpu_distance_fn(cpu, tcpu) > LOCAL_DISTANCE ||
1466 cpu_distance_fn(tcpu, cpu) > LOCAL_DISTANCE)) {
1467 group++;
1468 nr_groups = max(nr_groups, group + 1);
1469 goto next_group;
1470 }
1471 }
1472 group_map[cpu] = group;
1473 group_cnt[group]++;
1474 }
1475
1476
1477
1478
1479
1480
1481 last_allocs = INT_MAX;
1482 for (upa = max_upa; upa; upa--) {
1483 int allocs = 0, wasted = 0;
1484
1485 if (alloc_size % upa || ((alloc_size / upa) & ~PAGE_MASK))
1486 continue;
1487
1488 for (group = 0; group < nr_groups; group++) {
1489 int this_allocs = DIV_ROUND_UP(group_cnt[group], upa);
1490 allocs += this_allocs;
1491 wasted += this_allocs * upa - group_cnt[group];
1492 }
1493
1494
1495
1496
1497
1498
1499 if (wasted > num_possible_cpus() / 3)
1500 continue;
1501
1502
1503 if (allocs > last_allocs)
1504 break;
1505 last_allocs = allocs;
1506 best_upa = upa;
1507 }
1508 upa = best_upa;
1509
1510
1511 for (group = 0; group < nr_groups; group++)
1512 nr_units += roundup(group_cnt[group], upa);
1513
1514 ai = pcpu_alloc_alloc_info(nr_groups, nr_units);
1515 if (!ai)
1516 return ERR_PTR(-ENOMEM);
1517 cpu_map = ai->groups[0].cpu_map;
1518
1519 for (group = 0; group < nr_groups; group++) {
1520 ai->groups[group].cpu_map = cpu_map;
1521 cpu_map += roundup(group_cnt[group], upa);
1522 }
1523
1524 ai->static_size = static_size;
1525 ai->reserved_size = reserved_size;
1526 ai->dyn_size = dyn_size;
1527 ai->unit_size = alloc_size / upa;
1528 ai->atom_size = atom_size;
1529 ai->alloc_size = alloc_size;
1530
1531 for (group = 0, unit = 0; group_cnt[group]; group++) {
1532 struct pcpu_group_info *gi = &ai->groups[group];
1533
1534
1535
1536
1537
1538
1539 gi->base_offset = unit * ai->unit_size;
1540
1541 for_each_possible_cpu(cpu)
1542 if (group_map[cpu] == group)
1543 gi->cpu_map[gi->nr_units++] = cpu;
1544 gi->nr_units = roundup(gi->nr_units, upa);
1545 unit += gi->nr_units;
1546 }
1547 BUG_ON(unit != nr_units);
1548
1549 return ai;
1550}
1551#endif
1552
1553#if defined(BUILD_EMBED_FIRST_CHUNK)
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586int __init pcpu_embed_first_chunk(size_t reserved_size, size_t dyn_size,
1587 size_t atom_size,
1588 pcpu_fc_cpu_distance_fn_t cpu_distance_fn,
1589 pcpu_fc_alloc_fn_t alloc_fn,
1590 pcpu_fc_free_fn_t free_fn)
1591{
1592 void *base = (void *)ULONG_MAX;
1593 void **areas = NULL;
1594 struct pcpu_alloc_info *ai;
1595 size_t size_sum, areas_size, max_distance;
1596 int group, i, rc;
1597
1598 ai = pcpu_build_alloc_info(reserved_size, dyn_size, atom_size,
1599 cpu_distance_fn);
1600 if (IS_ERR(ai))
1601 return PTR_ERR(ai);
1602
1603 size_sum = ai->static_size + ai->reserved_size + ai->dyn_size;
1604 areas_size = PFN_ALIGN(ai->nr_groups * sizeof(void *));
1605
1606 areas = alloc_bootmem_nopanic(areas_size);
1607 if (!areas) {
1608 rc = -ENOMEM;
1609 goto out_free;
1610 }
1611
1612
1613 for (group = 0; group < ai->nr_groups; group++) {
1614 struct pcpu_group_info *gi = &ai->groups[group];
1615 unsigned int cpu = NR_CPUS;
1616 void *ptr;
1617
1618 for (i = 0; i < gi->nr_units && cpu == NR_CPUS; i++)
1619 cpu = gi->cpu_map[i];
1620 BUG_ON(cpu == NR_CPUS);
1621
1622
1623 ptr = alloc_fn(cpu, gi->nr_units * ai->unit_size, atom_size);
1624 if (!ptr) {
1625 rc = -ENOMEM;
1626 goto out_free_areas;
1627 }
1628 areas[group] = ptr;
1629
1630 base = min(ptr, base);
1631
1632 for (i = 0; i < gi->nr_units; i++, ptr += ai->unit_size) {
1633 if (gi->cpu_map[i] == NR_CPUS) {
1634
1635 free_fn(ptr, ai->unit_size);
1636 continue;
1637 }
1638
1639 memcpy(ptr, __per_cpu_load, ai->static_size);
1640 free_fn(ptr + size_sum, ai->unit_size - size_sum);
1641 }
1642 }
1643
1644
1645 max_distance = 0;
1646 for (group = 0; group < ai->nr_groups; group++) {
1647 ai->groups[group].base_offset = areas[group] - base;
1648 max_distance = max_t(size_t, max_distance,
1649 ai->groups[group].base_offset);
1650 }
1651 max_distance += ai->unit_size;
1652
1653
1654 if (max_distance > (VMALLOC_END - VMALLOC_START) * 3 / 4) {
1655 pr_warning("PERCPU: max_distance=0x%zx too large for vmalloc "
1656 "space 0x%lx\n", max_distance,
1657 (unsigned long)(VMALLOC_END - VMALLOC_START));
1658#ifdef CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK
1659
1660 rc = -EINVAL;
1661 goto out_free;
1662#endif
1663 }
1664
1665 pr_info("PERCPU: Embedded %zu pages/cpu @%p s%zu r%zu d%zu u%zu\n",
1666 PFN_DOWN(size_sum), base, ai->static_size, ai->reserved_size,
1667 ai->dyn_size, ai->unit_size);
1668
1669 rc = pcpu_setup_first_chunk(ai, base);
1670 goto out_free;
1671
1672out_free_areas:
1673 for (group = 0; group < ai->nr_groups; group++)
1674 free_fn(areas[group],
1675 ai->groups[group].nr_units * ai->unit_size);
1676out_free:
1677 pcpu_free_alloc_info(ai);
1678 if (areas)
1679 free_bootmem(__pa(areas), areas_size);
1680 return rc;
1681}
1682#endif
1683
1684#ifdef BUILD_PAGE_FIRST_CHUNK
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701int __init pcpu_page_first_chunk(size_t reserved_size,
1702 pcpu_fc_alloc_fn_t alloc_fn,
1703 pcpu_fc_free_fn_t free_fn,
1704 pcpu_fc_populate_pte_fn_t populate_pte_fn)
1705{
1706 static struct vm_struct vm;
1707 struct pcpu_alloc_info *ai;
1708 char psize_str[16];
1709 int unit_pages;
1710 size_t pages_size;
1711 struct page **pages;
1712 int unit, i, j, rc;
1713
1714 snprintf(psize_str, sizeof(psize_str), "%luK", PAGE_SIZE >> 10);
1715
1716 ai = pcpu_build_alloc_info(reserved_size, 0, PAGE_SIZE, NULL);
1717 if (IS_ERR(ai))
1718 return PTR_ERR(ai);
1719 BUG_ON(ai->nr_groups != 1);
1720 BUG_ON(ai->groups[0].nr_units != num_possible_cpus());
1721
1722 unit_pages = ai->unit_size >> PAGE_SHIFT;
1723
1724
1725 pages_size = PFN_ALIGN(unit_pages * num_possible_cpus() *
1726 sizeof(pages[0]));
1727 pages = alloc_bootmem(pages_size);
1728
1729
1730 j = 0;
1731 for (unit = 0; unit < num_possible_cpus(); unit++)
1732 for (i = 0; i < unit_pages; i++) {
1733 unsigned int cpu = ai->groups[0].cpu_map[unit];
1734 void *ptr;
1735
1736 ptr = alloc_fn(cpu, PAGE_SIZE, PAGE_SIZE);
1737 if (!ptr) {
1738 pr_warning("PERCPU: failed to allocate %s page "
1739 "for cpu%u\n", psize_str, cpu);
1740 goto enomem;
1741 }
1742 pages[j++] = virt_to_page(ptr);
1743 }
1744
1745
1746 vm.flags = VM_ALLOC;
1747 vm.size = num_possible_cpus() * ai->unit_size;
1748 vm_area_register_early(&vm, PAGE_SIZE);
1749
1750 for (unit = 0; unit < num_possible_cpus(); unit++) {
1751 unsigned long unit_addr =
1752 (unsigned long)vm.addr + unit * ai->unit_size;
1753
1754 for (i = 0; i < unit_pages; i++)
1755 populate_pte_fn(unit_addr + (i << PAGE_SHIFT));
1756
1757
1758 rc = __pcpu_map_pages(unit_addr, &pages[unit * unit_pages],
1759 unit_pages);
1760 if (rc < 0)
1761 panic("failed to map percpu area, err=%d\n", rc);
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772 memcpy((void *)unit_addr, __per_cpu_load, ai->static_size);
1773 }
1774
1775
1776 pr_info("PERCPU: %d %s pages/cpu @%p s%zu r%zu d%zu\n",
1777 unit_pages, psize_str, vm.addr, ai->static_size,
1778 ai->reserved_size, ai->dyn_size);
1779
1780 rc = pcpu_setup_first_chunk(ai, vm.addr);
1781 goto out_free_ar;
1782
1783enomem:
1784 while (--j >= 0)
1785 free_fn(page_address(pages[j]), PAGE_SIZE);
1786 rc = -ENOMEM;
1787out_free_ar:
1788 free_bootmem(__pa(pages), pages_size);
1789 pcpu_free_alloc_info(ai);
1790 return rc;
1791}
1792#endif
1793
1794#ifndef CONFIG_HAVE_SETUP_PER_CPU_AREA
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807unsigned long __per_cpu_offset[NR_CPUS] __read_mostly;
1808EXPORT_SYMBOL(__per_cpu_offset);
1809
1810static void * __init pcpu_dfl_fc_alloc(unsigned int cpu, size_t size,
1811 size_t align)
1812{
1813 return __alloc_bootmem_nopanic(size, align, __pa(MAX_DMA_ADDRESS));
1814}
1815
1816static void __init pcpu_dfl_fc_free(void *ptr, size_t size)
1817{
1818 free_bootmem(__pa(ptr), size);
1819}
1820
1821void __init setup_per_cpu_areas(void)
1822{
1823 unsigned long delta;
1824 unsigned int cpu;
1825 int rc;
1826
1827
1828
1829
1830
1831 rc = pcpu_embed_first_chunk(PERCPU_MODULE_RESERVE,
1832 PERCPU_DYNAMIC_RESERVE, PAGE_SIZE, NULL,
1833 pcpu_dfl_fc_alloc, pcpu_dfl_fc_free);
1834 if (rc < 0)
1835 panic("Failed to initialize percpu areas.");
1836
1837 delta = (unsigned long)pcpu_base_addr - (unsigned long)__per_cpu_start;
1838 for_each_possible_cpu(cpu)
1839 __per_cpu_offset[cpu] = delta + pcpu_unit_offsets[cpu];
1840}
1841#endif
1842
1843#else
1844
1845
1846
1847
1848
1849
1850
1851
1852void __init setup_per_cpu_areas(void)
1853{
1854 const size_t unit_size =
1855 roundup_pow_of_two(max_t(size_t, PCPU_MIN_UNIT_SIZE,
1856 PERCPU_DYNAMIC_RESERVE));
1857 struct pcpu_alloc_info *ai;
1858 void *fc;
1859
1860 ai = pcpu_alloc_alloc_info(1, 1);
1861 fc = __alloc_bootmem(unit_size, PAGE_SIZE, __pa(MAX_DMA_ADDRESS));
1862 if (!ai || !fc)
1863 panic("Failed to allocate memory for percpu areas.");
1864
1865 ai->dyn_size = unit_size;
1866 ai->unit_size = unit_size;
1867 ai->atom_size = unit_size;
1868 ai->alloc_size = unit_size;
1869 ai->groups[0].nr_units = 1;
1870 ai->groups[0].cpu_map[0] = 0;
1871
1872 if (pcpu_setup_first_chunk(ai, fc) < 0)
1873 panic("Failed to initialize percpu areas.");
1874}
1875
1876#endif
1877
1878
1879
1880
1881
1882
1883
1884void __init percpu_init_late(void)
1885{
1886 struct pcpu_chunk *target_chunks[] =
1887 { pcpu_first_chunk, pcpu_reserved_chunk, NULL };
1888 struct pcpu_chunk *chunk;
1889 unsigned long flags;
1890 int i;
1891
1892 for (i = 0; (chunk = target_chunks[i]); i++) {
1893 int *map;
1894 const size_t size = PERCPU_DYNAMIC_EARLY_SLOTS * sizeof(map[0]);
1895
1896 BUILD_BUG_ON(size > PAGE_SIZE);
1897
1898 map = pcpu_mem_alloc(size);
1899 BUG_ON(!map);
1900
1901 spin_lock_irqsave(&pcpu_lock, flags);
1902 memcpy(map, chunk->map, size);
1903 chunk->map = map;
1904 spin_unlock_irqrestore(&pcpu_lock, flags);
1905 }
1906}
1907