From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.3 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,USER_AGENT_SANE_1 autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 3CDCAC2D0D1 for ; Mon, 6 Jan 2020 10:43:23 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id E799E2072E for ; Mon, 6 Jan 2020 10:43:22 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=yandex-team.ru header.i=@yandex-team.ru header.b="eeqE4s9Z" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org E799E2072E Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=yandex-team.ru Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id 968018E0006; Mon, 6 Jan 2020 05:43:22 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 918058E0001; Mon, 6 Jan 2020 05:43:22 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 82E448E0006; Mon, 6 Jan 2020 05:43:22 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0210.hostedemail.com [216.40.44.210]) by kanga.kvack.org (Postfix) with ESMTP id 6C1E58E0001 for ; Mon, 6 Jan 2020 05:43:22 -0500 (EST) Received: from smtpin13.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay02.hostedemail.com (Postfix) with SMTP id 266D04821 for ; Mon, 6 Jan 2020 10:43:22 +0000 (UTC) X-FDA: 76346872644.13.home81_3a5e9b1ccc548 X-HE-Tag: home81_3a5e9b1ccc548 X-Filterd-Recvd-Size: 5737 Received: from forwardcorp1j.mail.yandex.net (forwardcorp1j.mail.yandex.net [5.45.199.163]) by imf09.hostedemail.com (Postfix) with ESMTP for ; Mon, 6 Jan 2020 10:43:20 +0000 (UTC) Received: from mxbackcorp1j.mail.yandex.net (mxbackcorp1j.mail.yandex.net [IPv6:2a02:6b8:0:1619::162]) by forwardcorp1j.mail.yandex.net (Yandex) with ESMTP id 4F6012E0B08; Mon, 6 Jan 2020 13:43:17 +0300 (MSK) Received: from myt5-70c90f7d6d7d.qloud-c.yandex.net (myt5-70c90f7d6d7d.qloud-c.yandex.net [2a02:6b8:c12:3e2c:0:640:70c9:f7d]) by mxbackcorp1j.mail.yandex.net (mxbackcorp/Yandex) with ESMTP id Va1V2vcpse-hHxqFP1n; Mon, 06 Jan 2020 13:43:17 +0300 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex-team.ru; s=default; t=1578307397; bh=UBtuMSejpj22j/U4O4ozq0VH2FLM69qeI91i7KENcVQ=; h=In-Reply-To:Message-ID:From:Date:References:To:Subject:Cc; b=eeqE4s9ZeGbfitvCv1L5nIuv98ZSjUwhxm6pBw9KA0rE8JVDpRKnHgy4qWpmSpgwn hysPieWrk9Q//5pC4IBy99gGrlk2U+1XZhtD0/2prHRjX8hCtccPH1oTi8TWnassV+ gPKYEeg43szF9fcrbteWYFTuvhXN0mioqt+/7iS8= Authentication-Results: mxbackcorp1j.mail.yandex.net; dkim=pass header.i=@yandex-team.ru Received: from unknown (unknown [2a02:6b8:b080:6708::1:7]) by myt5-70c90f7d6d7d.qloud-c.yandex.net (smtpcorp/Yandex) with ESMTPSA id 0obqxQU91N-hGVSeM5i; Mon, 06 Jan 2020 13:43:17 +0300 (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) (Client certificate not present) Subject: Re: [PATCH] mm/rmap.c: remove useless checking to child vma->vm_prev in anon_vma_clone To: Li Xinhai , linux-mm@kvack.org Cc: Wei Yang , "Kirill A. Shutemov" References: <1578292679-2592-1-git-send-email-lixinhai.lxh@gmail.com> From: Konstantin Khlebnikov Message-ID: <8f930582-34a8-b44e-ed1b-c938c84f0598@yandex-team.ru> Date: Mon, 6 Jan 2020 13:43:16 +0300 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.2.2 MIME-Version: 1.0 In-Reply-To: <1578292679-2592-1-git-send-email-lixinhai.lxh@gmail.com> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-CA Content-Transfer-Encoding: 7bit X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: On 06/01/2020 09.37, Li Xinhai wrote: > For fork case, the dst->vm_prev is always same as src->vm_prev when > anon_vma_clone() is called. Removing the assignment from > dst->vm_prev->anon_vma to dst->anon_vma, and explictly assign from > anon_vma which is shared by its parent vmas. This doesn't sound right. I see dst->vm_prev is set after anon_vma_fork(), so here it still points to parent prev. So, this thing works isn't as is supposed to be. I expect this logic: If parent SRC1 SRC2 .. SRCn share ANON0 then in child related DST1 DST2 .. DSTn should fork and share ANON1: Forking DST1 creates new ANON1 and then DST2 and following share it. Also this assumption is wrong: > Parent has vm_prev, which implies we have vm_prev. If in parent prev VMA has VM_DONTCOPY then in child prev VMA will not match pprev or even could be NULL if it was first in mm. See patch: https://lore.kernel.org/lkml/157830736034.8148.7070851958306750616.stgit@buzz/T/#u I've tested it using this: --- a/fs/proc/task_mmu.c +++ b/fs/proc/task_mmu.c @@ -847,6 +847,12 @@ static int show_smap(struct seq_file *m, void *v) seq_printf(m, "ProtectionKey: %8u\n", vma_pkey(vma)); show_smap_vma_flags(m, vma); + if (vma->anon_vma) + seq_printf(m, "AnonVMA: %p %p %d\n", + vma->anon_vma, + vma->anon_vma->parent, + vma->anon_vma->degree); + m_cache_vma(m, vma); return 0; --- #include #include #include #include #include int main(int argc, char **argv) { void *ptr; char buf[100]; ptr = mmap(NULL, 0x3000, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); memset(ptr, 0, 0x3000); mprotect(ptr + 0x1000, 0x1000, PROT_READ); sprintf(buf, "cat /proc/%d/smaps", getpid()); system(buf); if (fork()) { wait(NULL); } else { printf("\n\n\n"); fflush(stdout); sprintf(buf, "cat /proc/%d/smaps", getpid()); system(buf); } } --- > > Signed-off-by: Li Xinhai > Cc: Wei Yang > Cc: Konstantin Khlebnikov > Cc: Kirill A. Shutemov > --- > mm/rmap.c | 7 +++---- > 1 file changed, 3 insertions(+), 4 deletions(-) > > diff --git a/mm/rmap.c b/mm/rmap.c > index b3e3819..3c912a6c 100644 > --- a/mm/rmap.c > +++ b/mm/rmap.c > @@ -269,10 +269,10 @@ int anon_vma_clone(struct vm_area_struct *dst, struct vm_area_struct *src) > { > struct anon_vma_chain *avc, *pavc; > struct anon_vma *root = NULL; > - struct vm_area_struct *prev = dst->vm_prev, *pprev = src->vm_prev; > + struct vm_area_struct *pprev = src->vm_prev; > > /* > - * If parent share anon_vma with its vm_prev, keep this sharing in in > + * If parent share anon_vma with its vm_prev, keep this sharing in > * child. > * > * 1. Parent has vm_prev, which implies we have vm_prev. > @@ -280,8 +280,7 @@ int anon_vma_clone(struct vm_area_struct *dst, struct vm_area_struct *src) > */ > if (!dst->anon_vma && src->anon_vma && > pprev && pprev->anon_vma == src->anon_vma) > - dst->anon_vma = prev->anon_vma; > - > + dst->anon_vma = pprev->anon_vma; > > list_for_each_entry_reverse(pavc, &src->anon_vma_chain, same_vma) { > struct anon_vma *anon_vma; >