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 AAF8FE77188 for ; Tue, 14 Jan 2025 06:01:13 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 3AFBD6B0088; Tue, 14 Jan 2025 01:01:13 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 35F76280001; Tue, 14 Jan 2025 01:01:13 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 1FFE46B008A; Tue, 14 Jan 2025 01:01:13 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0011.hostedemail.com [216.40.44.11]) by kanga.kvack.org (Postfix) with ESMTP id 00BA16B0088 for ; Tue, 14 Jan 2025 01:01:12 -0500 (EST) Received: from smtpin17.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay09.hostedemail.com (Postfix) with ESMTP id A3B71806EF for ; Tue, 14 Jan 2025 06:01:12 +0000 (UTC) X-FDA: 83005009584.17.705B80E Received: from mail-pl1-f173.google.com (mail-pl1-f173.google.com [209.85.214.173]) by imf13.hostedemail.com (Postfix) with ESMTP id A34572000A for ; Tue, 14 Jan 2025 06:01:10 +0000 (UTC) Authentication-Results: imf13.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=HfeYaK1e; spf=pass (imf13.hostedemail.com: domain of 21cnbao@gmail.com designates 209.85.214.173 as permitted sender) smtp.mailfrom=21cnbao@gmail.com; dmarc=pass (policy=none) header.from=gmail.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1736834470; 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:dkim-signature; bh=P1D6gYEoM2XnA7p/mZdXiYm6Q1A06yMI0y9WsArZB/I=; b=zd9eI97WKYXdnR3X+bLfOYd4Q3TD19zfnUsgyiAqJsdjZJQznpcIjOcXS2nKRhAezgeMay fswEkBVlFrW6ebwb0UHwsdFWrYLdmgbPItiCifw8jNmpVAA4FWWU0H+AXCQhG06LdCgImI mA1t2/sVw3O/kau0rVQYBH+DALnd5SA= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1736834470; a=rsa-sha256; cv=none; b=E5fILxTXSdtta4z9pLQO7dhCSqIx4O7edafM5EjNA49QVWuRA3CC98XooKadyxRg6pThV7 gOcSU8PQiMjfMP2cs6PM+loFHE8jezszstBumVChUPuRit9ty1rR9iEJziRWdQ58VBHqv5 qNRyfhxsZS+EhqQh8xG8feticC9TV1I= ARC-Authentication-Results: i=1; imf13.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=HfeYaK1e; spf=pass (imf13.hostedemail.com: domain of 21cnbao@gmail.com designates 209.85.214.173 as permitted sender) smtp.mailfrom=21cnbao@gmail.com; dmarc=pass (policy=none) header.from=gmail.com Received: by mail-pl1-f173.google.com with SMTP id d9443c01a7336-2165cb60719so90865525ad.0 for ; Mon, 13 Jan 2025 22:01:10 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1736834469; x=1737439269; darn=kvack.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=P1D6gYEoM2XnA7p/mZdXiYm6Q1A06yMI0y9WsArZB/I=; b=HfeYaK1exGp1NWw0eCr1MPV9yKg09EzYEJ6Remijl11hQmCU9zLs1jvglbY+wPvVQo dMwd2N1QzKcEKuqotvlc4zVzkq6vXYpkd4ZP7alz8BE+jglsku2of77HRsvLZjtkNiy+ 1WGv9IHmw51emeXSX8Z+014Ak6zH4SiG38ivMjMBeuWpVBtQyFUR+BYI61nrkjxBW0y+ 2L2AVxjDt2KrPbA2ZNkSFMTX+bg/rWkNux7UhjFkmGAUciOZs1gHASNnrYcW48S87AVA EGgPmkPUYUzre2LkZKuwyLqYbgakmFv9k6UdxBPOPUowsnalV3NQLGxKAlQi2WTfon0H CLUQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1736834469; x=1737439269; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=P1D6gYEoM2XnA7p/mZdXiYm6Q1A06yMI0y9WsArZB/I=; b=MiRObX8TQfnnnpC/7LENHJRLN8G88UmdQX1rcLA3odkUcKHm0sZfGgShvJEtKiBhYV ozRetzmhlPkqEL//Snbh5DZiyOMO6TYO3nLS2xpghDW6eZyZNA1KCg3nxNS++JSkKhL+ mC40Ebk4rTM+p+6rp/DbM01AK01Q5S+zyWd45F52w33Gvki0hOCarpzwOz6EC3sIeLKE XGYrrSnAbqDGEF0LhlQlDh/qTX6waWigJQ+rKpU/Hs4uRrcBcuad8AEcd6LDgNkbSRFm garSs0y3/pqMhoVMrmMZi+J5d8WtfpRtnrLsAEC4wE3ttCmf9Gs39WVjIJsqzTOdQ7AZ jx4Q== X-Forwarded-Encrypted: i=1; AJvYcCXTxZxnXfoaBMq4t55xKo/eC6qAn9dg7yy0Q9+brdF85erw7S6FLbwyN2gN+b35QwQWzGSXMhHKMQ==@kvack.org X-Gm-Message-State: AOJu0YzesfCn0ginx/jCNFIgIcfHIRL0JsDI+9DFmRkj3iBwyLX5/uZJ r2yWgToqGarInnUx28BQ+hzE0DGAE0SZbpIThKM0TUYOxMOAqU/f X-Gm-Gg: ASbGncsTS2ArOlRLcz53x7qKjY8Blc0yXrCdn60mbc/1jxpMnymtsHS6uGvp2qUMXAN TFgulRs2DNqvDgoKGA5H5ULl01T/Eda5vl3STn8d2o4J6uPH04q6aJc2cekjr40+VrABZ4vDpe4 3d/noKGwCJyGLQnP1CVubtBl2yVNPixlo9G1o0ePHA1FsTFCGr6VOQ0YHJG5Y3ZFjvzvkBbZ4D7 VEWnTREupKDI16Yb2vM4SJ7dvEsq3bq4FLchhtm0/Vj9tvz8uiEfrXEwAPeDPqgCGIrnjUL+LYi 5PP5rolI X-Google-Smtp-Source: AGHT+IEDHRmGK1uA7EjxC0SWT2vjWc7ySfaqXzxlqfNbOvSfJNPnY2oCVxBO6d5hzH1KmB/6COb9uA== X-Received: by 2002:a17:903:41c5:b0:215:19ae:77bf with SMTP id d9443c01a7336-21a83f4ea67mr365135525ad.19.1736834469125; Mon, 13 Jan 2025 22:01:09 -0800 (PST) Received: from Barrys-MBP.hub ([2407:7000:af65:8200:39b5:3f0b:acf3:9158]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-2f54a26acadsm11013436a91.3.2025.01.13.22.01.03 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Mon, 13 Jan 2025 22:01:08 -0800 (PST) From: Barry Song <21cnbao@gmail.com> To: baolin.wang@linux.alibaba.com Cc: 21cnbao@gmail.com, 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 Subject: Re: [PATCH v2 4/4] mm: Avoid splitting pmd for lazyfree pmd-mapped THP in try_to_unmap Date: Tue, 14 Jan 2025 19:00:59 +1300 Message-Id: <20250114060059.14058-1-21cnbao@gmail.com> X-Mailer: git-send-email 2.39.3 (Apple Git-146) In-Reply-To: <20250114040914.9986-1-21cnbao@gmail.com> References: <20250114040914.9986-1-21cnbao@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Rspamd-Queue-Id: A34572000A X-Rspam-User: X-Rspamd-Server: rspam07 X-Stat-Signature: ub363bys18hidx1w6qkb99e8kxi51a7t X-HE-Tag: 1736834470-242966 X-HE-Meta: U2FsdGVkX19rA0fpg4N16cRdurGydV9cssTISCp6mogIx/g+6fkXoiYNY8neCJEioRclRi2dlrrXAuV3eBh7MRn0uMpf64/+T/CYhbiCr4K20slbkx507GJygsliwufoVG7tVblZpqfO45Ba3jSspVEF+brZhicZKoeUmbQOTcGf7PA6QXvV2whJsv1xyBCs0rQOS/BrHmhi5lOaC1sONyutTswI9a/k1B9cXDnGBsuKn41p5lbJYFvaGpnw20SiG6rGnRl/u3acQtZc8aC0CW6rcb/RZZqxfLw7GiTbzqvXrrisWgLcpd16v2vlutysbgSHYxKKolC4qZV+t3oE7I4Wm6Cs0C7XwywNzKnGFeFCAbhJEfveVAAhGAruZiO7KFrKBwy6uft6J5bIznCEHGmztvUPuDDevPwRax+vz3QLPIVhImSVvX7dPj/wLdJK91naV5PntbwcydIahrVa9Gbw6KR4t2hKPh2++p3YWhY4d/RWKFdlONOYNufFc++/+C3L55E99A/eI2uk8Gpzzr4EA3mbuGKRyy87N7WYEsuMuv2m7cj+Tepj4TZTz0HfQewnRn0aePoAqu9/RDhJlPij0DlAyqcIvTs021nNO3I1iVbOnl9sNQmI5EbzPMjCtPB0TmUQI0pU+RZPK24GkXSEzu6ns7iAlEH8D/dMN0TmVUPYsmytQ6ReDm/gupumGeXdaa5X64a4yIapQIZIFJKiXV5arhNLmzxgRLQeRDsSgmsnmbvdhe1WsArfaBfbe7JXJd2TLOA0p8Y6uk7omLL15x3u+ian53AtRPZhPYGn9ehYr1ADVGL9ReyIpAPAOMWSgKP1DfdgdnYDLKdbfV5PLLH1FDaie1fOiI1f+xj7BXTuzAO6akhPaW1EEspNn/ECxNW+CelR9Q8j7/oHMeqi+iMRqxR9E6+PVz/6wBpuSfMCjBd90WcYlX9WwE4ECZFuyc4FP/D6QQOkmRn FCXNmVs3 SEsG9lPtEaT9OCEdNRC3xWnrPTgKArCdnAtkIuGXY9jNtiGatYK3K+K46e2/iZrZV7dOrNx3VRENzPcEboz/pQ5DHlFbC/kXvzAGmGg/Wj8A7ZZH8qNEJ3zdhgWp7lVG4TUDj+ypzKIAgyhkQCpJKZqVo/nk9x1cyCMK320PCNwKEX9Mw7zy/CQie6JwdaKHiIgR09NB6RZ3CoHihyQ+ILFwXLX6p1UEEsO+H8U6LQBopw8IbGdMwIwZ4in1apDkbjdRrpEiAeECMMHIlaSXl0ISscxDnUVHNze84+Ww9SHXl2TLnnu+zNJIoHMPVtAvUtb/dUBJDfOKgRunLfytOfJCFB2HLs0l23SZ4AmFs8FgrQnHgnaWVlcbdxqgxQd2KmcttnNYjVEb7VlMedpcmeBQxlOjWHue7VbBbbVy+RYIdVsQkpbTCiQ5BCULa5+9sJslKENzJ12JzWX+VOIFCN/bE3N5YIkHm9xa5 X-Bogosity: Ham, tests=bogofilter, spamicity=0.000059, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: > > >               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? diff --git a/mm/huge_memory.c b/mm/huge_memory.c index 3d3ebdc002d5..47cc8c3f8f80 100644 --- a/mm/huge_memory.c +++ b/mm/huge_memory.c @@ -3070,8 +3070,12 @@ static bool __discard_anon_folio_pmd_locked(struct vm_area_struct *vma, int ref_count, map_count; pmd_t orig_pmd = *pmdp; - if (folio_test_dirty(folio) || pmd_dirty(orig_pmd)) + if (pmd_dirty(orig_pmd)) + folio_set_dirty(folio); + if (folio_test_dirty(folio) && !(vma->vm_flags & VM_DROPPABLE)) { + folio_set_swapbacked(folio); return false; + } orig_pmd = pmdp_huge_clear_flush(vma, addr, pmdp); @@ -3098,8 +3102,15 @@ static bool __discard_anon_folio_pmd_locked(struct vm_area_struct *vma, * * The only folio refs must be one from isolation plus the rmap(s). */ - if (folio_test_dirty(folio) || pmd_dirty(orig_pmd) || - ref_count != map_count + 1) { + if (pmd_dirty(orig_pmd)) + folio_set_dirty(folio); + if (folio_test_dirty(folio) && !(vma->vm_flags & VM_DROPPABLE)) { + folio_set_swapbacked(folio); + set_pmd_at(mm, addr, pmdp, orig_pmd); + return false; + } + + if (ref_count != map_count + 1) { set_pmd_at(mm, addr, pmdp, orig_pmd); return false; } @@ -3119,12 +3130,11 @@ 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_FOLIO(!folio_test_anon(folio), folio); + VM_WARN_ON_FOLIO(folio_test_swapbacked(folio), folio); VM_WARN_ON_ONCE(!IS_ALIGNED(addr, HPAGE_PMD_SIZE)); - 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 3ef659310797..72907eb1b8fe 100644 --- a/mm/rmap.c +++ b/mm/rmap.c @@ -1724,9 +1724,16 @@ static bool try_to_unmap_one(struct folio *folio, struct vm_area_struct *vma, } if (!pvmw.pte) { - if (unmap_huge_pmd_locked(vma, pvmw.address, pvmw.pmd, - folio)) - goto walk_done; + 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) { /* -- 2.39.3 (Apple Git-146)