diff options
author | KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> | 2009-09-21 20:02:32 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-09-22 10:17:33 -0400 |
commit | dd32c279983bf77fdcc8a9aa4a05b0ffdc75859c (patch) | |
tree | 399737a47e6ab1b3a39f6f2950fec325421d082d | |
parent | 2f66a68f3fac2e94da360c342ff78ab45553f86c (diff) |
vmalloc: unmap vmalloc area after hiding it
vmap area should be purged after vm_struct is removed from the list
because vread/vwrite etc...believes the range is valid while it's on
vm_struct list.
Signed-off-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Reviewed-by: WANG Cong <xiyou.wangcong@gmail.com>
Cc: Mike Smith <scgtrp@gmail.com>
Cc: Nick Piggin <nickpiggin@yahoo.com.au>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r-- | mm/vmalloc.c | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/mm/vmalloc.c b/mm/vmalloc.c index 759deae4539a..c4071fa8e12a 100644 --- a/mm/vmalloc.c +++ b/mm/vmalloc.c | |||
@@ -1270,17 +1270,21 @@ struct vm_struct *remove_vm_area(const void *addr) | |||
1270 | if (va && va->flags & VM_VM_AREA) { | 1270 | if (va && va->flags & VM_VM_AREA) { |
1271 | struct vm_struct *vm = va->private; | 1271 | struct vm_struct *vm = va->private; |
1272 | struct vm_struct *tmp, **p; | 1272 | struct vm_struct *tmp, **p; |
1273 | 1273 | /* | |
1274 | vmap_debug_free_range(va->va_start, va->va_end); | 1274 | * remove from list and disallow access to this vm_struct |
1275 | free_unmap_vmap_area(va); | 1275 | * before unmap. (address range confliction is maintained by |
1276 | vm->size -= PAGE_SIZE; | 1276 | * vmap.) |
1277 | 1277 | */ | |
1278 | write_lock(&vmlist_lock); | 1278 | write_lock(&vmlist_lock); |
1279 | for (p = &vmlist; (tmp = *p) != vm; p = &tmp->next) | 1279 | for (p = &vmlist; (tmp = *p) != vm; p = &tmp->next) |
1280 | ; | 1280 | ; |
1281 | *p = tmp->next; | 1281 | *p = tmp->next; |
1282 | write_unlock(&vmlist_lock); | 1282 | write_unlock(&vmlist_lock); |
1283 | 1283 | ||
1284 | vmap_debug_free_range(va->va_start, va->va_end); | ||
1285 | free_unmap_vmap_area(va); | ||
1286 | vm->size -= PAGE_SIZE; | ||
1287 | |||
1284 | return vm; | 1288 | return vm; |
1285 | } | 1289 | } |
1286 | return NULL; | 1290 | return NULL; |