Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
percpu-vm.c
Go to the documentation of this file.
1 /*
2  * mm/percpu-vm.c - vmalloc area based chunk allocation
3  *
4  * Copyright (C) 2010 SUSE Linux Products GmbH
5  * Copyright (C) 2010 Tejun Heo <[email protected]>
6  *
7  * This file is released under the GPLv2.
8  *
9  * Chunks are mapped into vmalloc areas and populated page by page.
10  * This is the default chunk allocator.
11  */
12 
13 static struct page *pcpu_chunk_page(struct pcpu_chunk *chunk,
14  unsigned int cpu, int page_idx)
15 {
16  /* must not be used on pre-mapped chunk */
17  WARN_ON(chunk->immutable);
18 
19  return vmalloc_to_page((void *)pcpu_chunk_addr(chunk, cpu, page_idx));
20 }
21 
41 static struct page **pcpu_get_pages_and_bitmap(struct pcpu_chunk *chunk,
42  unsigned long **bitmapp,
43  bool may_alloc)
44 {
45  static struct page **pages;
46  static unsigned long *bitmap;
47  size_t pages_size = pcpu_nr_units * pcpu_unit_pages * sizeof(pages[0]);
48  size_t bitmap_size = BITS_TO_LONGS(pcpu_unit_pages) *
49  sizeof(unsigned long);
50 
51  if (!pages || !bitmap) {
52  if (may_alloc && !pages)
53  pages = pcpu_mem_zalloc(pages_size);
54  if (may_alloc && !bitmap)
55  bitmap = pcpu_mem_zalloc(bitmap_size);
56  if (!pages || !bitmap)
57  return NULL;
58  }
59 
60  bitmap_copy(bitmap, chunk->populated, pcpu_unit_pages);
61 
62  *bitmapp = bitmap;
63  return pages;
64 }
65 
77 static void pcpu_free_pages(struct pcpu_chunk *chunk,
78  struct page **pages, unsigned long *populated,
79  int page_start, int page_end)
80 {
81  unsigned int cpu;
82  int i;
83 
85  for (i = page_start; i < page_end; i++) {
86  struct page *page = pages[pcpu_page_idx(cpu, i)];
87 
88  if (page)
89  __free_page(page);
90  }
91  }
92 }
93 
106 static int pcpu_alloc_pages(struct pcpu_chunk *chunk,
107  struct page **pages, unsigned long *populated,
108  int page_start, int page_end)
109 {
110  const gfp_t gfp = GFP_KERNEL | __GFP_HIGHMEM | __GFP_COLD;
111  unsigned int cpu;
112  int i;
113 
114  for_each_possible_cpu(cpu) {
115  for (i = page_start; i < page_end; i++) {
116  struct page **pagep = &pages[pcpu_page_idx(cpu, i)];
117 
118  *pagep = alloc_pages_node(cpu_to_node(cpu), gfp, 0);
119  if (!*pagep) {
120  pcpu_free_pages(chunk, pages, populated,
121  page_start, page_end);
122  return -ENOMEM;
123  }
124  }
125  }
126  return 0;
127 }
128 
141 static void pcpu_pre_unmap_flush(struct pcpu_chunk *chunk,
142  int page_start, int page_end)
143 {
145  pcpu_chunk_addr(chunk, pcpu_low_unit_cpu, page_start),
146  pcpu_chunk_addr(chunk, pcpu_high_unit_cpu, page_end));
147 }
148 
149 static void __pcpu_unmap_pages(unsigned long addr, int nr_pages)
150 {
151  unmap_kernel_range_noflush(addr, nr_pages << PAGE_SHIFT);
152 }
153 
168 static void pcpu_unmap_pages(struct pcpu_chunk *chunk,
169  struct page **pages, unsigned long *populated,
170  int page_start, int page_end)
171 {
172  unsigned int cpu;
173  int i;
174 
175  for_each_possible_cpu(cpu) {
176  for (i = page_start; i < page_end; i++) {
177  struct page *page;
178 
179  page = pcpu_chunk_page(chunk, cpu, i);
180  WARN_ON(!page);
181  pages[pcpu_page_idx(cpu, i)] = page;
182  }
183  __pcpu_unmap_pages(pcpu_chunk_addr(chunk, cpu, page_start),
184  page_end - page_start);
185  }
186 
187  bitmap_clear(populated, page_start, page_end - page_start);
188 }
189 
203 static void pcpu_post_unmap_tlb_flush(struct pcpu_chunk *chunk,
204  int page_start, int page_end)
205 {
207  pcpu_chunk_addr(chunk, pcpu_low_unit_cpu, page_start),
208  pcpu_chunk_addr(chunk, pcpu_high_unit_cpu, page_end));
209 }
210 
211 static int __pcpu_map_pages(unsigned long addr, struct page **pages,
212  int nr_pages)
213 {
214  return map_kernel_range_noflush(addr, nr_pages << PAGE_SHIFT,
215  PAGE_KERNEL, pages);
216 }
217 
234 static int pcpu_map_pages(struct pcpu_chunk *chunk,
235  struct page **pages, unsigned long *populated,
236  int page_start, int page_end)
237 {
238  unsigned int cpu, tcpu;
239  int i, err;
240 
241  for_each_possible_cpu(cpu) {
242  err = __pcpu_map_pages(pcpu_chunk_addr(chunk, cpu, page_start),
243  &pages[pcpu_page_idx(cpu, page_start)],
244  page_end - page_start);
245  if (err < 0)
246  goto err;
247  }
248 
249  /* mapping successful, link chunk and mark populated */
250  for (i = page_start; i < page_end; i++) {
252  pcpu_set_page_chunk(pages[pcpu_page_idx(cpu, i)],
253  chunk);
254  __set_bit(i, populated);
255  }
256 
257  return 0;
258 
259 err:
260  for_each_possible_cpu(tcpu) {
261  if (tcpu == cpu)
262  break;
263  __pcpu_unmap_pages(pcpu_chunk_addr(chunk, tcpu, page_start),
264  page_end - page_start);
265  }
266  return err;
267 }
268 
281 static void pcpu_post_map_flush(struct pcpu_chunk *chunk,
282  int page_start, int page_end)
283 {
285  pcpu_chunk_addr(chunk, pcpu_low_unit_cpu, page_start),
286  pcpu_chunk_addr(chunk, pcpu_high_unit_cpu, page_end));
287 }
288 
301 static int pcpu_populate_chunk(struct pcpu_chunk *chunk, int off, int size)
302 {
303  int page_start = PFN_DOWN(off);
304  int page_end = PFN_UP(off + size);
305  int free_end = page_start, unmap_end = page_start;
306  struct page **pages;
307  unsigned long *populated;
308  unsigned int cpu;
309  int rs, re, rc;
310 
311  /* quick path, check whether all pages are already there */
312  rs = page_start;
313  pcpu_next_pop(chunk, &rs, &re, page_end);
314  if (rs == page_start && re == page_end)
315  goto clear;
316 
317  /* need to allocate and map pages, this chunk can't be immutable */
318  WARN_ON(chunk->immutable);
319 
320  pages = pcpu_get_pages_and_bitmap(chunk, &populated, true);
321  if (!pages)
322  return -ENOMEM;
323 
324  /* alloc and map */
325  pcpu_for_each_unpop_region(chunk, rs, re, page_start, page_end) {
326  rc = pcpu_alloc_pages(chunk, pages, populated, rs, re);
327  if (rc)
328  goto err_free;
329  free_end = re;
330  }
331 
332  pcpu_for_each_unpop_region(chunk, rs, re, page_start, page_end) {
333  rc = pcpu_map_pages(chunk, pages, populated, rs, re);
334  if (rc)
335  goto err_unmap;
336  unmap_end = re;
337  }
338  pcpu_post_map_flush(chunk, page_start, page_end);
339 
340  /* commit new bitmap */
341  bitmap_copy(chunk->populated, populated, pcpu_unit_pages);
342 clear:
344  memset((void *)pcpu_chunk_addr(chunk, cpu, 0) + off, 0, size);
345  return 0;
346 
347 err_unmap:
348  pcpu_pre_unmap_flush(chunk, page_start, unmap_end);
349  pcpu_for_each_unpop_region(chunk, rs, re, page_start, unmap_end)
350  pcpu_unmap_pages(chunk, pages, populated, rs, re);
351  pcpu_post_unmap_tlb_flush(chunk, page_start, unmap_end);
352 err_free:
353  pcpu_for_each_unpop_region(chunk, rs, re, page_start, free_end)
354  pcpu_free_pages(chunk, pages, populated, rs, re);
355  return rc;
356 }
357 
371 static void pcpu_depopulate_chunk(struct pcpu_chunk *chunk, int off, int size)
372 {
373  int page_start = PFN_DOWN(off);
374  int page_end = PFN_UP(off + size);
375  struct page **pages;
376  unsigned long *populated;
377  int rs, re;
378 
379  /* quick path, check whether it's empty already */
380  rs = page_start;
381  pcpu_next_unpop(chunk, &rs, &re, page_end);
382  if (rs == page_start && re == page_end)
383  return;
384 
385  /* immutable chunks can't be depopulated */
386  WARN_ON(chunk->immutable);
387 
388  /*
389  * If control reaches here, there must have been at least one
390  * successful population attempt so the temp pages array must
391  * be available now.
392  */
393  pages = pcpu_get_pages_and_bitmap(chunk, &populated, false);
394  BUG_ON(!pages);
395 
396  /* unmap and free */
397  pcpu_pre_unmap_flush(chunk, page_start, page_end);
398 
399  pcpu_for_each_pop_region(chunk, rs, re, page_start, page_end)
400  pcpu_unmap_pages(chunk, pages, populated, rs, re);
401 
402  /* no need to flush tlb, vmalloc will handle it lazily */
403 
404  pcpu_for_each_pop_region(chunk, rs, re, page_start, page_end)
405  pcpu_free_pages(chunk, pages, populated, rs, re);
406 
407  /* commit new bitmap */
408  bitmap_copy(chunk->populated, populated, pcpu_unit_pages);
409 }
410 
411 static struct pcpu_chunk *pcpu_create_chunk(void)
412 {
413  struct pcpu_chunk *chunk;
414  struct vm_struct **vms;
415 
416  chunk = pcpu_alloc_chunk();
417  if (!chunk)
418  return NULL;
419 
420  vms = pcpu_get_vm_areas(pcpu_group_offsets, pcpu_group_sizes,
421  pcpu_nr_groups, pcpu_atom_size);
422  if (!vms) {
423  pcpu_free_chunk(chunk);
424  return NULL;
425  }
426 
427  chunk->data = vms;
428  chunk->base_addr = vms[0]->addr - pcpu_group_offsets[0];
429  return chunk;
430 }
431 
432 static void pcpu_destroy_chunk(struct pcpu_chunk *chunk)
433 {
434  if (chunk && chunk->data)
435  pcpu_free_vm_areas(chunk->data, pcpu_nr_groups);
436  pcpu_free_chunk(chunk);
437 }
438 
439 static struct page *pcpu_addr_to_page(void *addr)
440 {
441  return vmalloc_to_page(addr);
442 }
443 
444 static int __init pcpu_verify_alloc_info(const struct pcpu_alloc_info *ai)
445 {
446  /* no extra restriction */
447  return 0;
448 }