diff options
Diffstat (limited to 'mm/vmalloc.c')
| -rw-r--r-- | mm/vmalloc.c | 22 |
1 files changed, 17 insertions, 5 deletions
diff --git a/mm/vmalloc.c b/mm/vmalloc.c index 30f826d484f0..1ddb77ba3995 100644 --- a/mm/vmalloc.c +++ b/mm/vmalloc.c | |||
| @@ -77,7 +77,6 @@ static void vunmap_page_range(unsigned long addr, unsigned long end) | |||
| 77 | 77 | ||
| 78 | BUG_ON(addr >= end); | 78 | BUG_ON(addr >= end); |
| 79 | pgd = pgd_offset_k(addr); | 79 | pgd = pgd_offset_k(addr); |
| 80 | flush_cache_vunmap(addr, end); | ||
| 81 | do { | 80 | do { |
| 82 | next = pgd_addr_end(addr, end); | 81 | next = pgd_addr_end(addr, end); |
| 83 | if (pgd_none_or_clear_bad(pgd)) | 82 | if (pgd_none_or_clear_bad(pgd)) |
| @@ -543,9 +542,10 @@ static void purge_vmap_area_lazy(void) | |||
| 543 | } | 542 | } |
| 544 | 543 | ||
| 545 | /* | 544 | /* |
| 546 | * Free and unmap a vmap area | 545 | * Free and unmap a vmap area, caller ensuring flush_cache_vunmap had been |
| 546 | * called for the correct range previously. | ||
| 547 | */ | 547 | */ |
| 548 | static void free_unmap_vmap_area(struct vmap_area *va) | 548 | static void free_unmap_vmap_area_noflush(struct vmap_area *va) |
| 549 | { | 549 | { |
| 550 | va->flags |= VM_LAZY_FREE; | 550 | va->flags |= VM_LAZY_FREE; |
| 551 | atomic_add((va->va_end - va->va_start) >> PAGE_SHIFT, &vmap_lazy_nr); | 551 | atomic_add((va->va_end - va->va_start) >> PAGE_SHIFT, &vmap_lazy_nr); |
| @@ -553,6 +553,15 @@ static void free_unmap_vmap_area(struct vmap_area *va) | |||
| 553 | try_purge_vmap_area_lazy(); | 553 | try_purge_vmap_area_lazy(); |
| 554 | } | 554 | } |
| 555 | 555 | ||
| 556 | /* | ||
| 557 | * Free and unmap a vmap area | ||
| 558 | */ | ||
| 559 | static void free_unmap_vmap_area(struct vmap_area *va) | ||
| 560 | { | ||
| 561 | flush_cache_vunmap(va->va_start, va->va_end); | ||
| 562 | free_unmap_vmap_area_noflush(va); | ||
| 563 | } | ||
| 564 | |||
| 556 | static struct vmap_area *find_vmap_area(unsigned long addr) | 565 | static struct vmap_area *find_vmap_area(unsigned long addr) |
| 557 | { | 566 | { |
| 558 | struct vmap_area *va; | 567 | struct vmap_area *va; |
| @@ -734,7 +743,7 @@ static void free_vmap_block(struct vmap_block *vb) | |||
| 734 | spin_unlock(&vmap_block_tree_lock); | 743 | spin_unlock(&vmap_block_tree_lock); |
| 735 | BUG_ON(tmp != vb); | 744 | BUG_ON(tmp != vb); |
| 736 | 745 | ||
| 737 | free_unmap_vmap_area(vb->va); | 746 | free_unmap_vmap_area_noflush(vb->va); |
| 738 | call_rcu(&vb->rcu_head, rcu_free_vb); | 747 | call_rcu(&vb->rcu_head, rcu_free_vb); |
| 739 | } | 748 | } |
| 740 | 749 | ||
| @@ -796,6 +805,9 @@ static void vb_free(const void *addr, unsigned long size) | |||
| 796 | 805 | ||
| 797 | BUG_ON(size & ~PAGE_MASK); | 806 | BUG_ON(size & ~PAGE_MASK); |
| 798 | BUG_ON(size > PAGE_SIZE*VMAP_MAX_ALLOC); | 807 | BUG_ON(size > PAGE_SIZE*VMAP_MAX_ALLOC); |
| 808 | |||
| 809 | flush_cache_vunmap((unsigned long)addr, (unsigned long)addr + size); | ||
| 810 | |||
| 799 | order = get_order(size); | 811 | order = get_order(size); |
| 800 | 812 | ||
| 801 | offset = (unsigned long)addr & (VMAP_BLOCK_SIZE - 1); | 813 | offset = (unsigned long)addr & (VMAP_BLOCK_SIZE - 1); |
| @@ -1705,7 +1717,7 @@ static int s_show(struct seq_file *m, void *p) | |||
| 1705 | v->addr, v->addr + v->size, v->size); | 1717 | v->addr, v->addr + v->size, v->size); |
| 1706 | 1718 | ||
| 1707 | if (v->caller) { | 1719 | if (v->caller) { |
| 1708 | char buff[2 * KSYM_NAME_LEN]; | 1720 | char buff[KSYM_SYMBOL_LEN]; |
| 1709 | 1721 | ||
| 1710 | seq_putc(m, ' '); | 1722 | seq_putc(m, ' '); |
| 1711 | sprint_symbol(buff, (unsigned long)v->caller); | 1723 | sprint_symbol(buff, (unsigned long)v->caller); |
