aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/exec.c1
-rw-r--r--kernel/exit.c13
-rw-r--r--kernel/fork.c8
3 files changed, 6 insertions, 16 deletions
diff --git a/fs/exec.c b/fs/exec.c
index b926ed19301e..a79786a8d2c8 100644
--- a/fs/exec.c
+++ b/fs/exec.c
@@ -819,6 +819,7 @@ static int exec_mmap(struct mm_struct *mm)
819 /* Notify parent that we're no longer interested in the old VM */ 819 /* Notify parent that we're no longer interested in the old VM */
820 tsk = current; 820 tsk = current;
821 old_mm = current->mm; 821 old_mm = current->mm;
822 sync_mm_rss(old_mm);
822 mm_release(tsk, old_mm); 823 mm_release(tsk, old_mm);
823 824
824 if (old_mm) { 825 if (old_mm) {
diff --git a/kernel/exit.c b/kernel/exit.c
index 804fb6bb8161..34867cc5b42a 100644
--- a/kernel/exit.c
+++ b/kernel/exit.c
@@ -423,7 +423,6 @@ void daemonize(const char *name, ...)
423 * user space pages. We don't need them, and if we didn't close them 423 * user space pages. We don't need them, and if we didn't close them
424 * they would be locked into memory. 424 * they would be locked into memory.
425 */ 425 */
426 mm_release(current, current->mm);
427 exit_mm(current); 426 exit_mm(current);
428 /* 427 /*
429 * We don't want to get frozen, in case system-wide hibernation 428 * We don't want to get frozen, in case system-wide hibernation
@@ -641,6 +640,7 @@ static void exit_mm(struct task_struct * tsk)
641 struct mm_struct *mm = tsk->mm; 640 struct mm_struct *mm = tsk->mm;
642 struct core_state *core_state; 641 struct core_state *core_state;
643 642
643 mm_release(tsk, mm);
644 if (!mm) 644 if (!mm)
645 return; 645 return;
646 /* 646 /*
@@ -960,13 +960,9 @@ void do_exit(long code)
960 preempt_count()); 960 preempt_count());
961 961
962 acct_update_integrals(tsk); 962 acct_update_integrals(tsk);
963 963 /* sync mm's RSS info before statistics gathering */
964 /* Set exit_code before complete_vfork_done() in mm_release() */ 964 if (tsk->mm)
965 tsk->exit_code = code; 965 sync_mm_rss(tsk->mm);
966
967 /* Release mm and sync mm's RSS info before statistics gathering */
968 mm_release(tsk, tsk->mm);
969
970 group_dead = atomic_dec_and_test(&tsk->signal->live); 966 group_dead = atomic_dec_and_test(&tsk->signal->live);
971 if (group_dead) { 967 if (group_dead) {
972 hrtimer_cancel(&tsk->signal->real_timer); 968 hrtimer_cancel(&tsk->signal->real_timer);
@@ -979,6 +975,7 @@ void do_exit(long code)
979 tty_audit_exit(); 975 tty_audit_exit();
980 audit_free(tsk); 976 audit_free(tsk);
981 977
978 tsk->exit_code = code;
982 taskstats_exit(tsk, group_dead); 979 taskstats_exit(tsk, group_dead);
983 980
984 exit_mm(tsk); 981 exit_mm(tsk);
diff --git a/kernel/fork.c b/kernel/fork.c
index 0560781c6904..ab5211b9e622 100644
--- a/kernel/fork.c
+++ b/kernel/fork.c
@@ -619,14 +619,6 @@ void mmput(struct mm_struct *mm)
619 module_put(mm->binfmt->module); 619 module_put(mm->binfmt->module);
620 mmdrop(mm); 620 mmdrop(mm);
621 } 621 }
622
623 /*
624 * Final rss-counter synchronization. After this point there must be
625 * no pagefaults into this mm from the current context. Otherwise
626 * mm->rss_stat will be inconsistent.
627 */
628 if (mm)
629 sync_mm_rss(mm);
630} 622}
631EXPORT_SYMBOL_GPL(mmput); 623EXPORT_SYMBOL_GPL(mmput);
632 624