Commit 0039962a authored by Davidlohr Bueso's avatar Davidlohr Bueso Committed by Ingo Molnar

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: default avatarDavidlohr Bueso <dbueso@suse.de>
Signed-off-by: default avatarPeter 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.netSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
parent aef591cd
...@@ -468,12 +468,12 @@ void mm_update_next_owner(struct mm_struct *mm) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment