anolis: mm: async fork: Do not clean up async fork for CLONE_VM

ANBZ: #19053

In following scenario,
Parent:
fork()
  dup_mmap()
    async fork bind(p->mm->async_fork_mm = new mm)
  return                                           Child A:
fork()                                             async fork copying rest(mm->async_fork_mm = p->mm)
  copy_process()
    copy_mm()
      clone_flags & CLONE_VM skip dup_mmap()
    failed, goto cleanup
    if (p->mm && p->mm->async_fork_mm)
                                                   async fork copy done(mm->async_fork_mm = NULL,
                                                              p->mm->async_fork_mm = NULL)
      async fork cleanup(use
           p->mm->async_fork_mm)
        null pointer panic

Just skip async fork clean up if fork has CLONE_VM flag

Signed-off-by: Zelin Deng <zelin.deng@linux.alibaba.com>
Reviewed-by: Cruz Zhao <CruzZhao@linux.alibaba.com>
Reviewed-by: Baolin Wang <baolin.wang@linux.alibaba.com>
Reviewed-by: Cruz Zhao <cruzzhao@linux.alibaba.com>
Link: https://gitee.com/anolis/cloud-kernel/pulls/4695
This commit is contained in:
Zelin Deng 2025-02-25 13:15:36 +08:00 committed by 小龙
parent 8aa98230a8
commit bc3571ad32
1 changed files with 2 additions and 3 deletions

View File

@ -2435,10 +2435,9 @@ bad_fork_cleanup_namespaces:
bad_fork_cleanup_mm:
if (p->mm) {
#ifdef CONFIG_ASYNC_FORK
if (p->mm->async_fork_mm) {
WARN_ON_ONCE(clone_flags & CLONE_VM);
if (p->mm->async_fork_mm &&
!WARN_ON_ONCE(clone_flags & CLONE_VM))
async_fork_cpr_done(p->mm, true, false);
}
#endif
mm_clear_owner(p->mm, p);
mmput(p->mm);