Message ID | 20230714161733.4144503-1-ryan.roberts@arm.com |
---|---|
State | New |
Headers |
Return-Path: <linux-kernel-owner@vger.kernel.org> Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:a6b2:0:b0:3e4:2afc:c1 with SMTP id c18csp2632046vqm; Fri, 14 Jul 2023 09:57:00 -0700 (PDT) X-Google-Smtp-Source: APBJJlFCg2IxmAy3MYCGzY6W/5hBrRANy8dlrnZ1qnTxoWf1PoxJbI2exQNB+70g4uXoHdXywvaw X-Received: by 2002:a17:906:a0c2:b0:992:9756:6a22 with SMTP id bh2-20020a170906a0c200b0099297566a22mr3689642ejb.48.1689353819771; Fri, 14 Jul 2023 09:56:59 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1689353819; cv=none; d=google.com; s=arc-20160816; b=t6fmisqLbUC6Iavv/WoA+7H0nnn6wPy/W1d2b2887WOrdZi0A06xEaKUGXB0KbOEsQ IN9cF5/ZnCdNe2sL3nsfmbZKvIw9P3J/i3av4zIGZS5D7VYf24wowcFNfyQKxS5i1RJE z7yARA9joquOcPW1QOhvKNwYzmGljmVuBjYIzfyRq55yjlFI9tiZ5ql9uk1TELUaimlb UAaJ/+AiV8ERnbZqD1HLvP1QO7rsIlUlGfYKqhF4iTbNRTK/GYfd/8C1JlirXFGq0EFm tz1aEVQOdCoNeylunMgsy6fiIUYKbZMhBIkRkv/SziarGHLLulwt+gYoftncGBB2bZQT DpYg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=MtFe+SBpb58GfXPkNa/WZIUSJbi6BRi5IT0DzQBQLj0=; fh=KUn9/czOF/CUegSsbpumpb8eTeZtYrbN2VF58YsSKuI=; b=aN6gqsQCDUBEmRRKnhZFLwTKwgYMGN45CBYAlXjwjefZo9zd9o9/g3lgcXf9qmpsxU FQzM9F+zZ74UD6a2S3hd3+ZzkijRAk/fOH/Uo0OsNiKUlMm3+xfL8OoVNLLpUcT8HbiI h1QqL5hWbXLgaNEjC4KzJMNB2/0Lv3UQStSf11Br8fs/NT1b+qEEH5zcFbSEclso0MP2 XhEf92y0VweKITStf4UStqzUxk8Q+8oW0ywIRwMCBz/MaQyrXsaZMQiIyD29QpqCePtt 2ZDE5wbN0h5OZhJcHd4NnZEZYzS6N8ufmW/SXr3RELRUjA7d+Id/r4BfTmktQDLJiP0O YCzA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 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 (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id w17-20020a1709067c9100b0098e2aa0bb92si9307491ejo.137.2023.07.14.09.56.35; Fri, 14 Jul 2023 09:56:59 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S236309AbjGNQRu (ORCPT <rfc822;hadasmailinglist@gmail.com> + 99 others); Fri, 14 Jul 2023 12:17:50 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:48434 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S236293AbjGNQRr (ORCPT <rfc822;linux-kernel@vger.kernel.org>); Fri, 14 Jul 2023 12:17:47 -0400 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id 604FC30EA for <linux-kernel@vger.kernel.org>; Fri, 14 Jul 2023 09:17:44 -0700 (PDT) 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 56B861570; Fri, 14 Jul 2023 09:18:26 -0700 (PDT) Received: from e125769.cambridge.arm.com (e125769.cambridge.arm.com [10.1.196.26]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 089E33F740; Fri, 14 Jul 2023 09:17:41 -0700 (PDT) From: Ryan Roberts <ryan.roberts@arm.com> To: Andrew Morton <akpm@linux-foundation.org>, Matthew Wilcox <willy@infradead.org>, "Kirill A. Shutemov" <kirill.shutemov@linux.intel.com>, Yin Fengwei <fengwei.yin@intel.com>, David Hildenbrand <david@redhat.com>, Yu Zhao <yuzhao@google.com>, Catalin Marinas <catalin.marinas@arm.com>, Will Deacon <will@kernel.org>, Anshuman Khandual <anshuman.khandual@arm.com>, Yang Shi <shy828301@gmail.com>, "Huang, Ying" <ying.huang@intel.com>, Zi Yan <ziy@nvidia.com>, Luis Chamberlain <mcgrof@kernel.org> Cc: Ryan Roberts <ryan.roberts@arm.com>, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-mm@kvack.org Subject: [PATCH v3 1/4] mm: Non-pmd-mappable, large folios for folio_add_new_anon_rmap() Date: Fri, 14 Jul 2023 17:17:30 +0100 Message-Id: <20230714161733.4144503-1-ryan.roberts@arm.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20230714160407.4142030-1-ryan.roberts@arm.com> References: <20230714160407.4142030-1-ryan.roberts@arm.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-4.2 required=5.0 tests=BAYES_00,RCVD_IN_DNSWL_MED, SPF_HELO_NONE,SPF_NONE,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: <linux-kernel.vger.kernel.org> X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1771415871159641388 X-GMAIL-MSGID: 1771415871159641388 |
Series |
variable-order, large folios for anonymous memory
|
|
Commit Message
Ryan Roberts
July 14, 2023, 4:17 p.m. UTC
In preparation for FLEXIBLE_THP support, improve folio_add_new_anon_rmap() to allow a non-pmd-mappable, large folio to be passed to it. In this case, all contained pages are accounted using the order-0 folio (or base page) scheme. Signed-off-by: Ryan Roberts <ryan.roberts@arm.com> Reviewed-by: Yu Zhao <yuzhao@google.com> Reviewed-by: Yin Fengwei <fengwei.yin@intel.com> --- mm/rmap.c | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) -- 2.25.1
Comments
On Fri, Jul 14, 2023 at 10:17 AM Ryan Roberts <ryan.roberts@arm.com> wrote: > > In preparation for FLEXIBLE_THP support, improve > folio_add_new_anon_rmap() to allow a non-pmd-mappable, large folio to be > passed to it. In this case, all contained pages are accounted using the > order-0 folio (or base page) scheme. > > Signed-off-by: Ryan Roberts <ryan.roberts@arm.com> > Reviewed-by: Yu Zhao <yuzhao@google.com> > Reviewed-by: Yin Fengwei <fengwei.yin@intel.com> This patch doesn't depend on the rest of the series and therefore can be merged separately in case the rest needs more discussion. Ryan, please feel free to post other code paths (those from v1) you've optimized for large anon folios at any time, since each code path can be reviewed and merged individually as well.
On 14/07/2023 17:52, Yu Zhao wrote: > On Fri, Jul 14, 2023 at 10:17 AM Ryan Roberts <ryan.roberts@arm.com> wrote: >> >> In preparation for FLEXIBLE_THP support, improve >> folio_add_new_anon_rmap() to allow a non-pmd-mappable, large folio to be >> passed to it. In this case, all contained pages are accounted using the >> order-0 folio (or base page) scheme. >> >> Signed-off-by: Ryan Roberts <ryan.roberts@arm.com> >> Reviewed-by: Yu Zhao <yuzhao@google.com> >> Reviewed-by: Yin Fengwei <fengwei.yin@intel.com> > > This patch doesn't depend on the rest of the series and therefore can > be merged separately in case the rest needs more discussion. > > Ryan, please feel free to post other code paths (those from v1) you've > optimized for large anon folios at any time, since each code path can > be reviewed and merged individually as well. Will do. Hoping to get the "batch zap" series out on Monday. Others need a bit more time to bake as they will need to be aligned to the changes from the review of this series first.
On 14.07.23 18:17, Ryan Roberts wrote: > In preparation for FLEXIBLE_THP support, improve > folio_add_new_anon_rmap() to allow a non-pmd-mappable, large folio to be > passed to it. In this case, all contained pages are accounted using the > order-0 folio (or base page) scheme. > > Signed-off-by: Ryan Roberts <ryan.roberts@arm.com> > Reviewed-by: Yu Zhao <yuzhao@google.com> > Reviewed-by: Yin Fengwei <fengwei.yin@intel.com> > --- > mm/rmap.c | 28 +++++++++++++++++++++------- > 1 file changed, 21 insertions(+), 7 deletions(-) > > diff --git a/mm/rmap.c b/mm/rmap.c > index 0c0d8857dfce..f293d072368a 100644 > --- a/mm/rmap.c > +++ b/mm/rmap.c > @@ -1278,31 +1278,45 @@ void page_add_anon_rmap(struct page *page, struct vm_area_struct *vma, > * This means the inc-and-test can be bypassed. > * The folio does not have to be locked. > * > - * If the folio is large, it is accounted as a THP. As the folio > + * If the folio is pmd-mappable, it is accounted as a THP. As the folio > * is new, it's assumed to be mapped exclusively by a single process. > */ > void folio_add_new_anon_rmap(struct folio *folio, struct vm_area_struct *vma, > unsigned long address) > { > - int nr; > + int nr = folio_nr_pages(folio); > > - VM_BUG_ON_VMA(address < vma->vm_start || address >= vma->vm_end, vma); > + VM_BUG_ON_VMA(address < vma->vm_start || > + address + (nr << PAGE_SHIFT) > vma->vm_end, vma); > __folio_set_swapbacked(folio); > > - if (likely(!folio_test_pmd_mappable(folio))) { > + if (!folio_test_large(folio)) { Why remove the "likely" here? The patch itself does not change anything about that condition. > /* increment count (starts at -1) */ > atomic_set(&folio->_mapcount, 0); > - nr = 1; > + __page_set_anon_rmap(folio, &folio->page, vma, address, 1); > + } else if (!folio_test_pmd_mappable(folio)) { > + int i; > + > + for (i = 0; i < nr; i++) { > + struct page *page = folio_page(folio, i); > + > + /* increment count (starts at -1) */ > + atomic_set(&page->_mapcount, 0); > + __page_set_anon_rmap(folio, page, vma, > + address + (i << PAGE_SHIFT), 1); > + } > + > + /* increment count (starts at 0) */ That comment is a bit misleading. We're not talking about a mapcount as in the other cases here. > + atomic_set(&folio->_nr_pages_mapped, nr); > } else { > /* increment count (starts at -1) */ > atomic_set(&folio->_entire_mapcount, 0); > atomic_set(&folio->_nr_pages_mapped, COMPOUND_MAPPED); > - nr = folio_nr_pages(folio); > + __page_set_anon_rmap(folio, &folio->page, vma, address, 1); > __lruvec_stat_mod_folio(folio, NR_ANON_THPS, nr); > } > Apart from that, LGTM.
On 17/07/2023 14:00, David Hildenbrand wrote: > On 14.07.23 18:17, Ryan Roberts wrote: >> In preparation for FLEXIBLE_THP support, improve >> folio_add_new_anon_rmap() to allow a non-pmd-mappable, large folio to be >> passed to it. In this case, all contained pages are accounted using the >> order-0 folio (or base page) scheme. >> >> Signed-off-by: Ryan Roberts <ryan.roberts@arm.com> >> Reviewed-by: Yu Zhao <yuzhao@google.com> >> Reviewed-by: Yin Fengwei <fengwei.yin@intel.com> >> --- >> mm/rmap.c | 28 +++++++++++++++++++++------- >> 1 file changed, 21 insertions(+), 7 deletions(-) >> >> diff --git a/mm/rmap.c b/mm/rmap.c >> index 0c0d8857dfce..f293d072368a 100644 >> --- a/mm/rmap.c >> +++ b/mm/rmap.c >> @@ -1278,31 +1278,45 @@ void page_add_anon_rmap(struct page *page, struct >> vm_area_struct *vma, >> * This means the inc-and-test can be bypassed. >> * The folio does not have to be locked. >> * >> - * If the folio is large, it is accounted as a THP. As the folio >> + * If the folio is pmd-mappable, it is accounted as a THP. As the folio >> * is new, it's assumed to be mapped exclusively by a single process. >> */ >> void folio_add_new_anon_rmap(struct folio *folio, struct vm_area_struct *vma, >> unsigned long address) >> { >> - int nr; >> + int nr = folio_nr_pages(folio); >> >> - VM_BUG_ON_VMA(address < vma->vm_start || address >= vma->vm_end, vma); >> + VM_BUG_ON_VMA(address < vma->vm_start || >> + address + (nr << PAGE_SHIFT) > vma->vm_end, vma); >> __folio_set_swapbacked(folio); >> >> - if (likely(!folio_test_pmd_mappable(folio))) { >> + if (!folio_test_large(folio)) { > > Why remove the "likely" here? The patch itself does not change anything about > that condition. Good question; I'm not sure why. Will have to put it down to bad copy/paste fixup. Will put it back in the next version. > >> /* increment count (starts at -1) */ >> atomic_set(&folio->_mapcount, 0); >> - nr = 1; >> + __page_set_anon_rmap(folio, &folio->page, vma, address, 1); >> + } else if (!folio_test_pmd_mappable(folio)) { >> + int i; >> + >> + for (i = 0; i < nr; i++) { >> + struct page *page = folio_page(folio, i); >> + >> + /* increment count (starts at -1) */ >> + atomic_set(&page->_mapcount, 0); >> + __page_set_anon_rmap(folio, page, vma, >> + address + (i << PAGE_SHIFT), 1); >> + } >> + >> + /* increment count (starts at 0) */ > > That comment is a bit misleading. We're not talking about a mapcount as in the > other cases here. Correct, I'm talking about _nr_pages_mapped, which starts 0, not -1 like _mapcount. The comment was intended to be in the style used in other similar places in rmap.c. I could change it to: "_nr_pages_mapped is 0-based, so set it to the number of pages in the folio" or remove it entirely? What do you prefer? > >> + atomic_set(&folio->_nr_pages_mapped, nr); >> } else { >> /* increment count (starts at -1) */ >> atomic_set(&folio->_entire_mapcount, 0); >> atomic_set(&folio->_nr_pages_mapped, COMPOUND_MAPPED); >> - nr = folio_nr_pages(folio); >> + __page_set_anon_rmap(folio, &folio->page, vma, address, 1); >> __lruvec_stat_mod_folio(folio, NR_ANON_THPS, nr); >> } >> > > Apart from that, LGTM. >
On 17.07.23 15:13, Ryan Roberts wrote: > On 17/07/2023 14:00, David Hildenbrand wrote: >> On 14.07.23 18:17, Ryan Roberts wrote: >>> In preparation for FLEXIBLE_THP support, improve >>> folio_add_new_anon_rmap() to allow a non-pmd-mappable, large folio to be >>> passed to it. In this case, all contained pages are accounted using the >>> order-0 folio (or base page) scheme. >>> >>> Signed-off-by: Ryan Roberts <ryan.roberts@arm.com> >>> Reviewed-by: Yu Zhao <yuzhao@google.com> >>> Reviewed-by: Yin Fengwei <fengwei.yin@intel.com> >>> --- >>> mm/rmap.c | 28 +++++++++++++++++++++------- >>> 1 file changed, 21 insertions(+), 7 deletions(-) >>> >>> diff --git a/mm/rmap.c b/mm/rmap.c >>> index 0c0d8857dfce..f293d072368a 100644 >>> --- a/mm/rmap.c >>> +++ b/mm/rmap.c >>> @@ -1278,31 +1278,45 @@ void page_add_anon_rmap(struct page *page, struct >>> vm_area_struct *vma, >>> * This means the inc-and-test can be bypassed. >>> * The folio does not have to be locked. >>> * >>> - * If the folio is large, it is accounted as a THP. As the folio >>> + * If the folio is pmd-mappable, it is accounted as a THP. As the folio >>> * is new, it's assumed to be mapped exclusively by a single process. >>> */ >>> void folio_add_new_anon_rmap(struct folio *folio, struct vm_area_struct *vma, >>> unsigned long address) >>> { >>> - int nr; >>> + int nr = folio_nr_pages(folio); >>> >>> - VM_BUG_ON_VMA(address < vma->vm_start || address >= vma->vm_end, vma); >>> + VM_BUG_ON_VMA(address < vma->vm_start || >>> + address + (nr << PAGE_SHIFT) > vma->vm_end, vma); >>> __folio_set_swapbacked(folio); >>> >>> - if (likely(!folio_test_pmd_mappable(folio))) { >>> + if (!folio_test_large(folio)) { >> >> Why remove the "likely" here? The patch itself does not change anything about >> that condition. > > Good question; I'm not sure why. Will have to put it down to bad copy/paste > fixup. Will put it back in the next version. > >> >>> /* increment count (starts at -1) */ >>> atomic_set(&folio->_mapcount, 0); >>> - nr = 1; >>> + __page_set_anon_rmap(folio, &folio->page, vma, address, 1); >>> + } else if (!folio_test_pmd_mappable(folio)) { >>> + int i; >>> + >>> + for (i = 0; i < nr; i++) { >>> + struct page *page = folio_page(folio, i); >>> + >>> + /* increment count (starts at -1) */ >>> + atomic_set(&page->_mapcount, 0); >>> + __page_set_anon_rmap(folio, page, vma, >>> + address + (i << PAGE_SHIFT), 1); >>> + } >>> + >>> + /* increment count (starts at 0) */ >> >> That comment is a bit misleading. We're not talking about a mapcount as in the >> other cases here. > > Correct, I'm talking about _nr_pages_mapped, which starts 0, not -1 like > _mapcount. The comment was intended to be in the style used in other similar > places in rmap.c. I could change it to: "_nr_pages_mapped is 0-based, so set it > to the number of pages in the folio" or remove it entirely? What do you prefer? > We only have to comment what's weird, not what's normal. IOW, we also didn't have such a comment in the existing code when doing atomic_set(&folio->_nr_pages_mapped, COMPOUND_MAPPED); What might make sense here is a simple "All pages of the folio are PTE-mapped."
On 17/07/2023 14:19, David Hildenbrand wrote: > On 17.07.23 15:13, Ryan Roberts wrote: >> On 17/07/2023 14:00, David Hildenbrand wrote: >>> On 14.07.23 18:17, Ryan Roberts wrote: >>>> In preparation for FLEXIBLE_THP support, improve >>>> folio_add_new_anon_rmap() to allow a non-pmd-mappable, large folio to be >>>> passed to it. In this case, all contained pages are accounted using the >>>> order-0 folio (or base page) scheme. >>>> >>>> Signed-off-by: Ryan Roberts <ryan.roberts@arm.com> >>>> Reviewed-by: Yu Zhao <yuzhao@google.com> >>>> Reviewed-by: Yin Fengwei <fengwei.yin@intel.com> >>>> --- >>>> mm/rmap.c | 28 +++++++++++++++++++++------- >>>> 1 file changed, 21 insertions(+), 7 deletions(-) >>>> >>>> diff --git a/mm/rmap.c b/mm/rmap.c >>>> index 0c0d8857dfce..f293d072368a 100644 >>>> --- a/mm/rmap.c >>>> +++ b/mm/rmap.c >>>> @@ -1278,31 +1278,45 @@ void page_add_anon_rmap(struct page *page, struct >>>> vm_area_struct *vma, >>>> * This means the inc-and-test can be bypassed. >>>> * The folio does not have to be locked. >>>> * >>>> - * If the folio is large, it is accounted as a THP. As the folio >>>> + * If the folio is pmd-mappable, it is accounted as a THP. As the folio >>>> * is new, it's assumed to be mapped exclusively by a single process. >>>> */ >>>> void folio_add_new_anon_rmap(struct folio *folio, struct vm_area_struct >>>> *vma, >>>> unsigned long address) >>>> { >>>> - int nr; >>>> + int nr = folio_nr_pages(folio); >>>> >>>> - VM_BUG_ON_VMA(address < vma->vm_start || address >= vma->vm_end, vma); >>>> + VM_BUG_ON_VMA(address < vma->vm_start || >>>> + address + (nr << PAGE_SHIFT) > vma->vm_end, vma); >>>> __folio_set_swapbacked(folio); >>>> >>>> - if (likely(!folio_test_pmd_mappable(folio))) { >>>> + if (!folio_test_large(folio)) { >>> >>> Why remove the "likely" here? The patch itself does not change anything about >>> that condition. >> >> Good question; I'm not sure why. Will have to put it down to bad copy/paste >> fixup. Will put it back in the next version. >> >>> >>>> /* increment count (starts at -1) */ >>>> atomic_set(&folio->_mapcount, 0); >>>> - nr = 1; >>>> + __page_set_anon_rmap(folio, &folio->page, vma, address, 1); >>>> + } else if (!folio_test_pmd_mappable(folio)) { >>>> + int i; >>>> + >>>> + for (i = 0; i < nr; i++) { >>>> + struct page *page = folio_page(folio, i); >>>> + >>>> + /* increment count (starts at -1) */ >>>> + atomic_set(&page->_mapcount, 0); >>>> + __page_set_anon_rmap(folio, page, vma, >>>> + address + (i << PAGE_SHIFT), 1); >>>> + } >>>> + >>>> + /* increment count (starts at 0) */ >>> >>> That comment is a bit misleading. We're not talking about a mapcount as in the >>> other cases here. >> >> Correct, I'm talking about _nr_pages_mapped, which starts 0, not -1 like >> _mapcount. The comment was intended to be in the style used in other similar >> places in rmap.c. I could change it to: "_nr_pages_mapped is 0-based, so set it >> to the number of pages in the folio" or remove it entirely? What do you prefer? >> > > We only have to comment what's weird, not what's normal. > > IOW, we also didn't have such a comment in the existing code when doing > atomic_set(&folio->_nr_pages_mapped, COMPOUND_MAPPED); > > > What might make sense here is a simple > > "All pages of the folio are PTE-mapped." > ACK - thanks.
diff --git a/mm/rmap.c b/mm/rmap.c index 0c0d8857dfce..f293d072368a 100644 --- a/mm/rmap.c +++ b/mm/rmap.c @@ -1278,31 +1278,45 @@ void page_add_anon_rmap(struct page *page, struct vm_area_struct *vma, * This means the inc-and-test can be bypassed. * The folio does not have to be locked. * - * If the folio is large, it is accounted as a THP. As the folio + * If the folio is pmd-mappable, it is accounted as a THP. As the folio * is new, it's assumed to be mapped exclusively by a single process. */ void folio_add_new_anon_rmap(struct folio *folio, struct vm_area_struct *vma, unsigned long address) { - int nr; + int nr = folio_nr_pages(folio); - VM_BUG_ON_VMA(address < vma->vm_start || address >= vma->vm_end, vma); + VM_BUG_ON_VMA(address < vma->vm_start || + address + (nr << PAGE_SHIFT) > vma->vm_end, vma); __folio_set_swapbacked(folio); - if (likely(!folio_test_pmd_mappable(folio))) { + if (!folio_test_large(folio)) { /* increment count (starts at -1) */ atomic_set(&folio->_mapcount, 0); - nr = 1; + __page_set_anon_rmap(folio, &folio->page, vma, address, 1); + } else if (!folio_test_pmd_mappable(folio)) { + int i; + + for (i = 0; i < nr; i++) { + struct page *page = folio_page(folio, i); + + /* increment count (starts at -1) */ + atomic_set(&page->_mapcount, 0); + __page_set_anon_rmap(folio, page, vma, + address + (i << PAGE_SHIFT), 1); + } + + /* increment count (starts at 0) */ + atomic_set(&folio->_nr_pages_mapped, nr); } else { /* increment count (starts at -1) */ atomic_set(&folio->_entire_mapcount, 0); atomic_set(&folio->_nr_pages_mapped, COMPOUND_MAPPED); - nr = folio_nr_pages(folio); + __page_set_anon_rmap(folio, &folio->page, vma, address, 1); __lruvec_stat_mod_folio(folio, NR_ANON_THPS, nr); } __lruvec_stat_mod_folio(folio, NR_ANON_MAPPED, nr); - __page_set_anon_rmap(folio, &folio->page, vma, address, 1); } /**