Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751618AbdIMV7r (ORCPT ); Wed, 13 Sep 2017 17:59:47 -0400 Received: from mail-it0-f54.google.com ([209.85.214.54]:45287 "EHLO mail-it0-f54.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751326AbdIMV7m (ORCPT ); Wed, 13 Sep 2017 17:59:42 -0400 X-Google-Smtp-Source: AOwi7QDNTMKMmNpXIU4OCr0HfGaBdANsSRfWgzDysyYweDa/ae4MxwdxFBdpfJAU/5OoVlm+plcXMA== From: Sherry Yang To: linux-kernel@vger.kernel.org Cc: tkjos@google.com, maco@google.com, arve@android.com, gregkh@linuxfoundation.org, Sherry Yang , Ingo Molnar , Michal Hocko , Andrew Morton , Vlastimil Babka , David Rientjes , Andrea Arcangeli , Peter Zijlstra , Thomas Gleixner , Andy Lutomirski , Oleg Nesterov , Hoeun Ryu , Christoph Lameter , Vegard Nossum , Frederic Weisbecker Subject: [PATCH] mm: Restore mmput_async Date: Wed, 13 Sep 2017 17:59:27 -0400 Message-Id: <20170913215932.86846-1-sherryy@android.com> X-Mailer: git-send-email 2.11.0 (Apple Git-81) In-Reply-To: <20170908223934.67442-1-sherryy@android.com> References: <20170908223934.67442-1-sherryy@android.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 1882 Lines: 62 Restore asynchronous mmput, allowing mmput_async to be called from an atomic context in Android binder shrinker callback. mmput_async was initially introduced in ec8d7c14e ("mm, oom_reaper: do not mmput synchronously from the oom reaper context"), and was removed in 212925802 ("mm: oom: let oom_reap_task and exit_mmap run concurrently") Signed-off-by: Sherry Yang --- include/linux/sched/mm.h | 6 ++++++ kernel/fork.c | 18 ++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/include/linux/sched/mm.h b/include/linux/sched/mm.h index 3a19c253bdb1..ae53e413fb13 100644 --- a/include/linux/sched/mm.h +++ b/include/linux/sched/mm.h @@ -84,6 +84,12 @@ static inline bool mmget_not_zero(struct mm_struct *mm) /* mmput gets rid of the mappings and all user-space */ extern void mmput(struct mm_struct *); +#ifdef CONFIG_MMU +/* same as above but performs the slow path from the async context. Can + * be called from the atomic context as well + */ +void mmput_async(struct mm_struct *); +#endif /* Grab a reference to a task's mm, if it is not already going away */ extern struct mm_struct *get_task_mm(struct task_struct *task); diff --git a/kernel/fork.c b/kernel/fork.c index 10646182440f..e702cb9ffbd8 100644 --- a/kernel/fork.c +++ b/kernel/fork.c @@ -946,6 +946,24 @@ void mmput(struct mm_struct *mm) } EXPORT_SYMBOL_GPL(mmput); +#ifdef CONFIG_MMU +static void mmput_async_fn(struct work_struct *work) +{ + struct mm_struct *mm = container_of(work, struct mm_struct, + async_put_work); + + __mmput(mm); +} + +void mmput_async(struct mm_struct *mm) +{ + if (atomic_dec_and_test(&mm->mm_users)) { + INIT_WORK(&mm->async_put_work, mmput_async_fn); + schedule_work(&mm->async_put_work); + } +} +#endif + /** * set_mm_exe_file - change a reference to the mm's executable file * -- 2.11.0 (Apple Git-81)