From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from out30-111.freemail.mail.aliyun.com (out30-111.freemail.mail.aliyun.com [115.124.30.111]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 79ECE1C3C1D for ; Tue, 14 Jan 2025 07:51:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=115.124.30.111 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1736841094; cv=none; b=EDNIAUxknOkZ41DE2sCQnMr2Yp4et8yGslKJFFoiAJqGZxgWEbYPlAZgCnKoSSkaJkyfKQlTPXDjonAvehWpDRSNe3aulKKwdI+o4YcFU8dph9SWMuUL0zsHdDGzQc8h1YocbWYNiQP9etjVN8xFNXh2opdHZPldTUbKW/snBYg= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1736841094; c=relaxed/simple; bh=fwNhRIFyCJ2P2DLMqgUNaLWuRxHGTcECet+2y28EgEc=; h=Message-ID:Date:MIME-Version:Subject:To:Cc:References:From: In-Reply-To:Content-Type; b=auP/rPjNy5M/QCV1a6ViPGOXmsQlotVw6EqWsGhmAuekUJLJdDjfXHRPix+YCEfhZyN/Efa42y1d2Q+JEZMarxwAumXVkLFYXzxLzVUKVgfvam0biyqgzEJYdmL5nockBIBnOzGoVUj8TSWoKNVPdSUS/MlAV6M2UV5pMqihFNU= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.alibaba.com; spf=pass smtp.mailfrom=linux.alibaba.com; dkim=pass (1024-bit key) header.d=linux.alibaba.com header.i=@linux.alibaba.com header.b=Qa3w5aUp; arc=none smtp.client-ip=115.124.30.111 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.alibaba.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.alibaba.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.alibaba.com header.i=@linux.alibaba.com header.b="Qa3w5aUp" DKIM-Signature:v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.alibaba.com; s=default; t=1736841082; h=Message-ID:Date:MIME-Version:Subject:To:From:Content-Type; bh=+6aBypYiXpsnIYYHDG4FFvYm+u76PpmDT44lIRDZKQU=; b=Qa3w5aUpJkypJx1xsS2Bbco+i35ASPgeJ+WqAIrXHxd3tBHShQ80IM8l79X2mpT/+DNXZ+2FQeCcHKWeQkEqNab7k5lsnpywgQgW8cFYmyNzWrN5sGBzVsQTRQMoMvVLgpwY4q9mB9V5aNLvy1QJ+8qw5SAkQMITVEo87YmS1cI= Received: from 30.74.144.113(mailfrom:baolin.wang@linux.alibaba.com fp:SMTPD_---0WNeTLfB_1736841079 cluster:ay36) by smtp.aliyun-inc.com; Tue, 14 Jan 2025 15:51:20 +0800 Message-ID: Date: Tue, 14 Jan 2025 15:51:19 +0800 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH v2 4/4] mm: Avoid splitting pmd for lazyfree pmd-mapped THP in try_to_unmap To: Barry Song <21cnbao@gmail.com> Cc: akpm@linux-foundation.org, chrisl@kernel.org, david@redhat.com, ioworker0@gmail.com, kasong@tencent.com, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-mm@kvack.org, linux-riscv@lists.infradead.org, lorenzo.stoakes@oracle.com, ryan.roberts@arm.com, v-songbaohua@oppo.com, x86@kernel.org, ying.huang@intel.com, zhengtangquan@oppo.com References: <20250114040914.9986-1-21cnbao@gmail.com> <20250114060059.14058-1-21cnbao@gmail.com> From: Baolin Wang In-Reply-To: <20250114060059.14058-1-21cnbao@gmail.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit On 2025/1/14 14:00, Barry Song wrote: >>>>               if (!pvmw.pte) { >>>> +                     lazyfree = folio_test_anon(folio) && !folio_test_swapbacked(folio); >>> >>> You've checked lazyfree here, so can we remove the duplicate check in >>> unmap_huge_pmd_locked()? Then the code should be: >>> >>>                 if (lazyfree && unmap_huge_pmd_locked(...)) >>>                         goto walk_done; >> >> >> right. it seems unmap_huge_pmd_locked() only handles lazyfree pmd-mapped >> thp. so i guess the code could be: >> >> diff --git a/mm/huge_memory.c b/mm/huge_memory.c >> index aea49f7125f1..c4c3a7896de4 100644 >> --- a/mm/huge_memory.c >> +++ b/mm/huge_memory.c >> @@ -3131,11 +3131,10 @@ bool unmap_huge_pmd_locked(struct vm_area_struct *vma, unsigned long addr, >>         VM_WARN_ON_FOLIO(!folio_test_pmd_mappable(folio), folio); >>         VM_WARN_ON_FOLIO(!folio_test_locked(folio), folio); >>         VM_WARN_ON_ONCE(!IS_ALIGNED(addr, HPAGE_PMD_SIZE)); >> +       VM_WARN_ON_FOLIO(!folio_test_anon(folio), folio); >> +       VM_WARN_ON_FOLIO(folio_test_swapbacked(folio), folio); >> >> -       if (folio_test_anon(folio) && !folio_test_swapbacked(folio)) >> -               return __discard_anon_folio_pmd_locked(vma, addr, pmdp, folio); >> - >> -       return false; >> +       return __discard_anon_folio_pmd_locked(vma, addr, pmdp, folio); >>  } >> >>  static void remap_page(struct folio *folio, unsigned long nr, int flags) >> diff --git a/mm/rmap.c b/mm/rmap.c >> index 02c4e4b2cd7b..72907eb1b8fe 100644 >> --- a/mm/rmap.c >> +++ b/mm/rmap.c >> @@ -1671,7 +1671,7 @@ static bool try_to_unmap_one(struct folio *folio, struct vm_area_struct *vma, >>         DEFINE_FOLIO_VMA_WALK(pvmw, folio, vma, address, 0); >>         pte_t pteval; >>         struct page *subpage; >> -       bool anon_exclusive, lazyfree, ret = true; >> +       bool anon_exclusive, ret = true; >>         struct mmu_notifier_range range; >>         enum ttu_flags flags = (enum ttu_flags)(long)arg; >>         int nr_pages = 1; >> @@ -1724,18 +1724,16 @@ static bool try_to_unmap_one(struct folio *folio, struct vm_area_struct *vma, >>                 } >> >>                 if (!pvmw.pte) { >> -                       lazyfree = folio_test_anon(folio) && !folio_test_swapbacked(folio); >> - >> -                       if (unmap_huge_pmd_locked(vma, pvmw.address, pvmw.pmd, >> -                                                 folio)) >> -                               goto walk_done; >> -                       /* >> -                        * unmap_huge_pmd_locked has either already marked >> -                        * the folio as swap-backed or decided to retain it >> -                        * due to GUP or speculative references. >> -                        */ >> -                       if (lazyfree) >> +                       if (folio_test_anon(folio) && !folio_test_swapbacked(folio)) { >> +                               if (unmap_huge_pmd_locked(vma, pvmw.address, pvmw.pmd, folio)) >> +                                       goto walk_done; >> +                               /* >> +                                * unmap_huge_pmd_locked has either already marked >> +                                * the folio as swap-backed or decided to retain it >> +                                * due to GUP or speculative references. >> +                                */ >>                                 goto walk_abort; >> +                       } >> >>                         if (flags & TTU_SPLIT_HUGE_PMD) { >>                                 /* >> >>> >>>>                       if (unmap_huge_pmd_locked(vma, pvmw.address, pvmw.pmd, >>>>                                                 folio)) >>>>                               goto walk_done; >>>> +                     /* >>>> +                      * unmap_huge_pmd_locked has either already marked >>>> +                      * the folio as swap-backed or decided to retain it >>>> +                      * due to GUP or speculative references. >>>> +                      */ >>>> +                     if (lazyfree) >>>> +                             goto walk_abort; >>>> >>>>                       if (flags & TTU_SPLIT_HUGE_PMD) { >>>>                               /* > > > > The final diff is as follows. > Baolin, do you have any additional comments before I send out v3? No other comments. Look good to me.