lkml.org 
[lkml]   [2017]   [Jan]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[tip:locking/core] kernel/exit: Compute 'current' directly
    Commit-ID:  0039962a1473f07fd5c8355bd8264be1eb87eb3e
    Gitweb: http://git.kernel.org/tip/0039962a1473f07fd5c8355bd8264be1eb87eb3e
    Author: Davidlohr Bueso <dave@stgolabs.net>
    AuthorDate: Tue, 3 Jan 2017 13:43:11 -0800
    Committer: Ingo Molnar <mingo@kernel.org>
    CommitDate: Sat, 14 Jan 2017 11:14:11 +0100

    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>
    ---
    kernel/exit.c | 22 +++++++++++-----------
    1 file changed, 11 insertions(+), 11 deletions(-)

    diff --git a/kernel/exit.c b/kernel/exit.c
    index 8f14b86..2385d43 100644
    --- a/kernel/exit.c
    +++ b/kernel/exit.c
    @@ -468,12 +468,12 @@ assign_new_owner:
    * Turn us into a lazy TLB process if we
    * 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;

    - mm_release(tsk, mm);
    + mm_release(current, mm);
    if (!mm)
    return;
    sync_mm_rss(mm);
    @@ -491,7 +491,7 @@ static void exit_mm(struct task_struct *tsk)

    up_read(&mm->mmap_sem);

    - self.task = tsk;
    + self.task = current;
    self.next = xchg(&core_state->dumper.next, &self);
    /*
    * 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);

    for (;;) {
    - set_task_state(tsk, TASK_UNINTERRUPTIBLE);
    + set_task_state(current, TASK_UNINTERRUPTIBLE);
    if (!self.task) /* see coredump_finish() */
    break;
    freezable_schedule();
    }
    - __set_task_state(tsk, TASK_RUNNING);
    + __set_task_state(current, TASK_RUNNING);
    down_read(&mm->mmap_sem);
    }
    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 */
    - task_lock(tsk);
    - tsk->mm = NULL;
    + task_lock(current);
    + current->mm = NULL;
    up_read(&mm->mmap_sem);
    enter_lazy_tlb(mm, current);
    - task_unlock(tsk);
    + task_unlock(current);
    mm_update_next_owner(mm);
    mmput(mm);
    if (test_thread_flag(TIF_MEMDIE))
    @@ -823,7 +823,7 @@ void __noreturn do_exit(long code)
    tsk->exit_code = code;
    taskstats_exit(tsk, group_dead);

    - exit_mm(tsk);
    + exit_mm();

    if (group_dead)
    acct_process();
    \
     
     \ /
      Last update: 2017-01-14 13:31    [W:2.686 / U:0.424 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site