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_zalloc(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_zalloc(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_zalloc(pcpu_chunk_struct_size);
608 if (!chunk)
609 return NULL;
610
611 chunk->map = pcpu_mem_zalloc(PCPU_DFL_MAP_ALLOC *
612 sizeof(chunk->map[0]));
613 if (!chunk->map) {
614 kfree(chunk);
615 return NULL;
616 }
617
618 chunk->map_alloc = PCPU_DFL_MAP_ALLOC;
619 chunk->map[chunk->map_used++] = pcpu_unit_size;
620
621 INIT_LIST_HEAD(&chunk->list);
622 chunk->free_size = pcpu_unit_size;
623 chunk->contig_hint = pcpu_unit_size;
624
625 return chunk;
626}
627
628static void pcpu_free_chunk(struct pcpu_chunk *chunk)
629{
630 if (!chunk)
631 return;
632 pcpu_mem_free(chunk->map, chunk->map_alloc * sizeof(chunk->map[0]));
633 kfree(chunk);
634}
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651static int pcpu_populate_chunk(struct pcpu_chunk *chunk, int off, int size);
652static void pcpu_depopulate_chunk(struct pcpu_chunk *chunk, int off, int size);
653static struct pcpu_chunk *pcpu_create_chunk(void);
654static void pcpu_destroy_chunk(struct pcpu_chunk *chunk);
655static struct page *pcpu_addr_to_page(void *addr);
656static int __init pcpu_verify_alloc_info(const struct pcpu_alloc_info *ai);
657
658#ifdef CONFIG_NEED_PER_CPU_KM
659#include "percpu-km.c"
660#else
661#include "percpu-vm.c"
662#endif
663
664
665
666
667
668
669
670
671static struct pcpu_chunk *pcpu_chunk_addr_search(void *addr)
672{
673
674 if (pcpu_addr_in_first_chunk(addr)) {
675
676 if (pcpu_addr_in_reserved_chunk(addr))
677 return pcpu_reserved_chunk;
678 return pcpu_first_chunk;
679 }
680
681
682
683
684
685
686
687
688 addr += pcpu_unit_offsets[raw_smp_processor_id()];
689 return pcpu_get_page_chunk(pcpu_addr_to_page(addr));
690}
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706static void __percpu *pcpu_alloc(size_t size, size_t align, bool reserved)
707{
708 static int warn_limit = 10;
709 struct pcpu_chunk *chunk;
710 const char *err;
711 int slot, off, new_alloc;
712 unsigned long flags;
713
714 if (unlikely(!size || size > PCPU_MIN_UNIT_SIZE || align > PAGE_SIZE)) {
715 WARN(true, "illegal size (%zu) or align (%zu) for "
716 "percpu allocation\n", size, align);
717 return NULL;
718 }
719
720 mutex_lock(&pcpu_alloc_mutex);
721 spin_lock_irqsave(&pcpu_lock, flags);
722
723
724 if (reserved && pcpu_reserved_chunk) {
725 chunk = pcpu_reserved_chunk;
726
727 if (size > chunk->contig_hint) {
728 err = "alloc from reserved chunk failed";
729 goto fail_unlock;
730 }
731
732 while ((new_alloc = pcpu_need_to_extend(chunk))) {
733 spin_unlock_irqrestore(&pcpu_lock, flags);
734 if (pcpu_extend_area_map(chunk, new_alloc) < 0) {
735 err = "failed to extend area map of reserved chunk";
736 goto fail_unlock_mutex;
737 }
738 spin_lock_irqsave(&pcpu_lock, flags);
739 }
740
741 off = pcpu_alloc_area(chunk, size, align);
742 if (off >= 0)
743 goto area_found;
744
745 err = "alloc from reserved chunk failed";
746 goto fail_unlock;
747 }
748
749restart:
750
751 for (slot = pcpu_size_to_slot(size); slot < pcpu_nr_slots; slot++) {
752 list_for_each_entry(chunk, &pcpu_slot[slot], list) {
753 if (size > chunk->contig_hint)
754 continue;
755
756 new_alloc = pcpu_need_to_extend(chunk);
757 if (new_alloc) {
758 spin_unlock_irqrestore(&pcpu_lock, flags);
759 if (pcpu_extend_area_map(chunk,
760 new_alloc) < 0) {
761 err = "failed to extend area map";
762 goto fail_unlock_mutex;
763 }
764 spin_lock_irqsave(&pcpu_lock, flags);
765
766
767
768
769 goto restart;
770 }
771
772 off = pcpu_alloc_area(chunk, size, align);
773 if (off >= 0)
774 goto area_found;
775 }
776 }
777
778
779 spin_unlock_irqrestore(&pcpu_lock, flags);
780
781 chunk = pcpu_create_chunk();
782 if (!chunk) {
783 err = "failed to allocate new chunk";
784 goto fail_unlock_mutex;
785 }
786
787 spin_lock_irqsave(&pcpu_lock, flags);
788 pcpu_chunk_relocate(chunk, -1);
789 goto restart;
790
791area_found:
792 spin_unlock_irqrestore(&pcpu_lock, flags);
793
794
795 if (pcpu_populate_chunk(chunk, off, size)) {
796 spin_lock_irqsave(&pcpu_lock, flags);
797 pcpu_free_area(chunk, off);
798 err = "failed to populate";
799 goto fail_unlock;
800 }
801
802 mutex_unlock(&pcpu_alloc_mutex);
803
804
805 return __addr_to_pcpu_ptr(chunk->base_addr + off);
806
807fail_unlock:
808 spin_unlock_irqrestore(&pcpu_lock, flags);
809fail_unlock_mutex:
810 mutex_unlock(&pcpu_alloc_mutex);
811 if (warn_limit) {
812 pr_warning("PERCPU: allocation failed, size=%zu align=%zu, "
813 "%s\n", size, align, err);
814 dump_stack();
815 if (!--warn_limit)
816 pr_info("PERCPU: limit reached, disable warning\n");
817 }
818 return NULL;
819}
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835void __percpu *__alloc_percpu(size_t size, size_t align)
836{
837 return pcpu_alloc(size, align, false);
838}
839EXPORT_SYMBOL_GPL(__alloc_percpu);
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857void __percpu *__alloc_reserved_percpu(size_t size, size_t align)
858{
859 return pcpu_alloc(size, align, true);
860}
861
862
863
864
865
866
867
868
869
870
871static void pcpu_reclaim(struct work_struct *work)
872{
873 LIST_HEAD(todo);
874 struct list_head *head = &pcpu_slot[pcpu_nr_slots - 1];
875 struct pcpu_chunk *chunk, *next;
876
877 mutex_lock(&pcpu_alloc_mutex);
878 spin_lock_irq(&pcpu_lock);
879
880 list_for_each_entry_safe(chunk, next, head, list) {
881 WARN_ON(chunk->immutable);
882
883
884 if (chunk == list_first_entry(head, struct pcpu_chunk, list))
885 continue;
886
887 list_move(&chunk->list, &todo);
888 }
889
890 spin_unlock_irq(&pcpu_lock);
891
892 list_for_each_entry_safe(chunk, next, &todo, list) {
893 pcpu_depopulate_chunk(chunk, 0, pcpu_unit_size);
894 pcpu_destroy_chunk(chunk);
895 }
896
897 mutex_unlock(&pcpu_alloc_mutex);
898}
899
900
901
902
903
904
905
906
907
908
909void free_percpu(void __percpu *ptr)
910{
911 void *addr;
912 struct pcpu_chunk *chunk;
913 unsigned long flags;
914 int off;
915
916 if (!ptr)
917 return;
918
919 addr = __pcpu_ptr_to_addr(ptr);
920
921 spin_lock_irqsave(&pcpu_lock, flags);
922
923 chunk = pcpu_chunk_addr_search(addr);
924 off = addr - chunk->base_addr;
925
926 pcpu_free_area(chunk, off);
927
928
929 if (chunk->free_size == pcpu_unit_size) {
930 struct pcpu_chunk *pos;
931
932 list_for_each_entry(pos, &pcpu_slot[pcpu_nr_slots - 1], list)
933 if (pos != chunk) {
934 schedule_work(&pcpu_reclaim_work);
935 break;
936 }
937 }
938
939 spin_unlock_irqrestore(&pcpu_lock, flags);
940}
941EXPORT_SYMBOL_GPL(free_percpu);
942
943
944
945
946
947
948
949
950
951
952
953
954bool is_kernel_percpu_address(unsigned long addr)
955{
956#ifdef CONFIG_SMP
957 const size_t static_size = __per_cpu_end - __per_cpu_start;
958 void __percpu *base = __addr_to_pcpu_ptr(pcpu_base_addr);
959 unsigned int cpu;
960
961 for_each_possible_cpu(cpu) {
962 void *start = per_cpu_ptr(base, cpu);
963
964 if ((void *)addr >= start && (void *)addr < start + static_size)
965 return true;
966 }
967#endif
968
969 return false;
970}
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995phys_addr_t per_cpu_ptr_to_phys(void *addr)
996{
997 void __percpu *base = __addr_to_pcpu_ptr(pcpu_base_addr);
998 bool in_first_chunk = false;
999 unsigned long first_low, first_high;
1000 unsigned int cpu;
1001
1002
1003
1004
1005
1006
1007 first_low = pcpu_chunk_addr(pcpu_first_chunk, pcpu_low_unit_cpu, 0);
1008 first_high = pcpu_chunk_addr(pcpu_first_chunk, pcpu_high_unit_cpu,
1009 pcpu_unit_pages);
1010 if ((unsigned long)addr >= first_low &&
1011 (unsigned long)addr < first_high) {
1012 for_each_possible_cpu(cpu) {
1013 void *start = per_cpu_ptr(base, cpu);
1014
1015 if (addr >= start && addr < start + pcpu_unit_size) {
1016 in_first_chunk = true;
1017 break;
1018 }
1019 }
1020 }
1021
1022 if (in_first_chunk) {
1023 if (!is_vmalloc_addr(addr))
1024 return __pa(addr);
1025 else
1026 return page_to_phys(vmalloc_to_page(addr)) +
1027 offset_in_page(addr);
1028 } else
1029 return page_to_phys(pcpu_addr_to_page(addr)) +
1030 offset_in_page(addr);
1031}
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048struct pcpu_alloc_info * __init pcpu_alloc_alloc_info(int nr_groups,
1049 int nr_units)
1050{
1051 struct pcpu_alloc_info *ai;
1052 size_t base_size, ai_size;
1053 void *ptr;
1054 int unit;
1055
1056 base_size = ALIGN(sizeof(*ai) + nr_groups * sizeof(ai->groups[0]),
1057 __alignof__(ai->groups[0].cpu_map[0]));
1058 ai_size = base_size + nr_units * sizeof(ai->groups[0].cpu_map[0]);
1059
1060 ptr = alloc_bootmem_nopanic(PFN_ALIGN(ai_size));
1061 if (!ptr)
1062 return NULL;
1063 ai = ptr;
1064 ptr += base_size;
1065
1066 ai->groups[0].cpu_map = ptr;
1067
1068 for (unit = 0; unit < nr_units; unit++)
1069 ai->groups[0].cpu_map[unit] = NR_CPUS;
1070
1071 ai->nr_groups = nr_groups;
1072 ai->__ai_size = PFN_ALIGN(ai_size);
1073
1074 return ai;
1075}
1076
1077
1078
1079
1080
1081
1082
1083void __init pcpu_free_alloc_info(struct pcpu_alloc_info *ai)
1084{
1085 free_bootmem(__pa(ai), ai->__ai_size);
1086}
1087
1088
1089
1090
1091
1092
1093
1094
1095static void pcpu_dump_alloc_info(const char *lvl,
1096 const struct pcpu_alloc_info *ai)
1097{
1098 int group_width = 1, cpu_width = 1, width;
1099 char empty_str[] = "--------";
1100 int alloc = 0, alloc_end = 0;
1101 int group, v;
1102 int upa, apl;
1103
1104 v = ai->nr_groups;
1105 while (v /= 10)
1106 group_width++;
1107
1108 v = num_possible_cpus();
1109 while (v /= 10)
1110 cpu_width++;
1111 empty_str[min_t(int, cpu_width, sizeof(empty_str) - 1)] = '\0';
1112
1113 upa = ai->alloc_size / ai->unit_size;
1114 width = upa * (cpu_width + 1) + group_width + 3;
1115 apl = rounddown_pow_of_two(max(60 / width, 1));
1116
1117 printk("%spcpu-alloc: s%zu r%zu d%zu u%zu alloc=%zu*%zu",
1118 lvl, ai->static_size, ai->reserved_size, ai->dyn_size,
1119 ai->unit_size, ai->alloc_size / ai->atom_size, ai->atom_size);
1120
1121 for (group = 0; group < ai->nr_groups; group++) {
1122 const struct pcpu_group_info *gi = &ai->groups[group];
1123 int unit = 0, unit_end = 0;
1124
1125 BUG_ON(gi->nr_units % upa);
1126 for (alloc_end += gi->nr_units / upa;
1127 alloc < alloc_end; alloc++) {
1128 if (!(alloc % apl)) {
1129 printk("\n");
1130 printk("%spcpu-alloc: ", lvl);
1131 }
1132 printk("[%0*d] ", group_width, group);
1133
1134 for (unit_end += upa; unit < unit_end; unit++)
1135 if (gi->cpu_map[unit] != NR_CPUS)
1136 printk("%0*d ", cpu_width,
1137 gi->cpu_map[unit]);
1138 else
1139 printk("%s ", empty_str);
1140 }
1141 }
1142 printk("\n");
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
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201int __init pcpu_setup_first_chunk(const struct pcpu_alloc_info *ai,
1202 void *base_addr)
1203{
1204 static char cpus_buf[4096] __initdata;
1205 static int smap[PERCPU_DYNAMIC_EARLY_SLOTS] __initdata;
1206 static int dmap[PERCPU_DYNAMIC_EARLY_SLOTS] __initdata;
1207 size_t dyn_size = ai->dyn_size;
1208 size_t size_sum = ai->static_size + ai->reserved_size + dyn_size;
1209 struct pcpu_chunk *schunk, *dchunk = NULL;
1210 unsigned long *group_offsets;
1211 size_t *group_sizes;
1212 unsigned long *unit_off;
1213 unsigned int cpu;
1214 int *unit_map;
1215 int group, unit, i;
1216
1217 cpumask_scnprintf(cpus_buf, sizeof(cpus_buf), cpu_possible_mask);
1218
1219#define PCPU_SETUP_BUG_ON(cond) do { \
1220 if (unlikely(cond)) { \
1221 pr_emerg("PERCPU: failed to initialize, %s", #cond); \
1222 pr_emerg("PERCPU: cpu_possible_mask=%s\n", cpus_buf); \
1223 pcpu_dump_alloc_info(KERN_EMERG, ai); \
1224 BUG(); \
1225 } \
1226} while (0)
1227
1228
1229 PCPU_SETUP_BUG_ON(ai->nr_groups <= 0);
1230#ifdef CONFIG_SMP
1231 PCPU_SETUP_BUG_ON(!ai->static_size);
1232 PCPU_SETUP_BUG_ON((unsigned long)__per_cpu_start & ~PAGE_MASK);
1233#endif
1234 PCPU_SETUP_BUG_ON(!base_addr);
1235 PCPU_SETUP_BUG_ON((unsigned long)base_addr & ~PAGE_MASK);
1236 PCPU_SETUP_BUG_ON(ai->unit_size < size_sum);
1237 PCPU_SETUP_BUG_ON(ai->unit_size & ~PAGE_MASK);
1238 PCPU_SETUP_BUG_ON(ai->unit_size < PCPU_MIN_UNIT_SIZE);
1239 PCPU_SETUP_BUG_ON(ai->dyn_size < PERCPU_DYNAMIC_EARLY_SIZE);
1240 PCPU_SETUP_BUG_ON(pcpu_verify_alloc_info(ai) < 0);
1241
1242
1243 group_offsets = alloc_bootmem(ai->nr_groups * sizeof(group_offsets[0]));
1244 group_sizes = alloc_bootmem(ai->nr_groups * sizeof(group_sizes[0]));
1245 unit_map = alloc_bootmem(nr_cpu_ids * sizeof(unit_map[0]));
1246 unit_off = alloc_bootmem(nr_cpu_ids * sizeof(unit_off[0]));
1247
1248 for (cpu = 0; cpu < nr_cpu_ids; cpu++)
1249 unit_map[cpu] = UINT_MAX;
1250
1251 pcpu_low_unit_cpu = NR_CPUS;
1252 pcpu_high_unit_cpu = NR_CPUS;
1253
1254 for (group = 0, unit = 0; group < ai->nr_groups; group++, unit += i) {
1255 const struct pcpu_group_info *gi = &ai->groups[group];
1256
1257 group_offsets[group] = gi->base_offset;
1258 group_sizes[group] = gi->nr_units * ai->unit_size;
1259
1260 for (i = 0; i < gi->nr_units; i++) {
1261 cpu = gi->cpu_map[i];
1262 if (cpu == NR_CPUS)
1263 continue;
1264
1265 PCPU_SETUP_BUG_ON(cpu > nr_cpu_ids);
1266 PCPU_SETUP_BUG_ON(!cpu_possible(cpu));
1267 PCPU_SETUP_BUG_ON(unit_map[cpu] != UINT_MAX);
1268
1269 unit_map[cpu] = unit + i;
1270 unit_off[cpu] = gi->base_offset + i * ai->unit_size;
1271
1272
1273 if (pcpu_low_unit_cpu == NR_CPUS ||
1274 unit_off[cpu] < unit_off[pcpu_low_unit_cpu])
1275 pcpu_low_unit_cpu = cpu;
1276 if (pcpu_high_unit_cpu == NR_CPUS ||
1277 unit_off[cpu] > unit_off[pcpu_high_unit_cpu])
1278 pcpu_high_unit_cpu = cpu;
1279 }
1280 }
1281 pcpu_nr_units = unit;
1282
1283 for_each_possible_cpu(cpu)
1284 PCPU_SETUP_BUG_ON(unit_map[cpu] == UINT_MAX);
1285
1286
1287#undef PCPU_SETUP_BUG_ON
1288 pcpu_dump_alloc_info(KERN_DEBUG, ai);
1289
1290 pcpu_nr_groups = ai->nr_groups;
1291 pcpu_group_offsets = group_offsets;
1292 pcpu_group_sizes = group_sizes;
1293 pcpu_unit_map = unit_map;
1294 pcpu_unit_offsets = unit_off;
1295
1296
1297 pcpu_unit_pages = ai->unit_size >> PAGE_SHIFT;
1298 pcpu_unit_size = pcpu_unit_pages << PAGE_SHIFT;
1299 pcpu_atom_size = ai->atom_size;
1300 pcpu_chunk_struct_size = sizeof(struct pcpu_chunk) +
1301 BITS_TO_LONGS(pcpu_unit_pages) * sizeof(unsigned long);
1302
1303
1304
1305
1306
1307 pcpu_nr_slots = __pcpu_size_to_slot(pcpu_unit_size) + 2;
1308 pcpu_slot = alloc_bootmem(pcpu_nr_slots * sizeof(pcpu_slot[0]));
1309 for (i = 0; i < pcpu_nr_slots; i++)
1310 INIT_LIST_HEAD(&pcpu_slot[i]);
1311
1312
1313
1314
1315
1316
1317
1318
1319 schunk = alloc_bootmem(pcpu_chunk_struct_size);
1320 INIT_LIST_HEAD(&schunk->list);
1321 schunk->base_addr = base_addr;
1322 schunk->map = smap;
1323 schunk->map_alloc = ARRAY_SIZE(smap);
1324 schunk->immutable = true;
1325 bitmap_fill(schunk->populated, pcpu_unit_pages);
1326
1327 if (ai->reserved_size) {
1328 schunk->free_size = ai->reserved_size;
1329 pcpu_reserved_chunk = schunk;
1330 pcpu_reserved_chunk_limit = ai->static_size + ai->reserved_size;
1331 } else {
1332 schunk->free_size = dyn_size;
1333 dyn_size = 0;
1334 }
1335 schunk->contig_hint = schunk->free_size;
1336
1337 schunk->map[schunk->map_used++] = -ai->static_size;
1338 if (schunk->free_size)
1339 schunk->map[schunk->map_used++] = schunk->free_size;
1340
1341
1342 if (dyn_size) {
1343 dchunk = alloc_bootmem(pcpu_chunk_struct_size);
1344 INIT_LIST_HEAD(&dchunk->list);
1345 dchunk->base_addr = base_addr;
1346 dchunk->map = dmap;
1347 dchunk->map_alloc = ARRAY_SIZE(dmap);
1348 dchunk->immutable = true;
1349 bitmap_fill(dchunk->populated, pcpu_unit_pages);
1350
1351 dchunk->contig_hint = dchunk->free_size = dyn_size;
1352 dchunk->map[dchunk->map_used++] = -pcpu_reserved_chunk_limit;
1353 dchunk->map[dchunk->map_used++] = dchunk->free_size;
1354 }
1355
1356
1357 pcpu_first_chunk = dchunk ?: schunk;
1358 pcpu_chunk_relocate(pcpu_first_chunk, -1);
1359
1360
1361 pcpu_base_addr = base_addr;
1362 return 0;
1363}
1364
1365#ifdef CONFIG_SMP
1366
1367const char *pcpu_fc_names[PCPU_FC_NR] __initdata = {
1368 [PCPU_FC_AUTO] = "auto",
1369 [PCPU_FC_EMBED] = "embed",
1370 [PCPU_FC_PAGE] = "page",
1371};
1372
1373enum pcpu_fc pcpu_chosen_fc __initdata = PCPU_FC_AUTO;
1374
1375static int __init percpu_alloc_setup(char *str)
1376{
1377 if (0)
1378 ;
1379#ifdef CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK
1380 else if (!strcmp(str, "embed"))
1381 pcpu_chosen_fc = PCPU_FC_EMBED;
1382#endif
1383#ifdef CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK
1384 else if (!strcmp(str, "page"))
1385 pcpu_chosen_fc = PCPU_FC_PAGE;
1386#endif
1387 else
1388 pr_warning("PERCPU: unknown allocator %s specified\n", str);
1389
1390 return 0;
1391}
1392early_param("percpu_alloc", percpu_alloc_setup);
1393
1394
1395
1396
1397
1398
1399#if defined(CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK) || \
1400 !defined(CONFIG_HAVE_SETUP_PER_CPU_AREA)
1401#define BUILD_EMBED_FIRST_CHUNK
1402#endif
1403
1404
1405#if defined(CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK)
1406#define BUILD_PAGE_FIRST_CHUNK
1407#endif
1408
1409
1410#if defined(BUILD_EMBED_FIRST_CHUNK) || defined(BUILD_PAGE_FIRST_CHUNK)
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432static struct pcpu_alloc_info * __init pcpu_build_alloc_info(
1433 size_t reserved_size, size_t dyn_size,
1434 size_t atom_size,
1435 pcpu_fc_cpu_distance_fn_t cpu_distance_fn)
1436{
1437 static int group_map[NR_CPUS] __initdata;
1438 static int group_cnt[NR_CPUS] __initdata;
1439 const size_t static_size = __per_cpu_end - __per_cpu_start;
1440 int nr_groups = 1, nr_units = 0;
1441 size_t size_sum, min_unit_size, alloc_size;
1442 int upa, max_upa, uninitialized_var(best_upa);
1443 int last_allocs, group, unit;
1444 unsigned int cpu, tcpu;
1445 struct pcpu_alloc_info *ai;
1446 unsigned int *cpu_map;
1447
1448
1449 memset(group_map, 0, sizeof(group_map));
1450 memset(group_cnt, 0, sizeof(group_cnt));
1451
1452
1453 size_sum = PFN_ALIGN(static_size + reserved_size +
1454 max_t(size_t, dyn_size, PERCPU_DYNAMIC_EARLY_SIZE));
1455 dyn_size = size_sum - static_size - reserved_size;
1456
1457
1458
1459
1460
1461
1462
1463 min_unit_size = max_t(size_t, size_sum, PCPU_MIN_UNIT_SIZE);
1464
1465 alloc_size = roundup(min_unit_size, atom_size);
1466 upa = alloc_size / min_unit_size;
1467 while (alloc_size % upa || ((alloc_size / upa) & ~PAGE_MASK))
1468 upa--;
1469 max_upa = upa;
1470
1471
1472 for_each_possible_cpu(cpu) {
1473 group = 0;
1474 next_group:
1475 for_each_possible_cpu(tcpu) {
1476 if (cpu == tcpu)
1477 break;
1478 if (group_map[tcpu] == group && cpu_distance_fn &&
1479 (cpu_distance_fn(cpu, tcpu) > LOCAL_DISTANCE ||
1480 cpu_distance_fn(tcpu, cpu) > LOCAL_DISTANCE)) {
1481 group++;
1482 nr_groups = max(nr_groups, group + 1);
1483 goto next_group;
1484 }
1485 }
1486 group_map[cpu] = group;
1487 group_cnt[group]++;
1488 }
1489
1490
1491
1492
1493
1494
1495 last_allocs = INT_MAX;
1496 for (upa = max_upa; upa; upa--) {
1497 int allocs = 0, wasted = 0;
1498
1499 if (alloc_size % upa || ((alloc_size / upa) & ~PAGE_MASK))
1500 continue;
1501
1502 for (group = 0; group < nr_groups; group++) {
1503 int this_allocs = DIV_ROUND_UP(group_cnt[group], upa);
1504 allocs += this_allocs;
1505 wasted += this_allocs * upa - group_cnt[group];
1506 }
1507
1508
1509
1510
1511
1512
1513 if (wasted > num_possible_cpus() / 3)
1514 continue;
1515
1516
1517 if (allocs > last_allocs)
1518 break;
1519 last_allocs = allocs;
1520 best_upa = upa;
1521 }
1522 upa = best_upa;
1523
1524
1525 for (group = 0; group < nr_groups; group++)
1526 nr_units += roundup(group_cnt[group], upa);
1527
1528 ai = pcpu_alloc_alloc_info(nr_groups, nr_units);
1529 if (!ai)
1530 return ERR_PTR(-ENOMEM);
1531 cpu_map = ai->groups[0].cpu_map;
1532
1533 for (group = 0; group < nr_groups; group++) {
1534 ai->groups[group].cpu_map = cpu_map;
1535 cpu_map += roundup(group_cnt[group], upa);
1536 }
1537
1538 ai->static_size = static_size;
1539 ai->reserved_size = reserved_size;
1540 ai->dyn_size = dyn_size;
1541 ai->unit_size = alloc_size / upa;
1542 ai->atom_size = atom_size;
1543 ai->alloc_size = alloc_size;
1544
1545 for (group = 0, unit = 0; group_cnt[group]; group++) {
1546 struct pcpu_group_info *gi = &ai->groups[group];
1547
1548
1549
1550
1551
1552
1553 gi->base_offset = unit * ai->unit_size;
1554
1555 for_each_possible_cpu(cpu)
1556 if (group_map[cpu] == group)
1557 gi->cpu_map[gi->nr_units++] = cpu;
1558 gi->nr_units = roundup(gi->nr_units, upa);
1559 unit += gi->nr_units;
1560 }
1561 BUG_ON(unit != nr_units);
1562
1563 return ai;
1564}
1565#endif
1566
1567#if defined(BUILD_EMBED_FIRST_CHUNK)
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600int __init pcpu_embed_first_chunk(size_t reserved_size, size_t dyn_size,
1601 size_t atom_size,
1602 pcpu_fc_cpu_distance_fn_t cpu_distance_fn,
1603 pcpu_fc_alloc_fn_t alloc_fn,
1604 pcpu_fc_free_fn_t free_fn)
1605{
1606 void *base = (void *)ULONG_MAX;
1607 void **areas = NULL;
1608 struct pcpu_alloc_info *ai;
1609 size_t size_sum, areas_size, max_distance;
1610 int group, i, rc;
1611
1612 ai = pcpu_build_alloc_info(reserved_size, dyn_size, atom_size,
1613 cpu_distance_fn);
1614 if (IS_ERR(ai))
1615 return PTR_ERR(ai);
1616
1617 size_sum = ai->static_size + ai->reserved_size + ai->dyn_size;
1618 areas_size = PFN_ALIGN(ai->nr_groups * sizeof(void *));
1619
1620 areas = alloc_bootmem_nopanic(areas_size);
1621 if (!areas) {
1622 rc = -ENOMEM;
1623 goto out_free;
1624 }
1625
1626
1627 for (group = 0; group < ai->nr_groups; group++) {
1628 struct pcpu_group_info *gi = &ai->groups[group];
1629 unsigned int cpu = NR_CPUS;
1630 void *ptr;
1631
1632 for (i = 0; i < gi->nr_units && cpu == NR_CPUS; i++)
1633 cpu = gi->cpu_map[i];
1634 BUG_ON(cpu == NR_CPUS);
1635
1636
1637 ptr = alloc_fn(cpu, gi->nr_units * ai->unit_size, atom_size);
1638 if (!ptr) {
1639 rc = -ENOMEM;
1640 goto out_free_areas;
1641 }
1642 areas[group] = ptr;
1643
1644 base = min(ptr, base);
1645
1646 for (i = 0; i < gi->nr_units; i++, ptr += ai->unit_size) {
1647 if (gi->cpu_map[i] == NR_CPUS) {
1648
1649 free_fn(ptr, ai->unit_size);
1650 continue;
1651 }
1652
1653 memcpy(ptr, __per_cpu_load, ai->static_size);
1654 free_fn(ptr + size_sum, ai->unit_size - size_sum);
1655 }
1656 }
1657
1658
1659 max_distance = 0;
1660 for (group = 0; group < ai->nr_groups; group++) {
1661 ai->groups[group].base_offset = areas[group] - base;
1662 max_distance = max_t(size_t, max_distance,
1663 ai->groups[group].base_offset);
1664 }
1665 max_distance += ai->unit_size;
1666
1667
1668 if (max_distance > (VMALLOC_END - VMALLOC_START) * 3 / 4) {
1669 pr_warning("PERCPU: max_distance=0x%zx too large for vmalloc "
1670 "space 0x%lx\n", max_distance,
1671 (unsigned long)(VMALLOC_END - VMALLOC_START));
1672#ifdef CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK
1673
1674 rc = -EINVAL;
1675 goto out_free;
1676#endif
1677 }
1678
1679 pr_info("PERCPU: Embedded %zu pages/cpu @%p s%zu r%zu d%zu u%zu\n",
1680 PFN_DOWN(size_sum), base, ai->static_size, ai->reserved_size,
1681 ai->dyn_size, ai->unit_size);
1682
1683 rc = pcpu_setup_first_chunk(ai, base);
1684 goto out_free;
1685
1686out_free_areas:
1687 for (group = 0; group < ai->nr_groups; group++)
1688 free_fn(areas[group],
1689 ai->groups[group].nr_units * ai->unit_size);
1690out_free:
1691 pcpu_free_alloc_info(ai);
1692 if (areas)
1693 free_bootmem(__pa(areas), areas_size);
1694 return rc;
1695}
1696#endif
1697
1698#ifdef BUILD_PAGE_FIRST_CHUNK
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715int __init pcpu_page_first_chunk(size_t reserved_size,
1716 pcpu_fc_alloc_fn_t alloc_fn,
1717 pcpu_fc_free_fn_t free_fn,
1718 pcpu_fc_populate_pte_fn_t populate_pte_fn)
1719{
1720 static struct vm_struct vm;
1721 struct pcpu_alloc_info *ai;
1722 char psize_str[16];
1723 int unit_pages;
1724 size_t pages_size;
1725 struct page **pages;
1726 int unit, i, j, rc;
1727
1728 snprintf(psize_str, sizeof(psize_str), "%luK", PAGE_SIZE >> 10);
1729
1730 ai = pcpu_build_alloc_info(reserved_size, 0, PAGE_SIZE, NULL);
1731 if (IS_ERR(ai))
1732 return PTR_ERR(ai);
1733 BUG_ON(ai->nr_groups != 1);
1734 BUG_ON(ai->groups[0].nr_units != num_possible_cpus());
1735
1736 unit_pages = ai->unit_size >> PAGE_SHIFT;
1737
1738
1739 pages_size = PFN_ALIGN(unit_pages * num_possible_cpus() *
1740 sizeof(pages[0]));
1741 pages = alloc_bootmem(pages_size);
1742
1743
1744 j = 0;
1745 for (unit = 0; unit < num_possible_cpus(); unit++)
1746 for (i = 0; i < unit_pages; i++) {
1747 unsigned int cpu = ai->groups[0].cpu_map[unit];
1748 void *ptr;
1749
1750 ptr = alloc_fn(cpu, PAGE_SIZE, PAGE_SIZE);
1751 if (!ptr) {
1752 pr_warning("PERCPU: failed to allocate %s page "
1753 "for cpu%u\n", psize_str, cpu);
1754 goto enomem;
1755 }
1756 pages[j++] = virt_to_page(ptr);
1757 }
1758
1759
1760 vm.flags = VM_ALLOC;
1761 vm.size = num_possible_cpus() * ai->unit_size;
1762 vm_area_register_early(&vm, PAGE_SIZE);
1763
1764 for (unit = 0; unit < num_possible_cpus(); unit++) {
1765 unsigned long unit_addr =
1766 (unsigned long)vm.addr + unit * ai->unit_size;
1767
1768 for (i = 0; i < unit_pages; i++)
1769 populate_pte_fn(unit_addr + (i << PAGE_SHIFT));
1770
1771
1772 rc = __pcpu_map_pages(unit_addr, &pages[unit * unit_pages],
1773 unit_pages);
1774 if (rc < 0)
1775 panic("failed to map percpu area, err=%d\n", rc);
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786 memcpy((void *)unit_addr, __per_cpu_load, ai->static_size);
1787 }
1788
1789
1790 pr_info("PERCPU: %d %s pages/cpu @%p s%zu r%zu d%zu\n",
1791 unit_pages, psize_str, vm.addr, ai->static_size,
1792 ai->reserved_size, ai->dyn_size);
1793
1794 rc = pcpu_setup_first_chunk(ai, vm.addr);
1795 goto out_free_ar;
1796
1797enomem:
1798 while (--j >= 0)
1799 free_fn(page_address(pages[j]), PAGE_SIZE);
1800 rc = -ENOMEM;
1801out_free_ar:
1802 free_bootmem(__pa(pages), pages_size);
1803 pcpu_free_alloc_info(ai);
1804 return rc;
1805}
1806#endif
1807
1808#ifndef CONFIG_HAVE_SETUP_PER_CPU_AREA
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821unsigned long __per_cpu_offset[NR_CPUS] __read_mostly;
1822EXPORT_SYMBOL(__per_cpu_offset);
1823
1824static void * __init pcpu_dfl_fc_alloc(unsigned int cpu, size_t size,
1825 size_t align)
1826{
1827 return __alloc_bootmem_nopanic(size, align, __pa(MAX_DMA_ADDRESS));
1828}
1829
1830static void __init pcpu_dfl_fc_free(void *ptr, size_t size)
1831{
1832 free_bootmem(__pa(ptr), size);
1833}
1834
1835void __init setup_per_cpu_areas(void)
1836{
1837 unsigned long delta;
1838 unsigned int cpu;
1839 int rc;
1840
1841
1842
1843
1844
1845 rc = pcpu_embed_first_chunk(PERCPU_MODULE_RESERVE,
1846 PERCPU_DYNAMIC_RESERVE, PAGE_SIZE, NULL,
1847 pcpu_dfl_fc_alloc, pcpu_dfl_fc_free);
1848 if (rc < 0)
1849 panic("Failed to initialize percpu areas.");
1850
1851 delta = (unsigned long)pcpu_base_addr - (unsigned long)__per_cpu_start;
1852 for_each_possible_cpu(cpu)
1853 __per_cpu_offset[cpu] = delta + pcpu_unit_offsets[cpu];
1854}
1855#endif
1856
1857#else
1858
1859
1860
1861
1862
1863
1864
1865
1866void __init setup_per_cpu_areas(void)
1867{
1868 const size_t unit_size =
1869 roundup_pow_of_two(max_t(size_t, PCPU_MIN_UNIT_SIZE,
1870 PERCPU_DYNAMIC_RESERVE));
1871 struct pcpu_alloc_info *ai;
1872 void *fc;
1873
1874 ai = pcpu_alloc_alloc_info(1, 1);
1875 fc = __alloc_bootmem(unit_size, PAGE_SIZE, __pa(MAX_DMA_ADDRESS));
1876 if (!ai || !fc)
1877 panic("Failed to allocate memory for percpu areas.");
1878
1879 ai->dyn_size = unit_size;
1880 ai->unit_size = unit_size;
1881 ai->atom_size = unit_size;
1882 ai->alloc_size = unit_size;
1883 ai->groups[0].nr_units = 1;
1884 ai->groups[0].cpu_map[0] = 0;
1885
1886 if (pcpu_setup_first_chunk(ai, fc) < 0)
1887 panic("Failed to initialize percpu areas.");
1888}
1889
1890#endif
1891
1892
1893
1894
1895
1896
1897
1898void __init percpu_init_late(void)
1899{
1900 struct pcpu_chunk *target_chunks[] =
1901 { pcpu_first_chunk, pcpu_reserved_chunk, NULL };
1902 struct pcpu_chunk *chunk;
1903 unsigned long flags;
1904 int i;
1905
1906 for (i = 0; (chunk = target_chunks[i]); i++) {
1907 int *map;
1908 const size_t size = PERCPU_DYNAMIC_EARLY_SLOTS * sizeof(map[0]);
1909
1910 BUILD_BUG_ON(size > PAGE_SIZE);
1911
1912 map = pcpu_mem_zalloc(size);
1913 BUG_ON(!map);
1914
1915 spin_lock_irqsave(&pcpu_lock, flags);
1916 memcpy(map, chunk->map, size);
1917 chunk->map = map;
1918 spin_unlock_irqrestore(&pcpu_lock, flags);
1919 }
1920}
1921