diff options
Diffstat (limited to 'mm/vmalloc.c')
-rw-r--r-- | mm/vmalloc.c | 47 |
1 files changed, 20 insertions, 27 deletions
diff --git a/mm/vmalloc.c b/mm/vmalloc.c index 35f8553f893a..1ac191ce5641 100644 --- a/mm/vmalloc.c +++ b/mm/vmalloc.c | |||
@@ -24,6 +24,9 @@ | |||
24 | DEFINE_RWLOCK(vmlist_lock); | 24 | DEFINE_RWLOCK(vmlist_lock); |
25 | struct vm_struct *vmlist; | 25 | struct vm_struct *vmlist; |
26 | 26 | ||
27 | static void *__vmalloc_node(unsigned long size, gfp_t gfp_mask, pgprot_t prot, | ||
28 | int node); | ||
29 | |||
27 | static void vunmap_pte_range(pmd_t *pmd, unsigned long addr, unsigned long end) | 30 | static void vunmap_pte_range(pmd_t *pmd, unsigned long addr, unsigned long end) |
28 | { | 31 | { |
29 | pte_t *pte; | 32 | pte_t *pte; |
@@ -238,7 +241,6 @@ struct vm_struct *__get_vm_area(unsigned long size, unsigned long flags, | |||
238 | 241 | ||
239 | /** | 242 | /** |
240 | * get_vm_area - reserve a contingous kernel virtual area | 243 | * get_vm_area - reserve a contingous kernel virtual area |
241 | * | ||
242 | * @size: size of the area | 244 | * @size: size of the area |
243 | * @flags: %VM_IOREMAP for I/O mappings or VM_ALLOC | 245 | * @flags: %VM_IOREMAP for I/O mappings or VM_ALLOC |
244 | * | 246 | * |
@@ -270,7 +272,7 @@ static struct vm_struct *__find_vm_area(void *addr) | |||
270 | } | 272 | } |
271 | 273 | ||
272 | /* Caller must hold vmlist_lock */ | 274 | /* Caller must hold vmlist_lock */ |
273 | struct vm_struct *__remove_vm_area(void *addr) | 275 | static struct vm_struct *__remove_vm_area(void *addr) |
274 | { | 276 | { |
275 | struct vm_struct **p, *tmp; | 277 | struct vm_struct **p, *tmp; |
276 | 278 | ||
@@ -293,7 +295,6 @@ found: | |||
293 | 295 | ||
294 | /** | 296 | /** |
295 | * remove_vm_area - find and remove a contingous kernel virtual area | 297 | * remove_vm_area - find and remove a contingous kernel virtual area |
296 | * | ||
297 | * @addr: base address | 298 | * @addr: base address |
298 | * | 299 | * |
299 | * Search for the kernel VM area starting at @addr, and remove it. | 300 | * Search for the kernel VM area starting at @addr, and remove it. |
@@ -330,6 +331,8 @@ void __vunmap(void *addr, int deallocate_pages) | |||
330 | return; | 331 | return; |
331 | } | 332 | } |
332 | 333 | ||
334 | debug_check_no_locks_freed(addr, area->size); | ||
335 | |||
333 | if (deallocate_pages) { | 336 | if (deallocate_pages) { |
334 | int i; | 337 | int i; |
335 | 338 | ||
@@ -338,7 +341,7 @@ void __vunmap(void *addr, int deallocate_pages) | |||
338 | __free_page(area->pages[i]); | 341 | __free_page(area->pages[i]); |
339 | } | 342 | } |
340 | 343 | ||
341 | if (area->nr_pages > PAGE_SIZE/sizeof(struct page *)) | 344 | if (area->flags & VM_VPAGES) |
342 | vfree(area->pages); | 345 | vfree(area->pages); |
343 | else | 346 | else |
344 | kfree(area->pages); | 347 | kfree(area->pages); |
@@ -350,7 +353,6 @@ void __vunmap(void *addr, int deallocate_pages) | |||
350 | 353 | ||
351 | /** | 354 | /** |
352 | * vfree - release memory allocated by vmalloc() | 355 | * vfree - release memory allocated by vmalloc() |
353 | * | ||
354 | * @addr: memory base address | 356 | * @addr: memory base address |
355 | * | 357 | * |
356 | * Free the virtually contiguous memory area starting at @addr, as | 358 | * Free the virtually contiguous memory area starting at @addr, as |
@@ -368,7 +370,6 @@ EXPORT_SYMBOL(vfree); | |||
368 | 370 | ||
369 | /** | 371 | /** |
370 | * vunmap - release virtual mapping obtained by vmap() | 372 | * vunmap - release virtual mapping obtained by vmap() |
371 | * | ||
372 | * @addr: memory base address | 373 | * @addr: memory base address |
373 | * | 374 | * |
374 | * Free the virtually contiguous memory area starting at @addr, | 375 | * Free the virtually contiguous memory area starting at @addr, |
@@ -385,7 +386,6 @@ EXPORT_SYMBOL(vunmap); | |||
385 | 386 | ||
386 | /** | 387 | /** |
387 | * vmap - map an array of pages into virtually contiguous space | 388 | * vmap - map an array of pages into virtually contiguous space |
388 | * | ||
389 | * @pages: array of page pointers | 389 | * @pages: array of page pointers |
390 | * @count: number of pages to map | 390 | * @count: number of pages to map |
391 | * @flags: vm_area->flags | 391 | * @flags: vm_area->flags |
@@ -425,9 +425,10 @@ void *__vmalloc_area_node(struct vm_struct *area, gfp_t gfp_mask, | |||
425 | 425 | ||
426 | area->nr_pages = nr_pages; | 426 | area->nr_pages = nr_pages; |
427 | /* Please note that the recursion is strictly bounded. */ | 427 | /* Please note that the recursion is strictly bounded. */ |
428 | if (array_size > PAGE_SIZE) | 428 | if (array_size > PAGE_SIZE) { |
429 | pages = __vmalloc_node(array_size, gfp_mask, PAGE_KERNEL, node); | 429 | pages = __vmalloc_node(array_size, gfp_mask, PAGE_KERNEL, node); |
430 | else | 430 | area->flags |= VM_VPAGES; |
431 | } else | ||
431 | pages = kmalloc_node(array_size, (gfp_mask & ~__GFP_HIGHMEM), node); | 432 | pages = kmalloc_node(array_size, (gfp_mask & ~__GFP_HIGHMEM), node); |
432 | area->pages = pages; | 433 | area->pages = pages; |
433 | if (!area->pages) { | 434 | if (!area->pages) { |
@@ -465,7 +466,6 @@ void *__vmalloc_area(struct vm_struct *area, gfp_t gfp_mask, pgprot_t prot) | |||
465 | 466 | ||
466 | /** | 467 | /** |
467 | * __vmalloc_node - allocate virtually contiguous memory | 468 | * __vmalloc_node - allocate virtually contiguous memory |
468 | * | ||
469 | * @size: allocation size | 469 | * @size: allocation size |
470 | * @gfp_mask: flags for the page level allocator | 470 | * @gfp_mask: flags for the page level allocator |
471 | * @prot: protection mask for the allocated pages | 471 | * @prot: protection mask for the allocated pages |
@@ -475,8 +475,8 @@ void *__vmalloc_area(struct vm_struct *area, gfp_t gfp_mask, pgprot_t prot) | |||
475 | * allocator with @gfp_mask flags. Map them into contiguous | 475 | * allocator with @gfp_mask flags. Map them into contiguous |
476 | * kernel virtual space, using a pagetable protection of @prot. | 476 | * kernel virtual space, using a pagetable protection of @prot. |
477 | */ | 477 | */ |
478 | void *__vmalloc_node(unsigned long size, gfp_t gfp_mask, pgprot_t prot, | 478 | static void *__vmalloc_node(unsigned long size, gfp_t gfp_mask, pgprot_t prot, |
479 | int node) | 479 | int node) |
480 | { | 480 | { |
481 | struct vm_struct *area; | 481 | struct vm_struct *area; |
482 | 482 | ||
@@ -490,7 +490,6 @@ void *__vmalloc_node(unsigned long size, gfp_t gfp_mask, pgprot_t prot, | |||
490 | 490 | ||
491 | return __vmalloc_area_node(area, gfp_mask, prot, node); | 491 | return __vmalloc_area_node(area, gfp_mask, prot, node); |
492 | } | 492 | } |
493 | EXPORT_SYMBOL(__vmalloc_node); | ||
494 | 493 | ||
495 | void *__vmalloc(unsigned long size, gfp_t gfp_mask, pgprot_t prot) | 494 | void *__vmalloc(unsigned long size, gfp_t gfp_mask, pgprot_t prot) |
496 | { | 495 | { |
@@ -500,9 +499,7 @@ EXPORT_SYMBOL(__vmalloc); | |||
500 | 499 | ||
501 | /** | 500 | /** |
502 | * vmalloc - allocate virtually contiguous memory | 501 | * vmalloc - allocate virtually contiguous memory |
503 | * | ||
504 | * @size: allocation size | 502 | * @size: allocation size |
505 | * | ||
506 | * Allocate enough pages to cover @size from the page level | 503 | * Allocate enough pages to cover @size from the page level |
507 | * allocator and map them into contiguous kernel virtual space. | 504 | * allocator and map them into contiguous kernel virtual space. |
508 | * | 505 | * |
@@ -516,11 +513,11 @@ void *vmalloc(unsigned long size) | |||
516 | EXPORT_SYMBOL(vmalloc); | 513 | EXPORT_SYMBOL(vmalloc); |
517 | 514 | ||
518 | /** | 515 | /** |
519 | * vmalloc_user - allocate virtually contiguous memory which has | 516 | * vmalloc_user - allocate zeroed virtually contiguous memory for userspace |
520 | * been zeroed so it can be mapped to userspace without | 517 | * @size: allocation size |
521 | * leaking data. | ||
522 | * | 518 | * |
523 | * @size: allocation size | 519 | * The resulting memory area is zeroed so it can be mapped to userspace |
520 | * without leaking data. | ||
524 | */ | 521 | */ |
525 | void *vmalloc_user(unsigned long size) | 522 | void *vmalloc_user(unsigned long size) |
526 | { | 523 | { |
@@ -539,7 +536,6 @@ EXPORT_SYMBOL(vmalloc_user); | |||
539 | 536 | ||
540 | /** | 537 | /** |
541 | * vmalloc_node - allocate memory on a specific node | 538 | * vmalloc_node - allocate memory on a specific node |
542 | * | ||
543 | * @size: allocation size | 539 | * @size: allocation size |
544 | * @node: numa node | 540 | * @node: numa node |
545 | * | 541 | * |
@@ -561,7 +557,6 @@ EXPORT_SYMBOL(vmalloc_node); | |||
561 | 557 | ||
562 | /** | 558 | /** |
563 | * vmalloc_exec - allocate virtually contiguous, executable memory | 559 | * vmalloc_exec - allocate virtually contiguous, executable memory |
564 | * | ||
565 | * @size: allocation size | 560 | * @size: allocation size |
566 | * | 561 | * |
567 | * Kernel-internal function to allocate enough pages to cover @size | 562 | * Kernel-internal function to allocate enough pages to cover @size |
@@ -579,7 +574,6 @@ void *vmalloc_exec(unsigned long size) | |||
579 | 574 | ||
580 | /** | 575 | /** |
581 | * vmalloc_32 - allocate virtually contiguous memory (32bit addressable) | 576 | * vmalloc_32 - allocate virtually contiguous memory (32bit addressable) |
582 | * | ||
583 | * @size: allocation size | 577 | * @size: allocation size |
584 | * | 578 | * |
585 | * Allocate enough 32bit PA addressable pages to cover @size from the | 579 | * Allocate enough 32bit PA addressable pages to cover @size from the |
@@ -592,11 +586,11 @@ void *vmalloc_32(unsigned long size) | |||
592 | EXPORT_SYMBOL(vmalloc_32); | 586 | EXPORT_SYMBOL(vmalloc_32); |
593 | 587 | ||
594 | /** | 588 | /** |
595 | * vmalloc_32_user - allocate virtually contiguous memory (32bit | 589 | * vmalloc_32_user - allocate zeroed virtually contiguous 32bit memory |
596 | * addressable) which is zeroed so it can be | ||
597 | * mapped to userspace without leaking data. | ||
598 | * | ||
599 | * @size: allocation size | 590 | * @size: allocation size |
591 | * | ||
592 | * The resulting memory area is 32bit addressable and zeroed so it can be | ||
593 | * mapped to userspace without leaking data. | ||
600 | */ | 594 | */ |
601 | void *vmalloc_32_user(unsigned long size) | 595 | void *vmalloc_32_user(unsigned long size) |
602 | { | 596 | { |
@@ -690,7 +684,6 @@ finished: | |||
690 | 684 | ||
691 | /** | 685 | /** |
692 | * remap_vmalloc_range - map vmalloc pages to userspace | 686 | * remap_vmalloc_range - map vmalloc pages to userspace |
693 | * | ||
694 | * @vma: vma to cover (map full range of vma) | 687 | * @vma: vma to cover (map full range of vma) |
695 | * @addr: vmalloc memory | 688 | * @addr: vmalloc memory |
696 | * @pgoff: number of pages into addr before first page to map | 689 | * @pgoff: number of pages into addr before first page to map |