diff options
Diffstat (limited to 'kernel/fork.c')
-rw-r--r-- | kernel/fork.c | 28 |
1 files changed, 12 insertions, 16 deletions
diff --git a/kernel/fork.c b/kernel/fork.c index 47b4e4f379f9..ab5211b9e622 100644 --- a/kernel/fork.c +++ b/kernel/fork.c | |||
@@ -386,7 +386,8 @@ static int dup_mmap(struct mm_struct *mm, struct mm_struct *oldmm) | |||
386 | } | 386 | } |
387 | charge = 0; | 387 | charge = 0; |
388 | if (mpnt->vm_flags & VM_ACCOUNT) { | 388 | if (mpnt->vm_flags & VM_ACCOUNT) { |
389 | unsigned int len = (mpnt->vm_end - mpnt->vm_start) >> PAGE_SHIFT; | 389 | unsigned long len; |
390 | len = (mpnt->vm_end - mpnt->vm_start) >> PAGE_SHIFT; | ||
390 | if (security_vm_enough_memory_mm(oldmm, len)) /* sic */ | 391 | if (security_vm_enough_memory_mm(oldmm, len)) /* sic */ |
391 | goto fail_nomem; | 392 | goto fail_nomem; |
392 | charge = len; | 393 | charge = len; |
@@ -614,7 +615,6 @@ void mmput(struct mm_struct *mm) | |||
614 | list_del(&mm->mmlist); | 615 | list_del(&mm->mmlist); |
615 | spin_unlock(&mmlist_lock); | 616 | spin_unlock(&mmlist_lock); |
616 | } | 617 | } |
617 | put_swap_token(mm); | ||
618 | if (mm->binfmt) | 618 | if (mm->binfmt) |
619 | module_put(mm->binfmt->module); | 619 | module_put(mm->binfmt->module); |
620 | mmdrop(mm); | 620 | mmdrop(mm); |
@@ -787,9 +787,6 @@ void mm_release(struct task_struct *tsk, struct mm_struct *mm) | |||
787 | /* Get rid of any cached register state */ | 787 | /* Get rid of any cached register state */ |
788 | deactivate_mm(tsk, mm); | 788 | deactivate_mm(tsk, mm); |
789 | 789 | ||
790 | if (tsk->vfork_done) | ||
791 | complete_vfork_done(tsk); | ||
792 | |||
793 | /* | 790 | /* |
794 | * If we're exiting normally, clear a user-space tid field if | 791 | * If we're exiting normally, clear a user-space tid field if |
795 | * requested. We leave this alone when dying by signal, to leave | 792 | * requested. We leave this alone when dying by signal, to leave |
@@ -810,6 +807,13 @@ void mm_release(struct task_struct *tsk, struct mm_struct *mm) | |||
810 | } | 807 | } |
811 | tsk->clear_child_tid = NULL; | 808 | tsk->clear_child_tid = NULL; |
812 | } | 809 | } |
810 | |||
811 | /* | ||
812 | * All done, finally we can wake up parent and return this mm to him. | ||
813 | * Also kthread_stop() uses this completion for synchronization. | ||
814 | */ | ||
815 | if (tsk->vfork_done) | ||
816 | complete_vfork_done(tsk); | ||
813 | } | 817 | } |
814 | 818 | ||
815 | /* | 819 | /* |
@@ -831,10 +835,6 @@ struct mm_struct *dup_mm(struct task_struct *tsk) | |||
831 | memcpy(mm, oldmm, sizeof(*mm)); | 835 | memcpy(mm, oldmm, sizeof(*mm)); |
832 | mm_init_cpumask(mm); | 836 | mm_init_cpumask(mm); |
833 | 837 | ||
834 | /* Initializing for Swap token stuff */ | ||
835 | mm->token_priority = 0; | ||
836 | mm->last_interval = 0; | ||
837 | |||
838 | #ifdef CONFIG_TRANSPARENT_HUGEPAGE | 838 | #ifdef CONFIG_TRANSPARENT_HUGEPAGE |
839 | mm->pmd_huge_pte = NULL; | 839 | mm->pmd_huge_pte = NULL; |
840 | #endif | 840 | #endif |
@@ -913,10 +913,6 @@ static int copy_mm(unsigned long clone_flags, struct task_struct *tsk) | |||
913 | goto fail_nomem; | 913 | goto fail_nomem; |
914 | 914 | ||
915 | good_mm: | 915 | good_mm: |
916 | /* Initializing for Swap token stuff */ | ||
917 | mm->token_priority = 0; | ||
918 | mm->last_interval = 0; | ||
919 | |||
920 | tsk->mm = mm; | 916 | tsk->mm = mm; |
921 | tsk->active_mm = mm; | 917 | tsk->active_mm = mm; |
922 | return 0; | 918 | return 0; |
@@ -984,9 +980,8 @@ static int copy_io(unsigned long clone_flags, struct task_struct *tsk) | |||
984 | * Share io context with parent, if CLONE_IO is set | 980 | * Share io context with parent, if CLONE_IO is set |
985 | */ | 981 | */ |
986 | if (clone_flags & CLONE_IO) { | 982 | if (clone_flags & CLONE_IO) { |
987 | tsk->io_context = ioc_task_link(ioc); | 983 | ioc_task_link(ioc); |
988 | if (unlikely(!tsk->io_context)) | 984 | tsk->io_context = ioc; |
989 | return -ENOMEM; | ||
990 | } else if (ioprio_valid(ioc->ioprio)) { | 985 | } else if (ioprio_valid(ioc->ioprio)) { |
991 | new_ioc = get_task_io_context(tsk, GFP_KERNEL, NUMA_NO_NODE); | 986 | new_ioc = get_task_io_context(tsk, GFP_KERNEL, NUMA_NO_NODE); |
992 | if (unlikely(!new_ioc)) | 987 | if (unlikely(!new_ioc)) |
@@ -1420,6 +1415,7 @@ static struct task_struct *copy_process(unsigned long clone_flags, | |||
1420 | */ | 1415 | */ |
1421 | p->group_leader = p; | 1416 | p->group_leader = p; |
1422 | INIT_LIST_HEAD(&p->thread_group); | 1417 | INIT_LIST_HEAD(&p->thread_group); |
1418 | INIT_HLIST_HEAD(&p->task_works); | ||
1423 | 1419 | ||
1424 | /* Now that the task is set up, run cgroup callbacks if | 1420 | /* Now that the task is set up, run cgroup callbacks if |
1425 | * necessary. We need to run them before the task is visible | 1421 | * necessary. We need to run them before the task is visible |