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 9375FC4167B for ; Mon, 11 Dec 2023 16:25:58 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 2E2A46B0168; Mon, 11 Dec 2023 11:25:58 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 292AF6B016A; Mon, 11 Dec 2023 11:25:58 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 182266B016B; Mon, 11 Dec 2023 11:25:58 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0010.hostedemail.com [216.40.44.10]) by kanga.kvack.org (Postfix) with ESMTP id 0A1DD6B0168 for ; Mon, 11 Dec 2023 11:25:58 -0500 (EST) Received: from smtpin24.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay10.hostedemail.com (Postfix) with ESMTP id D2C0BC073F for ; Mon, 11 Dec 2023 16:25:57 +0000 (UTC) X-FDA: 81555063954.24.261E55E Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by imf24.hostedemail.com (Postfix) with ESMTP id E074218002D for ; Mon, 11 Dec 2023 16:25:55 +0000 (UTC) Authentication-Results: imf24.hostedemail.com; dkim=none; spf=temperror (imf24.hostedemail.com: error in processing during lookup of ryan.roberts@arm.com: DNS error) smtp.mailfrom=ryan.roberts@arm.com; dmarc=temperror reason="SPF/DKIM temp error" header.from=arm.com (policy=temperror) ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1702311956; 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:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=HGCnpfg2UeFcF3FilGfk1/aPIoyj+aCtjzcVX453pZU=; b=Q0AiauhsSNljBsOci1R6EgZA1TLxNEUFQTkBibr1059cFPVR8Jun9ZXTiMg2swe2VWaM0/ Ezm8z1AhjHM/XD54UQATVw+MNR4bBxr/IzTXeV4xkVrwNQ8GIidIPf28vuT/0DC/7CHqOa 9+nrgp3ScM4CDw0BByVAXkDFuoWGh2U= ARC-Authentication-Results: i=1; imf24.hostedemail.com; dkim=none; spf=temperror (imf24.hostedemail.com: error in processing during lookup of ryan.roberts@arm.com: DNS error) smtp.mailfrom=ryan.roberts@arm.com; dmarc=temperror reason="SPF/DKIM temp error" header.from=arm.com (policy=temperror) ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1702311956; a=rsa-sha256; cv=none; b=hd503Ef0a954NRsqXHs1qouTAeNOTEk5GWMYFPJZ4urh91azJH1CNFfpMXE/RCH6Z1mLIz OqzhXCrMyZX9NOj02rvp5hlReZAQdhB0Rp2DuA9H4iCgrf8lMojru1mVigbNIki7F1EvfP Tq0ikgDCmiuhuztZpbyQH8wXx1OyM4c= 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 6E2991007; Mon, 11 Dec 2023 08:26:41 -0800 (PST) Received: from [10.57.73.30] (unknown [10.57.73.30]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 1E1F63F738; Mon, 11 Dec 2023 08:25:53 -0800 (PST) Message-ID: <77c44f46-565e-4317-9caa-2ad887eae31f@arm.com> Date: Mon, 11 Dec 2023 16:25:51 +0000 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH v1 04/39] mm/rmap: introduce and use hugetlb_try_dup_anon_rmap() 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: <20231211155652.131054-1-david@redhat.com> <20231211155652.131054-5-david@redhat.com> From: Ryan Roberts In-Reply-To: <20231211155652.131054-5-david@redhat.com> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Rspamd-Queue-Id: E074218002D X-Rspam-User: X-Stat-Signature: uk97wn7wpquho11fn8rff7rftdgyc4a6 X-Rspamd-Server: rspam01 X-HE-Tag: 1702311955-844031 X-HE-Meta: U2FsdGVkX18ev1/oagcS85CxgqBKaukAbRDXo/kNEMEOOeVaNvKqas5pSadaRZ7TGLBujXA2oRjaL9kYA8RN8yF24hR0WEtYG3BPOEnCTKAn6uz3LS60Ou3wp+O9hajHVG/5hxHBRAvnXt6ChHU7NOzdxQk4Ja7D0O24+64zNs9kaZpek8/pxtmDOm2y2v0zuL3i7oYY9ZyluKN1jCUII7IlzW8/Yg+lGYnCmgCpkB0xwYFAfEUXHIGP+dfsMY/nrvQqdHIP0Q+yNWVfJoXq5zvZ6Ldq0G9yvX4Ok8klF5sulrxdq7956pbkvaCCbG+qYttDj44uJDktPYT6097EeQIL1nSYJyn/ApQinobu1qZ30yzT7MN9QKrUWv3KNBiO/+HL7UcVJNWlpn69+L1Zn2cjIJGjGrP1P4DwBKYCjr4N3397ckZaEPo70UM+F2tf5Ixa384OG50CMM5KzYv7jhpa9STsr6f8uHBz48J8R2SME2s1VyQR3Rk/lctpU11hKT2BZDMEiJfGJsdZC/n3/4pFcSkPVZrjqr4qy8AHckMa658fQGBbLHC5fS4rEk9rfz4u6HmYL3DoKONQbt/sbNQR3Mupzvgw62miMI6Vd7Op20EQ9wYCNWWrmCmGEm7xZ+B6z+Fz4yYW33DBiS/jx7q5Dax7OYQZopV9sOTaqNWXBL1RjBseJ6fKMA9rDFR6W7dR2wEKqBD1y7AQeWdZfdUV8zzK98O15TrMTryOgKC/Is/iBdS0mjHC2VrF13zjPoDa9QAIqk0hQcSw5K/9vMNGL13HmSQ0r7IXdSX+toGGqPn/vdIS/nHg9feM0KI3QDvtqc1AU2jRuA28yAWObgQeA6JF0xZdIphLqFkMhtVApo8cOybRxAESz8BFhOpPX6wbq71JC50Qu9fumQ/9cky5JQG9EcMnphMnA+Nw5/ZHo6UJsrVAGKnEIX+R08Ra9xJantqxbipu5zlkQJ/ 3dQS8y/R rcT48+xzIA1ATg5hftV4tTo8Yq8ho9IIpkl8xu7QPmC3kmA7gzybz3zT3O0RZHR+L604DovVXqMMPj3aOKdK2jBFTtQsmLOvOMiQgcGxDwc3cuuVA+iLJsp4nVFRsZpscLNBcW5r+NDHF4+09A/J47VHw3061HTykE+nX+OlvdIkRFzAvfeN8oyPzmTNcWrRFC1i5NlFuNdrH5qETN9M18SsxO/+H22OJ4rdxr/WzoC4suQuiK4lYZ12i8949uXEYJPFHLfYUNeLOItzGveo9o03YmMhwKWmJjKywkgr0ntAY7ACrYNcy6y/4ChkeQtkpSPDk 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: List-Subscribe: List-Unsubscribe: On 11/12/2023 15:56, David Hildenbrand wrote: > hugetlb rmap handling differs quite a lot from "ordinary" rmap code. > For example, hugetlb currently only supports entire mappings, and treats > any mapping as mapped using a single "logical PTE". Let's move it out > of the way so we can overhaul our "ordinary" rmap. > implementation/interface. > > So let's introduce and use hugetlb_try_dup_anon_rmap() to make all > hugetlb handling use dedicated hugetlb_* rmap functions. > > Note that is_device_private_page() does not apply to hugetlb. > > Reviewed-by: Yin Fengwei > Signed-off-by: David Hildenbrand Reviewed-by: Ryan Roberts > --- > include/linux/mm.h | 12 +++++++++--- > include/linux/rmap.h | 15 +++++++++++++++ > mm/hugetlb.c | 3 +-- > 3 files changed, 25 insertions(+), 5 deletions(-) > > diff --git a/include/linux/mm.h b/include/linux/mm.h > index b72bf25a45cf..ae547b62f325 100644 > --- a/include/linux/mm.h > +++ b/include/linux/mm.h > @@ -1964,15 +1964,21 @@ static inline bool page_maybe_dma_pinned(struct page *page) > * > * The caller has to hold the PT lock and the vma->vm_mm->->write_protect_seq. > */ > -static inline bool page_needs_cow_for_dma(struct vm_area_struct *vma, > - struct page *page) > +static inline bool folio_needs_cow_for_dma(struct vm_area_struct *vma, > + struct folio *folio) > { > VM_BUG_ON(!(raw_read_seqcount(&vma->vm_mm->write_protect_seq) & 1)); > > if (!test_bit(MMF_HAS_PINNED, &vma->vm_mm->flags)) > return false; > > - return page_maybe_dma_pinned(page); > + return folio_maybe_dma_pinned(folio); > +} > + > +static inline bool page_needs_cow_for_dma(struct vm_area_struct *vma, > + struct page *page) > +{ > + return folio_needs_cow_for_dma(vma, page_folio(page)); > } > > /** > diff --git a/include/linux/rmap.h b/include/linux/rmap.h > index 91178d1aa028..ca42b3db5688 100644 > --- a/include/linux/rmap.h > +++ b/include/linux/rmap.h > @@ -213,6 +213,21 @@ void hugetlb_add_anon_rmap(struct folio *, struct vm_area_struct *, > void hugetlb_add_new_anon_rmap(struct folio *, struct vm_area_struct *, > unsigned long address); > > +/* See page_try_dup_anon_rmap() */ > +static inline int hugetlb_try_dup_anon_rmap(struct folio *folio, > + struct vm_area_struct *vma) > +{ > + VM_WARN_ON_FOLIO(!folio_test_anon(folio), folio); > + > + if (PageAnonExclusive(&folio->page)) { > + if (unlikely(folio_needs_cow_for_dma(vma, folio))) > + return -EBUSY; > + ClearPageAnonExclusive(&folio->page); > + } > + atomic_inc(&folio->_entire_mapcount); > + return 0; > +} > + > static inline void hugetlb_add_file_rmap(struct folio *folio) > { > VM_WARN_ON_FOLIO(folio_test_anon(folio), folio); > diff --git a/mm/hugetlb.c b/mm/hugetlb.c > index 57e898187931..378e460a6ab4 100644 > --- a/mm/hugetlb.c > +++ b/mm/hugetlb.c > @@ -5409,8 +5409,7 @@ int copy_hugetlb_page_range(struct mm_struct *dst, struct mm_struct *src, > */ > if (!folio_test_anon(pte_folio)) { > hugetlb_add_file_rmap(pte_folio); > - } else if (page_try_dup_anon_rmap(&pte_folio->page, > - true, src_vma)) { > + } else if (hugetlb_try_dup_anon_rmap(pte_folio, src_vma)) { > pte_t src_pte_old = entry; > struct folio *new_folio; >