forked from luck/tmp_suning_uos_patched
kernel/exit: Compute 'current' directly
This patch effectively replaces the tsk pointer dereference (which is obviously == current), to directly use get_current() macro. In this case, do_exit() always passes current to exit_mm(), hence we can simply get rid of the argument. This is also a performance win on some archs such as x86-64 and ppc64 -- arm64 is no longer an issue. Signed-off-by: Davidlohr Bueso <dbueso@suse.de> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Cc: Andrew Morton <akpm@linux-foundation.org> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Paul E. McKenney <paulmck@linux.vnet.ibm.com> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: dave@stgolabs.net Cc: mark.rutland@arm.com Link: http://lkml.kernel.org/r/1483479794-14013-2-git-send-email-dave@stgolabs.net Signed-off-by: Ingo Molnar <mingo@kernel.org>
This commit is contained in:
parent
aef591cd3d
commit
0039962a14
|
@ -468,12 +468,12 @@ void mm_update_next_owner(struct mm_struct *mm)
|
||||||
* Turn us into a lazy TLB process if we
|
* Turn us into a lazy TLB process if we
|
||||||
* aren't already..
|
* aren't already..
|
||||||
*/
|
*/
|
||||||
static void exit_mm(struct task_struct *tsk)
|
static void exit_mm(void)
|
||||||
{
|
{
|
||||||
struct mm_struct *mm = tsk->mm;
|
struct mm_struct *mm = current->mm;
|
||||||
struct core_state *core_state;
|
struct core_state *core_state;
|
||||||
|
|
||||||
mm_release(tsk, mm);
|
mm_release(current, mm);
|
||||||
if (!mm)
|
if (!mm)
|
||||||
return;
|
return;
|
||||||
sync_mm_rss(mm);
|
sync_mm_rss(mm);
|
||||||
|
@ -491,7 +491,7 @@ static void exit_mm(struct task_struct *tsk)
|
||||||
|
|
||||||
up_read(&mm->mmap_sem);
|
up_read(&mm->mmap_sem);
|
||||||
|
|
||||||
self.task = tsk;
|
self.task = current;
|
||||||
self.next = xchg(&core_state->dumper.next, &self);
|
self.next = xchg(&core_state->dumper.next, &self);
|
||||||
/*
|
/*
|
||||||
* Implies mb(), the result of xchg() must be visible
|
* Implies mb(), the result of xchg() must be visible
|
||||||
|
@ -501,22 +501,22 @@ static void exit_mm(struct task_struct *tsk)
|
||||||
complete(&core_state->startup);
|
complete(&core_state->startup);
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
set_task_state(tsk, TASK_UNINTERRUPTIBLE);
|
set_task_state(current, TASK_UNINTERRUPTIBLE);
|
||||||
if (!self.task) /* see coredump_finish() */
|
if (!self.task) /* see coredump_finish() */
|
||||||
break;
|
break;
|
||||||
freezable_schedule();
|
freezable_schedule();
|
||||||
}
|
}
|
||||||
__set_task_state(tsk, TASK_RUNNING);
|
__set_task_state(current, TASK_RUNNING);
|
||||||
down_read(&mm->mmap_sem);
|
down_read(&mm->mmap_sem);
|
||||||
}
|
}
|
||||||
atomic_inc(&mm->mm_count);
|
atomic_inc(&mm->mm_count);
|
||||||
BUG_ON(mm != tsk->active_mm);
|
BUG_ON(mm != current->active_mm);
|
||||||
/* more a memory barrier than a real lock */
|
/* more a memory barrier than a real lock */
|
||||||
task_lock(tsk);
|
task_lock(current);
|
||||||
tsk->mm = NULL;
|
current->mm = NULL;
|
||||||
up_read(&mm->mmap_sem);
|
up_read(&mm->mmap_sem);
|
||||||
enter_lazy_tlb(mm, current);
|
enter_lazy_tlb(mm, current);
|
||||||
task_unlock(tsk);
|
task_unlock(current);
|
||||||
mm_update_next_owner(mm);
|
mm_update_next_owner(mm);
|
||||||
mmput(mm);
|
mmput(mm);
|
||||||
if (test_thread_flag(TIF_MEMDIE))
|
if (test_thread_flag(TIF_MEMDIE))
|
||||||
|
@ -823,7 +823,7 @@ void __noreturn do_exit(long code)
|
||||||
tsk->exit_code = code;
|
tsk->exit_code = code;
|
||||||
taskstats_exit(tsk, group_dead);
|
taskstats_exit(tsk, group_dead);
|
||||||
|
|
||||||
exit_mm(tsk);
|
exit_mm();
|
||||||
|
|
||||||
if (group_dead)
|
if (group_dead)
|
||||||
acct_process();
|
acct_process();
|
||||||
|
|
Loading…
Reference in New Issue
Block a user