diff options
Diffstat (limited to 'kernel/fork.c')
| -rw-r--r-- | kernel/fork.c | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/kernel/fork.c b/kernel/fork.c index 9440d61b925c..0e23deb5acfc 100644 --- a/kernel/fork.c +++ b/kernel/fork.c | |||
| @@ -303,11 +303,26 @@ struct kmem_cache *files_cachep; | |||
| 303 | struct kmem_cache *fs_cachep; | 303 | struct kmem_cache *fs_cachep; |
| 304 | 304 | ||
| 305 | /* SLAB cache for vm_area_struct structures */ | 305 | /* SLAB cache for vm_area_struct structures */ |
| 306 | struct kmem_cache *vm_area_cachep; | 306 | static struct kmem_cache *vm_area_cachep; |
| 307 | 307 | ||
| 308 | /* SLAB cache for mm_struct structures (tsk->mm) */ | 308 | /* SLAB cache for mm_struct structures (tsk->mm) */ |
| 309 | static struct kmem_cache *mm_cachep; | 309 | static struct kmem_cache *mm_cachep; |
| 310 | 310 | ||
| 311 | struct vm_area_struct *vm_area_alloc(void) | ||
| 312 | { | ||
| 313 | return kmem_cache_zalloc(vm_area_cachep, GFP_KERNEL); | ||
| 314 | } | ||
| 315 | |||
| 316 | struct vm_area_struct *vm_area_dup(struct vm_area_struct *orig) | ||
| 317 | { | ||
| 318 | return kmem_cache_alloc(vm_area_cachep, GFP_KERNEL); | ||
| 319 | } | ||
| 320 | |||
| 321 | void vm_area_free(struct vm_area_struct *vma) | ||
| 322 | { | ||
| 323 | kmem_cache_free(vm_area_cachep, vma); | ||
| 324 | } | ||
| 325 | |||
| 311 | static void account_kernel_stack(struct task_struct *tsk, int account) | 326 | static void account_kernel_stack(struct task_struct *tsk, int account) |
| 312 | { | 327 | { |
| 313 | void *stack = task_stack_page(tsk); | 328 | void *stack = task_stack_page(tsk); |
| @@ -455,7 +470,7 @@ static __latent_entropy int dup_mmap(struct mm_struct *mm, | |||
| 455 | goto fail_nomem; | 470 | goto fail_nomem; |
| 456 | charge = len; | 471 | charge = len; |
| 457 | } | 472 | } |
| 458 | tmp = kmem_cache_alloc(vm_area_cachep, GFP_KERNEL); | 473 | tmp = vm_area_dup(mpnt); |
| 459 | if (!tmp) | 474 | if (!tmp) |
| 460 | goto fail_nomem; | 475 | goto fail_nomem; |
| 461 | *tmp = *mpnt; | 476 | *tmp = *mpnt; |
| @@ -539,7 +554,7 @@ fail_uprobe_end: | |||
| 539 | fail_nomem_anon_vma_fork: | 554 | fail_nomem_anon_vma_fork: |
| 540 | mpol_put(vma_policy(tmp)); | 555 | mpol_put(vma_policy(tmp)); |
| 541 | fail_nomem_policy: | 556 | fail_nomem_policy: |
| 542 | kmem_cache_free(vm_area_cachep, tmp); | 557 | vm_area_free(tmp); |
| 543 | fail_nomem: | 558 | fail_nomem: |
| 544 | retval = -ENOMEM; | 559 | retval = -ENOMEM; |
| 545 | vm_unacct_memory(charge); | 560 | vm_unacct_memory(charge); |
