0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011 #include "internal.h"
0012
0013 static struct page *pcpu_chunk_page(struct pcpu_chunk *chunk,
0014 unsigned int cpu, int page_idx)
0015 {
0016
0017 WARN_ON(chunk->immutable);
0018
0019 return vmalloc_to_page((void *)pcpu_chunk_addr(chunk, cpu, page_idx));
0020 }
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032 static struct page **pcpu_get_pages(void)
0033 {
0034 static struct page **pages;
0035 size_t pages_size = pcpu_nr_units * pcpu_unit_pages * sizeof(pages[0]);
0036
0037 lockdep_assert_held(&pcpu_alloc_mutex);
0038
0039 if (!pages)
0040 pages = pcpu_mem_zalloc(pages_size, GFP_KERNEL);
0041 return pages;
0042 }
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054 static void pcpu_free_pages(struct pcpu_chunk *chunk,
0055 struct page **pages, int page_start, int page_end)
0056 {
0057 unsigned int cpu;
0058 int i;
0059
0060 for_each_possible_cpu(cpu) {
0061 for (i = page_start; i < page_end; i++) {
0062 struct page *page = pages[pcpu_page_idx(cpu, i)];
0063
0064 if (page)
0065 __free_page(page);
0066 }
0067 }
0068 }
0069
0070
0071
0072
0073
0074
0075
0076
0077
0078
0079
0080
0081
0082 static int pcpu_alloc_pages(struct pcpu_chunk *chunk,
0083 struct page **pages, int page_start, int page_end,
0084 gfp_t gfp)
0085 {
0086 unsigned int cpu, tcpu;
0087 int i;
0088
0089 gfp |= __GFP_HIGHMEM;
0090
0091 for_each_possible_cpu(cpu) {
0092 for (i = page_start; i < page_end; i++) {
0093 struct page **pagep = &pages[pcpu_page_idx(cpu, i)];
0094
0095 *pagep = alloc_pages_node(cpu_to_node(cpu), gfp, 0);
0096 if (!*pagep)
0097 goto err;
0098 }
0099 }
0100 return 0;
0101
0102 err:
0103 while (--i >= page_start)
0104 __free_page(pages[pcpu_page_idx(cpu, i)]);
0105
0106 for_each_possible_cpu(tcpu) {
0107 if (tcpu == cpu)
0108 break;
0109 for (i = page_start; i < page_end; i++)
0110 __free_page(pages[pcpu_page_idx(tcpu, i)]);
0111 }
0112 return -ENOMEM;
0113 }
0114
0115
0116
0117
0118
0119
0120
0121
0122
0123
0124
0125
0126
0127 static void pcpu_pre_unmap_flush(struct pcpu_chunk *chunk,
0128 int page_start, int page_end)
0129 {
0130 flush_cache_vunmap(
0131 pcpu_chunk_addr(chunk, pcpu_low_unit_cpu, page_start),
0132 pcpu_chunk_addr(chunk, pcpu_high_unit_cpu, page_end));
0133 }
0134
0135 static void __pcpu_unmap_pages(unsigned long addr, int nr_pages)
0136 {
0137 vunmap_range_noflush(addr, addr + (nr_pages << PAGE_SHIFT));
0138 }
0139
0140
0141
0142
0143
0144
0145
0146
0147
0148
0149
0150
0151
0152
0153 static void pcpu_unmap_pages(struct pcpu_chunk *chunk,
0154 struct page **pages, int page_start, int page_end)
0155 {
0156 unsigned int cpu;
0157 int i;
0158
0159 for_each_possible_cpu(cpu) {
0160 for (i = page_start; i < page_end; i++) {
0161 struct page *page;
0162
0163 page = pcpu_chunk_page(chunk, cpu, i);
0164 WARN_ON(!page);
0165 pages[pcpu_page_idx(cpu, i)] = page;
0166 }
0167 __pcpu_unmap_pages(pcpu_chunk_addr(chunk, cpu, page_start),
0168 page_end - page_start);
0169 }
0170 }
0171
0172
0173
0174
0175
0176
0177
0178
0179
0180
0181
0182
0183
0184
0185 static void pcpu_post_unmap_tlb_flush(struct pcpu_chunk *chunk,
0186 int page_start, int page_end)
0187 {
0188 flush_tlb_kernel_range(
0189 pcpu_chunk_addr(chunk, pcpu_low_unit_cpu, page_start),
0190 pcpu_chunk_addr(chunk, pcpu_high_unit_cpu, page_end));
0191 }
0192
0193 static int __pcpu_map_pages(unsigned long addr, struct page **pages,
0194 int nr_pages)
0195 {
0196 return vmap_pages_range_noflush(addr, addr + (nr_pages << PAGE_SHIFT),
0197 PAGE_KERNEL, pages, PAGE_SHIFT);
0198 }
0199
0200
0201
0202
0203
0204
0205
0206
0207
0208
0209
0210
0211
0212
0213
0214 static int pcpu_map_pages(struct pcpu_chunk *chunk,
0215 struct page **pages, int page_start, int page_end)
0216 {
0217 unsigned int cpu, tcpu;
0218 int i, err;
0219
0220 for_each_possible_cpu(cpu) {
0221 err = __pcpu_map_pages(pcpu_chunk_addr(chunk, cpu, page_start),
0222 &pages[pcpu_page_idx(cpu, page_start)],
0223 page_end - page_start);
0224 if (err < 0)
0225 goto err;
0226
0227 for (i = page_start; i < page_end; i++)
0228 pcpu_set_page_chunk(pages[pcpu_page_idx(cpu, i)],
0229 chunk);
0230 }
0231 return 0;
0232 err:
0233 for_each_possible_cpu(tcpu) {
0234 if (tcpu == cpu)
0235 break;
0236 __pcpu_unmap_pages(pcpu_chunk_addr(chunk, tcpu, page_start),
0237 page_end - page_start);
0238 }
0239 pcpu_post_unmap_tlb_flush(chunk, page_start, page_end);
0240 return err;
0241 }
0242
0243
0244
0245
0246
0247
0248
0249
0250
0251
0252
0253
0254
0255 static void pcpu_post_map_flush(struct pcpu_chunk *chunk,
0256 int page_start, int page_end)
0257 {
0258 flush_cache_vmap(
0259 pcpu_chunk_addr(chunk, pcpu_low_unit_cpu, page_start),
0260 pcpu_chunk_addr(chunk, pcpu_high_unit_cpu, page_end));
0261 }
0262
0263
0264
0265
0266
0267
0268
0269
0270
0271
0272
0273
0274
0275
0276 static int pcpu_populate_chunk(struct pcpu_chunk *chunk,
0277 int page_start, int page_end, gfp_t gfp)
0278 {
0279 struct page **pages;
0280
0281 pages = pcpu_get_pages();
0282 if (!pages)
0283 return -ENOMEM;
0284
0285 if (pcpu_alloc_pages(chunk, pages, page_start, page_end, gfp))
0286 return -ENOMEM;
0287
0288 if (pcpu_map_pages(chunk, pages, page_start, page_end)) {
0289 pcpu_free_pages(chunk, pages, page_start, page_end);
0290 return -ENOMEM;
0291 }
0292 pcpu_post_map_flush(chunk, page_start, page_end);
0293
0294 return 0;
0295 }
0296
0297
0298
0299
0300
0301
0302
0303
0304
0305
0306
0307
0308
0309
0310
0311
0312 static void pcpu_depopulate_chunk(struct pcpu_chunk *chunk,
0313 int page_start, int page_end)
0314 {
0315 struct page **pages;
0316
0317
0318
0319
0320
0321
0322 pages = pcpu_get_pages();
0323 BUG_ON(!pages);
0324
0325
0326 pcpu_pre_unmap_flush(chunk, page_start, page_end);
0327
0328 pcpu_unmap_pages(chunk, pages, page_start, page_end);
0329
0330 pcpu_free_pages(chunk, pages, page_start, page_end);
0331 }
0332
0333 static struct pcpu_chunk *pcpu_create_chunk(gfp_t gfp)
0334 {
0335 struct pcpu_chunk *chunk;
0336 struct vm_struct **vms;
0337
0338 chunk = pcpu_alloc_chunk(gfp);
0339 if (!chunk)
0340 return NULL;
0341
0342 vms = pcpu_get_vm_areas(pcpu_group_offsets, pcpu_group_sizes,
0343 pcpu_nr_groups, pcpu_atom_size);
0344 if (!vms) {
0345 pcpu_free_chunk(chunk);
0346 return NULL;
0347 }
0348
0349 chunk->data = vms;
0350 chunk->base_addr = vms[0]->addr - pcpu_group_offsets[0];
0351
0352 pcpu_stats_chunk_alloc();
0353 trace_percpu_create_chunk(chunk->base_addr);
0354
0355 return chunk;
0356 }
0357
0358 static void pcpu_destroy_chunk(struct pcpu_chunk *chunk)
0359 {
0360 if (!chunk)
0361 return;
0362
0363 pcpu_stats_chunk_dealloc();
0364 trace_percpu_destroy_chunk(chunk->base_addr);
0365
0366 if (chunk->data)
0367 pcpu_free_vm_areas(chunk->data, pcpu_nr_groups);
0368 pcpu_free_chunk(chunk);
0369 }
0370
0371 static struct page *pcpu_addr_to_page(void *addr)
0372 {
0373 return vmalloc_to_page(addr);
0374 }
0375
0376 static int __init pcpu_verify_alloc_info(const struct pcpu_alloc_info *ai)
0377 {
0378
0379 return 0;
0380 }
0381
0382
0383
0384
0385
0386
0387
0388
0389
0390
0391
0392
0393
0394 static bool pcpu_should_reclaim_chunk(struct pcpu_chunk *chunk)
0395 {
0396
0397 if (chunk == pcpu_first_chunk || chunk == pcpu_reserved_chunk)
0398 return false;
0399
0400
0401
0402
0403
0404
0405
0406 return ((chunk->isolated && chunk->nr_empty_pop_pages) ||
0407 (pcpu_nr_empty_pop_pages >
0408 (PCPU_EMPTY_POP_PAGES_HIGH + chunk->nr_empty_pop_pages) &&
0409 chunk->nr_empty_pop_pages >= chunk->nr_pages / 4));
0410 }