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