diff options
author | Ingo Molnar <mingo@elte.hu> | 2009-01-12 05:32:03 -0500 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2009-01-12 05:32:03 -0500 |
commit | e3ee1e123183ca9847e74b7b8e2694c9e3b817a6 (patch) | |
tree | 652a84674ed05eaa46a813de2223af0bd0168a5a /kernel/exit.c | |
parent | 5762ba1873b0bb9faa631aaa02f533c2b9837f82 (diff) | |
parent | c59765042f53a79a7a65585042ff463b69cb248c (diff) |
Merge commit 'v2.6.29-rc1' into timers/hrtimers
Conflicts:
kernel/time/tick-common.c
Diffstat (limited to 'kernel/exit.c')
-rw-r--r-- | kernel/exit.c | 25 |
1 files changed, 8 insertions, 17 deletions
diff --git a/kernel/exit.c b/kernel/exit.c index c7422ca92038..c7740fa3252c 100644 --- a/kernel/exit.c +++ b/kernel/exit.c | |||
@@ -642,35 +642,31 @@ retry: | |||
642 | /* | 642 | /* |
643 | * We found no owner yet mm_users > 1: this implies that we are | 643 | * We found no owner yet mm_users > 1: this implies that we are |
644 | * most likely racing with swapoff (try_to_unuse()) or /proc or | 644 | * most likely racing with swapoff (try_to_unuse()) or /proc or |
645 | * ptrace or page migration (get_task_mm()). Mark owner as NULL, | 645 | * ptrace or page migration (get_task_mm()). Mark owner as NULL. |
646 | * so that subsystems can understand the callback and take action. | ||
647 | */ | 646 | */ |
648 | down_write(&mm->mmap_sem); | ||
649 | cgroup_mm_owner_callbacks(mm->owner, NULL); | ||
650 | mm->owner = NULL; | 647 | mm->owner = NULL; |
651 | up_write(&mm->mmap_sem); | ||
652 | return; | 648 | return; |
653 | 649 | ||
654 | assign_new_owner: | 650 | assign_new_owner: |
655 | BUG_ON(c == p); | 651 | BUG_ON(c == p); |
656 | get_task_struct(c); | 652 | get_task_struct(c); |
657 | read_unlock(&tasklist_lock); | ||
658 | down_write(&mm->mmap_sem); | ||
659 | /* | 653 | /* |
660 | * The task_lock protects c->mm from changing. | 654 | * The task_lock protects c->mm from changing. |
661 | * We always want mm->owner->mm == mm | 655 | * We always want mm->owner->mm == mm |
662 | */ | 656 | */ |
663 | task_lock(c); | 657 | task_lock(c); |
658 | /* | ||
659 | * Delay read_unlock() till we have the task_lock() | ||
660 | * to ensure that c does not slip away underneath us | ||
661 | */ | ||
662 | read_unlock(&tasklist_lock); | ||
664 | if (c->mm != mm) { | 663 | if (c->mm != mm) { |
665 | task_unlock(c); | 664 | task_unlock(c); |
666 | up_write(&mm->mmap_sem); | ||
667 | put_task_struct(c); | 665 | put_task_struct(c); |
668 | goto retry; | 666 | goto retry; |
669 | } | 667 | } |
670 | cgroup_mm_owner_callbacks(mm->owner, c); | ||
671 | mm->owner = c; | 668 | mm->owner = c; |
672 | task_unlock(c); | 669 | task_unlock(c); |
673 | up_write(&mm->mmap_sem); | ||
674 | put_task_struct(c); | 670 | put_task_struct(c); |
675 | } | 671 | } |
676 | #endif /* CONFIG_MM_OWNER */ | 672 | #endif /* CONFIG_MM_OWNER */ |
@@ -1037,8 +1033,6 @@ NORET_TYPE void do_exit(long code) | |||
1037 | * task into the wait for ever nirwana as well. | 1033 | * task into the wait for ever nirwana as well. |
1038 | */ | 1034 | */ |
1039 | tsk->flags |= PF_EXITPIDONE; | 1035 | tsk->flags |= PF_EXITPIDONE; |
1040 | if (tsk->io_context) | ||
1041 | exit_io_context(); | ||
1042 | set_current_state(TASK_UNINTERRUPTIBLE); | 1036 | set_current_state(TASK_UNINTERRUPTIBLE); |
1043 | schedule(); | 1037 | schedule(); |
1044 | } | 1038 | } |
@@ -1057,10 +1051,7 @@ NORET_TYPE void do_exit(long code) | |||
1057 | preempt_count()); | 1051 | preempt_count()); |
1058 | 1052 | ||
1059 | acct_update_integrals(tsk); | 1053 | acct_update_integrals(tsk); |
1060 | if (tsk->mm) { | 1054 | |
1061 | update_hiwater_rss(tsk->mm); | ||
1062 | update_hiwater_vm(tsk->mm); | ||
1063 | } | ||
1064 | group_dead = atomic_dec_and_test(&tsk->signal->live); | 1055 | group_dead = atomic_dec_and_test(&tsk->signal->live); |
1065 | if (group_dead) { | 1056 | if (group_dead) { |
1066 | hrtimer_cancel(&tsk->signal->real_timer); | 1057 | hrtimer_cancel(&tsk->signal->real_timer); |
@@ -1328,10 +1319,10 @@ static int wait_task_zombie(struct task_struct *p, int options, | |||
1328 | * group, which consolidates times for all threads in the | 1319 | * group, which consolidates times for all threads in the |
1329 | * group including the group leader. | 1320 | * group including the group leader. |
1330 | */ | 1321 | */ |
1322 | thread_group_cputime(p, &cputime); | ||
1331 | spin_lock_irq(&p->parent->sighand->siglock); | 1323 | spin_lock_irq(&p->parent->sighand->siglock); |
1332 | psig = p->parent->signal; | 1324 | psig = p->parent->signal; |
1333 | sig = p->signal; | 1325 | sig = p->signal; |
1334 | thread_group_cputime(p, &cputime); | ||
1335 | psig->cutime = | 1326 | psig->cutime = |
1336 | cputime_add(psig->cutime, | 1327 | cputime_add(psig->cutime, |
1337 | cputime_add(cputime.utime, | 1328 | cputime_add(cputime.utime, |