Received: by 2002:a05:7412:8d10:b0:f3:1519:9f41 with SMTP id bj16csp241345rdb; Tue, 5 Dec 2023 04:22:53 -0800 (PST) X-Google-Smtp-Source: AGHT+IEI0ABXRHS9590k1Oz0P8/xJJmvaYSMiJQKlq1LlpWe0x5VZhy0rvJq7bErydAR8acwjVka X-Received: by 2002:a17:902:7616:b0:1d0:ae84:6107 with SMTP id k22-20020a170902761600b001d0ae846107mr2123328pll.38.1701778973176; Tue, 05 Dec 2023 04:22:53 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1701778973; cv=none; d=google.com; s=arc-20160816; b=wT/TTMZSeqe651T5pyGfWMqUx4chMP8vYYliuEXxht16u8pfsrjTHC29CodtIV9gMo jCQ33JzH0Vl7hHnaatRU0qOZOsj17QlT3SOFCW2hS4gmmvBB1RmMvnFDEgdycfEkRXZn 5+SZ4c+AJyIyjrkBg99pr5/ijkn4iyXqYF/txf+mVExCjy32l+IVJLFkmpM+nvuW9gD3 Qo1JRfc7Qvzbiye7LJxOdCQvUFI3JvANn6i1jIRQMv9VhUKtnprmI7OtyR2KQou+8WoM bdnzewq3WT1HFKv2eHvZuGZUyZXbszMXPJ4IYlJHou91Y6gfcQRarbVEEAZ6MxvPYs7X oDhg== 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=prn9nyk4HyENIlB7q85f82khsorEzjdzdT/Eqn+6gQE=; fh=GlLzLBhqF07GE0FJUf82nnkBDPyXS9iIZ0BDzvPX32s=; b=iU34AjhtSN43b23LOeCChd5tIjA1M1VtLPLk9YXguKgLGYEENTFoeiU+8g8+nnN3w4 vLztLD5WoiC99IOs8nmwUa13r4OtquxPreGR8kj8II3rmSUAKbpe5osD9xH9H4um9+wx fEcXKsxMU9prNwVLCdCxIFN41MUeD6tx851y8lrIeM5QZXTHCBS3ee+JsdOWjankWg8Z OboNtt4SbTzFvr6qOsopQCjlQG/+wwJTRMJyZ0kxjSnv7bdbCKfwQqseI1IFPytFdE7O CAY/65ZLRdqbwMcIoEePYb4VtuWNXZacvdbgA/hWG4nIwTmdmLxjYkAcVbhQblndF+ih LQag== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:4 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 howler.vger.email (howler.vger.email. [2620:137:e000::3:4]) by mx.google.com with ESMTPS id l5-20020a170903120500b001d00c80f3b3si9513113plh.280.2023.12.05.04.22.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 05 Dec 2023 04:22:53 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:4 as permitted sender) client-ip=2620:137:e000::3:4; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:4 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 howler.vger.email (Postfix) with ESMTP id D2A63801B305; Tue, 5 Dec 2023 04:22:49 -0800 (PST) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.11 at howler.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1344974AbjLEMWf (ORCPT + 99 others); Tue, 5 Dec 2023 07:22:35 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:59252 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231916AbjLEMWe (ORCPT ); Tue, 5 Dec 2023 07:22:34 -0500 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id 27B3EC6 for ; Tue, 5 Dec 2023 04:22:41 -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 609DD139F; Tue, 5 Dec 2023 04:23:27 -0800 (PST) Received: from [10.57.73.130] (unknown [10.57.73.130]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 63A123F5A1; Tue, 5 Dec 2023 04:22:39 -0800 (PST) Message-ID: <3c03d009-6a46-4321-a38b-9707b4558618@arm.com> Date: Tue, 5 Dec 2023 12:22:37 +0000 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH RFC 15/39] mm/huge_memory: batch rmap operations in __split_huge_pmd_locked() Content-Language: en-GB To: David Hildenbrand , linux-kernel@vger.kernel.org Cc: linux-mm@kvack.org, Andrew Morton , "Matthew Wilcox (Oracle)" , Hugh Dickins , Yin Fengwei , Mike Kravetz , Muchun Song , Peter Xu References: <20231204142146.91437-1-david@redhat.com> <20231204142146.91437-16-david@redhat.com> From: Ryan Roberts In-Reply-To: <20231204142146.91437-16-david@redhat.com> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit 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 howler.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 (howler.vger.email [0.0.0.0]); Tue, 05 Dec 2023 04:22:50 -0800 (PST) On 04/12/2023 14:21, David Hildenbrand wrote: > Let's use folio_add_anon_rmap_ptes(), batching the rmap operations. > > While at it, use more folio operations (but only in the code branch we're > touching), use VM_WARN_ON_FOLIO(), and pass RMAP_COMPOUND instead of You mean RMAP_EXCLUSIVE? > manually setting PageAnonExclusive. > > We should never see non-anon pages on that branch: otherwise, the > existing page_add_anon_rmap() call would have been flawed already. > > Signed-off-by: David Hildenbrand > --- > mm/huge_memory.c | 23 +++++++++++++++-------- > 1 file changed, 15 insertions(+), 8 deletions(-) > > diff --git a/mm/huge_memory.c b/mm/huge_memory.c > index cb33c6e0404cf..2c037ab3f4916 100644 > --- a/mm/huge_memory.c > +++ b/mm/huge_memory.c > @@ -2099,6 +2099,7 @@ static void __split_huge_pmd_locked(struct vm_area_struct *vma, pmd_t *pmd, > unsigned long haddr, bool freeze) > { > struct mm_struct *mm = vma->vm_mm; > + struct folio *folio; > struct page *page; > pgtable_t pgtable; > pmd_t old_pmd, _pmd; > @@ -2194,16 +2195,18 @@ static void __split_huge_pmd_locked(struct vm_area_struct *vma, pmd_t *pmd, > uffd_wp = pmd_swp_uffd_wp(old_pmd); > } else { > page = pmd_page(old_pmd); > + folio = page_folio(page); > if (pmd_dirty(old_pmd)) { > dirty = true; > - SetPageDirty(page); > + folio_set_dirty(folio); > } > write = pmd_write(old_pmd); > young = pmd_young(old_pmd); > soft_dirty = pmd_soft_dirty(old_pmd); > uffd_wp = pmd_uffd_wp(old_pmd); > > - VM_BUG_ON_PAGE(!page_count(page), page); > + VM_WARN_ON_FOLIO(!folio_ref_count(folio), folio); > + VM_WARN_ON_FOLIO(!folio_test_anon(folio), folio); > > /* > * Without "freeze", we'll simply split the PMD, propagating the > @@ -2220,11 +2223,18 @@ static void __split_huge_pmd_locked(struct vm_area_struct *vma, pmd_t *pmd, > * > * See page_try_share_anon_rmap(): invalidate PMD first. > */ > - anon_exclusive = PageAnon(page) && PageAnonExclusive(page); > + anon_exclusive = PageAnonExclusive(page); > if (freeze && anon_exclusive && page_try_share_anon_rmap(page)) > freeze = false; > - if (!freeze) > - page_ref_add(page, HPAGE_PMD_NR - 1); > + if (!freeze) { > + rmap_t rmap_flags = RMAP_NONE; > + > + folio_ref_add(folio, HPAGE_PMD_NR - 1); > + if (anon_exclusive) > + rmap_flags = RMAP_EXCLUSIVE; nit: I'd be inclined to make this |= since you're accumulating optional falgs. Yes, its the only one so it still works as is... > + folio_add_anon_rmap_ptes(folio, page, HPAGE_PMD_NR, > + vma, haddr, rmap_flags); > + } > } > > /* > @@ -2267,8 +2277,6 @@ static void __split_huge_pmd_locked(struct vm_area_struct *vma, pmd_t *pmd, > entry = mk_pte(page + i, READ_ONCE(vma->vm_page_prot)); > if (write) > entry = pte_mkwrite(entry, vma); > - if (anon_exclusive) > - SetPageAnonExclusive(page + i); > if (!young) > entry = pte_mkold(entry); > /* NOTE: this may set soft-dirty too on some archs */ > @@ -2278,7 +2286,6 @@ static void __split_huge_pmd_locked(struct vm_area_struct *vma, pmd_t *pmd, > entry = pte_mksoft_dirty(entry); > if (uffd_wp) > entry = pte_mkuffd_wp(entry); > - page_add_anon_rmap(page + i, vma, addr, RMAP_NONE); > } > VM_BUG_ON(!pte_none(ptep_get(pte))); > set_pte_at(mm, addr, pte, entry);