Received: by 2002:a05:7412:419a:b0:f3:1519:9f41 with SMTP id i26csp2919182rdh; Mon, 27 Nov 2023 02:11:24 -0800 (PST) X-Google-Smtp-Source: AGHT+IHW5xA64h7lADP7DeyruzFOEdTNYfW5nB23bXNCuthYcf28MU7CwfeLo0k8skuXe2pXd65b X-Received: by 2002:a05:6808:318b:b0:3b8:4cec:de9b with SMTP id cd11-20020a056808318b00b003b84cecde9bmr14343078oib.3.1701079883999; Mon, 27 Nov 2023 02:11:23 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1701079883; cv=none; d=google.com; s=arc-20160816; b=o7FUaC+voABe/DY6CFynhGjcMcZVvhMyO/k8Yu0J6zZpH2LOD2OekKdJX9l5CF0qkn sxb0rPn/NJKarXcvgnsSwRlJRmeVWf1PQwLqScdBDa5wvd+q1D2VuZBx/h+dFzPO4x1d 9v+efmCF/qShRYDaFoe3v7Tcludfit0PP2iryKujitIiWzc4Ugo6vZFvm6d1MSIAuM32 a7Yc2p580eDnouz35ynwmUtc71iKEFFyz0m0+tdmfP7l1v33XJ7IUIyzhQ9MPjZec1Pg 99iRneFgDx/hylGgLwugSK1ZS6MatqxMY5k4x05wzPoRUBGtJIiA0lqBkSZ5UP7K3V2E 0+Bg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:in-reply-to:from :references:cc:to:content-language:subject:user-agent:mime-version :date:message-id; bh=kyHRRcHUguYRx9oX7ITb2wGi065yquMSFwaardSk8Fk=; fh=V3uou8TaFl0TUFJagjJ/ql/txBp6ZFElwIlmLv68MKI=; b=XcC1t9jesx1rlN+TqLjKt3QSgSl4V/mhzPYie/cqzSq+hhfBzxBFh1mkEwqg7/Sps1 0/nnFvMzi79YWANpmAIJdaeDPxL64LPwjB5VO/lYyWlX6/GJjV7voYpSitkk1VvJAv0O lhk3OKc2ZaD0BKQXCdj2CiGWE2s1awWS3Md4p/BtptfErhgjFd3L6+CWhsSbYw5JYEZ2 fwKVm5waBX2z2ESZfUpuqAAillnCHoRO8evdrYvW4pT7L916791pbpxY6blYoSEKyk5A k2u7pUOcVUM4arJd9anCBysQjnfgdPxJRLV//uIbUgdUhp90Wv3hSVRmrAEcuZf9cv9E vpgQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.31 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Return-Path: Received: from morse.vger.email (morse.vger.email. [23.128.96.31]) by mx.google.com with ESMTPS id j33-20020a635961000000b005b966a6960csi9522702pgm.786.2023.11.27.02.11.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 27 Nov 2023 02:11:23 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.31 as permitted sender) client-ip=23.128.96.31; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.31 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by morse.vger.email (Postfix) with ESMTP id 0FDFA802BD44; Mon, 27 Nov 2023 02:11:21 -0800 (PST) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.11 at morse.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232732AbjK0KLE (ORCPT + 99 others); Mon, 27 Nov 2023 05:11:04 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:59712 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232959AbjK0KK6 (ORCPT ); Mon, 27 Nov 2023 05:10:58 -0500 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id E9C83E1 for ; Mon, 27 Nov 2023 02:11:03 -0800 (PST) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 2F4262F4; Mon, 27 Nov 2023 02:11:51 -0800 (PST) Received: from [10.57.73.191] (unknown [10.57.73.191]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 3DE5F3F73F; Mon, 27 Nov 2023 02:11:00 -0800 (PST) Message-ID: Date: Mon, 27 Nov 2023 10:10:58 +0000 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH v2 01/14] mm: Batch-copy PTE ranges during fork() Content-Language: en-GB To: Barry Song <21cnbao@gmail.com> Cc: david@redhat.com, akpm@linux-foundation.org, andreyknvl@gmail.com, anshuman.khandual@arm.com, ardb@kernel.org, catalin.marinas@arm.com, dvyukov@google.com, glider@google.com, james.morse@arm.com, jhubbard@nvidia.com, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-mm@kvack.org, mark.rutland@arm.com, maz@kernel.org, oliver.upton@linux.dev, ryabinin.a.a@gmail.com, suzuki.poulose@arm.com, vincenzo.frascino@arm.com, wangkefeng.wang@huawei.com, will@kernel.org, willy@infradead.org, yuzenghui@huawei.com, yuzhao@google.com, ziy@nvidia.com References: <271f1e98-6217-4b40-bae0-0ac9fe5851cb@redhat.com> <20231127084217.13110-1-v-songbaohua@oppo.com> From: Ryan Roberts In-Reply-To: Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-0.8 required=5.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on morse.vger.email Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (morse.vger.email [0.0.0.0]); Mon, 27 Nov 2023 02:11:21 -0800 (PST) On 27/11/2023 09:59, Barry Song wrote: > On Mon, Nov 27, 2023 at 10:35 PM Ryan Roberts wrote: >> >> On 27/11/2023 08:42, Barry Song wrote: >>>>> + for (i = 0; i < nr; i++, page++) { >>>>> + if (anon) { >>>>> + /* >>>>> + * If this page may have been pinned by the >>>>> + * parent process, copy the page immediately for >>>>> + * the child so that we'll always guarantee the >>>>> + * pinned page won't be randomly replaced in the >>>>> + * future. >>>>> + */ >>>>> + if (unlikely(page_try_dup_anon_rmap( >>>>> + page, false, src_vma))) { >>>>> + if (i != 0) >>>>> + break; >>>>> + /* Page may be pinned, we have to copy. */ >>>>> + return copy_present_page( >>>>> + dst_vma, src_vma, dst_pte, >>>>> + src_pte, addr, rss, prealloc, >>>>> + page); >>>>> + } >>>>> + rss[MM_ANONPAGES]++; >>>>> + VM_BUG_ON(PageAnonExclusive(page)); >>>>> + } else { >>>>> + page_dup_file_rmap(page, false); >>>>> + rss[mm_counter_file(page)]++; >>>>> + } >>>>> } >>>>> - rss[MM_ANONPAGES]++; >>>>> - } else if (page) { >>>>> - folio_get(folio); >>>>> - page_dup_file_rmap(page, false); >>>>> - rss[mm_counter_file(page)]++; >>>>> + >>>>> + nr = i; >>>>> + folio_ref_add(folio, nr); >>>> >>>> You're changing the order of mapcount vs. refcount increment. Don't. >>>> Make sure your refcount >= mapcount. >>>> >>>> You can do that easily by doing the folio_ref_add(folio, nr) first and >>>> then decrementing in case of error accordingly. Errors due to pinned >>>> pages are the corner case. >>>> >>>> I'll note that it will make a lot of sense to have batch variants of >>>> page_try_dup_anon_rmap() and page_dup_file_rmap(). >>>> >>> >>> i still don't understand why it is not a entire map+1, but an increment >>> in each basepage. >> >> Because we are PTE-mapping the folio, we have to account each individual page. >> If we accounted the entire folio, where would we unaccount it? Each page can be >> unmapped individually (e.g. munmap() part of the folio) so need to account each >> page. When PMD mapping, the whole thing is either mapped or unmapped, and its >> atomic, so we can account the entire thing. > > Hi Ryan, > > There is no problem. for example, a large folio is entirely mapped in > process A with CONPTE, > and only page2 is mapped in process B. > then we will have > > entire_map = 0 > page0.map = -1 > page1.map = -1 > page2.map = 0 > page3.map = -1 > .... > >> >>> >>> as long as it is a CONTPTE large folio, there is no much difference with >>> PMD-mapped large folio. it has all the chance to be DoubleMap and need >>> split. >>> >>> When A and B share a CONTPTE large folio, we do madvise(DONTNEED) or any >>> similar things on a part of the large folio in process A, >>> >>> this large folio will have partially mapped subpage in A (all CONTPE bits >>> in all subpages need to be removed though we only unmap a part of the >>> large folioas HW requires consistent CONTPTEs); and it has entire map in >>> process B(all PTEs are still CONPTES in process B). >>> >>> isn't it more sensible for this large folios to have entire_map = 0(for >>> process B), and subpages which are still mapped in process A has map_count >>> =0? (start from -1). >>> >>>> Especially, the batch variant of page_try_dup_anon_rmap() would only >>>> check once if the folio maybe pinned, and in that case, you can simply >>>> drop all references again. So you either have all or no ptes to process, >>>> which makes that code easier. >> >> I'm afraid this doesn't make sense to me. Perhaps I've misunderstood. But >> fundamentally you can only use entire_mapcount if its only possible to map and >> unmap the whole folio atomically. > > > > My point is that CONTPEs should either all-set in all 16 PTEs or all are dropped > in 16 PTEs. if all PTEs have CONT, it is entirely mapped; otherwise, > it is partially > mapped. if a large folio is mapped in one processes with all CONTPTEs > and meanwhile in another process with partial mapping(w/o CONTPTE), it is > DoubleMapped. There are 2 problems with your proposal, as I see it; 1) the core-mm is not enlightened for CONTPTE mappings. As far as it is concerned, its just mapping a bunch of PTEs. So it has no hook to inc/dec entire_mapcount. The arch code is opportunistically and *transparently* managing the CONT_PTE bit. 2) There is nothing to say a folio isn't *bigger* than the contpte block; it may be 128K and be mapped with 2 contpte blocks. Or even a PTE-mapped THP (2M) and be mapped with 32 contpte blocks. So you can't say it is entirely mapped unless/until ALL of those blocks are set up. And then of course each block could be unmapped unatomically. For the PMD case there are actually 2 properties that allow using the entire_mapcount optimization; It's atomically mapped/unmapped through the PMD and we know that the folio is exactly PMD sized (since it must be at least PMD sized to be able to map it with the PMD, and we don't allocate THPs any bigger than PMD size). So one PMD map or unmap operation corresponds to exactly one *entire* map or unmap. That is not true when we are PTE mapping. > > Since we always hold ptl to set or drop CONTPTE bits, set/drop is > still atomic in a > spinlock area. > >> >>>> >>>> But that can be added on top, and I'll happily do that. >>>> >>>> -- >>>> Cheers, >>>> >>>> David / dhildenb >>> > > Thanks > Barry