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 Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 5CAEEC38142 for ; Tue, 31 Jan 2023 07:28:14 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id DC0EE6B0072; Tue, 31 Jan 2023 02:28:13 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id D70CD6B0073; Tue, 31 Jan 2023 02:28:13 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id C387A6B0074; Tue, 31 Jan 2023 02:28:13 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0016.hostedemail.com [216.40.44.16]) by kanga.kvack.org (Postfix) with ESMTP id B358A6B0072 for ; Tue, 31 Jan 2023 02:28:13 -0500 (EST) Received: from smtpin26.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay07.hostedemail.com (Postfix) with ESMTP id 85B0F160566 for ; Tue, 31 Jan 2023 07:28:13 +0000 (UTC) X-FDA: 80414265666.26.C07647F Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) by imf26.hostedemail.com (Postfix) with ESMTP id 3F40914001A for ; Tue, 31 Jan 2023 07:28:11 +0000 (UTC) Authentication-Results: imf26.hostedemail.com; dkim=pass header.d=intel.com header.s=Intel header.b=dmOmPxXD; spf=pass (imf26.hostedemail.com: domain of ying.huang@intel.com designates 192.55.52.93 as permitted sender) smtp.mailfrom=ying.huang@intel.com; dmarc=pass (policy=none) header.from=intel.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1675150091; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=3L+XcyMfn8EpGHXDfnztqKAtTmCQbkXcljjcQ2A9XRE=; b=z/+yVn7tr6f2zKsV0VBtKykCofJCbPparUNULE9aa9kigT3lslPCn7N1sE/9rlx0/vBLpE Y4rADz+KiUrsufRdc2yjThhR2Al2677wR1RKvQhHI7wcaug8WpeJDOuWry+r/sGE6gUdPE VEkNhWhDHprSHaw3PVwgCH2Bhhoixa4= ARC-Authentication-Results: i=1; imf26.hostedemail.com; dkim=pass header.d=intel.com header.s=Intel header.b=dmOmPxXD; spf=pass (imf26.hostedemail.com: domain of ying.huang@intel.com designates 192.55.52.93 as permitted sender) smtp.mailfrom=ying.huang@intel.com; dmarc=pass (policy=none) header.from=intel.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1675150091; a=rsa-sha256; cv=none; b=ACjZa5ZtircEFvOHXcosdcCrrjzXHGehjvYfxIJFcPCCGilXWgY380JUv2pzAW/eXL4HVh +n/KyR1fEp1uYe337iSeCbPH+UfmAQSwqVNjSFpH4h83JlRI12KiKyrzI3EKx4Vm2tpJHc ej18NWF04VjINmKBFNhmzSc+Ca52PYc= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1675150091; x=1706686091; h=from:to:cc:subject:references:date:in-reply-to: message-id:mime-version; bh=/yjyGBe0Xny6MpdazFELBEpXCsz3AmT094lYpWXuocc=; b=dmOmPxXDw6BzHJ48GqvzYMaJcsFZ8w3+9Vkx93BbfKq4/rrTAhSQpt7f oVc/hHJSyf42W4wfrB0sL5oJNNaA/40Sef8v8+fs+i5Bid4i9DpaASgD1 /jqGsOFE3C40Ll80hyPQknK3UC4+pfxrnvT7mbnsqft2spf3Asy4k6vQq lLKFQuawXNk6ndspDe9w4ythwN19JDOq0WHbdHmpx3viZK2Rzo6uNFQHx 9zSTXMGjBe8IPlZdox7YN/kxtHMJHyIVAlBV0PIqsDOCjKgZHEAaxPQGH vhJhGHY8YzDmRczfnjxGDN9eWgAvKok4WChbX3ORwq6TJtWDM5SOPynnh Q==; X-IronPort-AV: E=McAfee;i="6500,9779,10606"; a="325467946" X-IronPort-AV: E=Sophos;i="5.97,259,1669104000"; d="scan'208";a="325467946" Received: from orsmga004.jf.intel.com ([10.7.209.38]) by fmsmga102.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 30 Jan 2023 23:26:20 -0800 X-IronPort-AV: E=McAfee;i="6500,9779,10606"; a="788340833" X-IronPort-AV: E=Sophos;i="5.97,259,1669104000"; d="scan'208";a="788340833" Received: from yhuang6-desk2.sh.intel.com (HELO yhuang6-desk2.ccr.corp.intel.com) ([10.238.208.55]) by orsmga004-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 30 Jan 2023 23:26:16 -0800 From: "Huang, Ying" To: Yin Fengwei Cc: , , , , Subject: Re: [RFC PATCH 3/5] rmap: add page_add_file_rmap_range() References: <20230130125504.2509710-1-fengwei.yin@intel.com> <20230130125504.2509710-4-fengwei.yin@intel.com> Date: Tue, 31 Jan 2023 15:24:45 +0800 In-Reply-To: <20230130125504.2509710-4-fengwei.yin@intel.com> (Yin Fengwei's message of "Mon, 30 Jan 2023 20:55:02 +0800") Message-ID: <87pmavrwsi.fsf@yhuang6-desk2.ccr.corp.intel.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/27.1 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=ascii X-Rspam-User: X-Rspamd-Server: rspam04 X-Rspamd-Queue-Id: 3F40914001A X-Stat-Signature: ga9bubd3r7f9mz95ti1b67qg7inp3aus X-HE-Tag: 1675150091-16260 X-HE-Meta: U2FsdGVkX1+HqSIHNdgwnXcioatNBbNZ6wugAdhlLGwibOIGq/Ug21gf5RB+JrAZ/BJpmPZPO15rBL275ZgsMlSfKWCUTxopU1pmBpd4C6gWDDee6eSSp1kc69rKw3SwiDzK3nolZWF95Lghd00hg6ZDig3lJZ+UPeynnO6J603i/KrY7dViYc2BmNGc6RwxyY1JXJ+BHEpzhfINzcpYNiKVVmd5Zze2v2RaA9a+J4gRrOlkdEmspBsjFISilBRLN5RrTQFLWDM7CCcyGjiyQTFvbPm0i8y+yeGY3SpT+sXJlU2SXPQH05OhqBGz005Om9xjVnp4ziadDINw8ry05wbrtS9Tagd7kNhWO0Q8S+Kw7uKjWR9+SR2nNYFrTkX7TIFp5rSh7ewQ4RSFNIT1T4dI5L6ld7C8Q5clUDrm7Op8it98AhPQYVZZ3Dyc+y4dO3kBMwwg0qppZ1k1MYIOJNL2at2f5jGjBQfXFmZHDYs8I5kpuvjNLx583Ao6YgPfP7/2Q+ny/Szw1mrkjVjVdR6k1beLtClu2Fup055YfyEMWyEC4L/vQaDdN41IssrAkvWzXldDYSZU+V4U8H6uoKZ0quKVtXphtVocG0U0eoqOGCixuEM+3PDch5EbK3tAv21oW00C2tjSXvcVdgwSQnJqRIqXUwP1dNYVx2mb0Vh5yxKY14BgaPlsrM67tFWww0f0LVk46uV7JH8Tq34eWmL33H62CVTN8jE9cbT3oqSnJBWn27ODQaqfflSyrE8j0bHL8v5w9Kr6VEQVCHtkjJ0cFM2a9sjhG+z4/nubM7fjsB2iFFZ4mDU77MKe1jjhmyxYTkaTXPYwr4leHoi0AI+QSmuJ0I9AVMchM1f800drY1n4IvN/paNx9siNBVNsFJx0DZrNMYr69glfvpznQvACKg0OXlV0Fmrqy3OnE1Zj20PD0rhG/L6MARnk5tUJAmOrxmnSwwk1rqEiMvR Q6Z1+fGk iVk/4LoMT6Sk1GV0FaileP/p3E48UCVp4yu8EWDkEw9I2yHZlGsQwHZnn6AwhBR+du/7yG0OUox/xcmmb88BqTd9AqF5i8Zr9ulRH4zXNRrHrMd2fm1h5otUNdIR9vcaFc2FVflzUxl6VXxT6i/ArANGFxD02R3zTcsF1V8mwHpv34D2iQeL8X3EkXYzGvAjmmRPizgEJRCCrHtplE00HRnMz/Dloj1A0QaJuxhra9nIwgHxnZfv+QCkMT+ti7TDSz2cQ/UUxGp9nkec= 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: Yin Fengwei writes: > page_add_file_rmap_range() allows to add specific range of > large folio rmap. > > Signed-off-by: Yin Fengwei > --- > include/linux/rmap.h | 2 ++ > mm/rmap.c | 70 ++++++++++++++++++++++++++++---------------- > 2 files changed, 46 insertions(+), 26 deletions(-) > > diff --git a/include/linux/rmap.h b/include/linux/rmap.h > index a6bd1f0a183d..063e0addcbf8 100644 > --- a/include/linux/rmap.h > +++ b/include/linux/rmap.h > @@ -198,6 +198,8 @@ void folio_add_new_anon_rmap(struct folio *, struct vm_area_struct *, > unsigned long address); > void page_add_file_rmap(struct page *, struct vm_area_struct *, > bool compound); > +void page_add_file_rmap_range(struct folio *, struct page *, int len, > + struct vm_area_struct *, bool compound); > void page_remove_rmap(struct page *, struct vm_area_struct *, > bool compound); > > diff --git a/mm/rmap.c b/mm/rmap.c > index 948ca17a96ad..cc7fe3010330 100644 > --- a/mm/rmap.c > +++ b/mm/rmap.c > @@ -1301,40 +1301,19 @@ void folio_add_new_anon_rmap(struct folio *folio, struct vm_area_struct *vma, > __page_set_anon_rmap(folio, &folio->page, vma, address, 1); > } > > -/** > - * page_add_file_rmap - add pte mapping to a file page > - * @page: the page to add the mapping to > - * @vma: the vm area in which the mapping is added > - * @compound: charge the page as compound or small page > - * > - * The caller needs to hold the pte lock. > - */ > -void page_add_file_rmap(struct page *page, struct vm_area_struct *vma, > - bool compound) > +void page_add_file_rmap_range(struct folio *folio, struct page *page, int len, > + struct vm_area_struct *vma, bool compound) > { > - struct folio *folio = page_folio(page); > atomic_t *mapped = &folio->_nr_pages_mapped; > - int nr = 0, nr_pmdmapped = 0; > + int nr = 0, nr_pmdmapped = 0, nr_pages = folio_nr_pages(folio); > bool first; > > - VM_BUG_ON_PAGE(compound && !PageTransHuge(page), page); > - > - /* Is page being mapped by PTE? Is this its first map to be added? */ > - if (likely(!compound)) { > - first = atomic_inc_and_test(&page->_mapcount); > - nr = first; > - if (first && folio_test_large(folio)) { > - nr = atomic_inc_return_relaxed(mapped); > - nr = (nr < COMPOUND_MAPPED); > - } > - } else if (folio_test_pmd_mappable(folio)) { > - /* That test is redundant: it's for safety or to optimize out */ > - > + if (compound) { > first = atomic_inc_and_test(&folio->_entire_mapcount); > if (first) { > nr = atomic_add_return_relaxed(COMPOUND_MAPPED, mapped); > if (likely(nr < COMPOUND_MAPPED + COMPOUND_MAPPED)) { > - nr_pmdmapped = folio_nr_pages(folio); > + nr_pmdmapped = nr_pages; > nr = nr_pmdmapped - (nr & FOLIO_PAGES_MAPPED); > /* Raced ahead of a remove and another add? */ > if (unlikely(nr < 0)) > @@ -1344,6 +1323,20 @@ void page_add_file_rmap(struct page *page, struct vm_area_struct *vma, > nr = 0; > } > } > + } else { > + int i = 0, new_mapped = 0, count; > + > + count = min_t(int, len, nr_pages - folio_page_idx(folio, page)); It appears that count isn't used after assignment. Best Regards, Huang, Ying > + do { > + first = atomic_inc_and_test(&page->_mapcount); > + new_mapped = first; > + if (first && folio_test_large(folio)) { > + new_mapped = atomic_inc_return_relaxed(mapped); > + new_mapped = (new_mapped < COMPOUND_MAPPED); > + } > + if (new_mapped) > + nr++; > + } while (page++, ++i < len); > } > > if (nr_pmdmapped) > @@ -1355,6 +1348,31 @@ void page_add_file_rmap(struct page *page, struct vm_area_struct *vma, > mlock_vma_folio(folio, vma, compound); > } > > +/** > + * page_add_file_rmap - add pte mapping to a file page > + * @page: the page to add the mapping to > + * @vma: the vm area in which the mapping is added > + * @compound: charge the page as compound or small page > + * > + * The caller needs to hold the pte lock. > + */ > +void page_add_file_rmap(struct page *page, struct vm_area_struct *vma, > + bool compound) > +{ > + struct folio *folio = page_folio(page); > + int nr_pages; > + > + VM_BUG_ON_PAGE(compound && !PageTransHuge(page), page); > + > + if (likely(!compound)) > + nr_pages = 1; > + else > + nr_pages = folio_nr_pages(folio); > + > + page_add_file_rmap_range(folio, page, nr_pages, vma, compound); > +} > + > /** > * page_remove_rmap - take down pte mapping from a page > * @page: page to remove mapping from