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 9FB39C7EE31 for ; Fri, 27 Jun 2025 13:58:18 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 200646B00A7; Fri, 27 Jun 2025 09:58:18 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 1B1026B00A8; Fri, 27 Jun 2025 09:58:18 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 0EE1E6B00A9; Fri, 27 Jun 2025 09:58:18 -0400 (EDT) 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 F12756B00A7 for ; Fri, 27 Jun 2025 09:58:17 -0400 (EDT) Received: from smtpin08.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay05.hostedemail.com (Postfix) with ESMTP id A35055603E for ; Fri, 27 Jun 2025 13:58:17 +0000 (UTC) X-FDA: 83601335034.08.7AF2A9A Received: from mail-qv1-f42.google.com (mail-qv1-f42.google.com [209.85.219.42]) by imf26.hostedemail.com (Postfix) with ESMTP id BF25C14000A for ; Fri, 27 Jun 2025 13:58:15 +0000 (UTC) Authentication-Results: imf26.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=dlkUGyeg; spf=pass (imf26.hostedemail.com: domain of refault0@gmail.com designates 209.85.219.42 as permitted sender) smtp.mailfrom=refault0@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=1751032695; 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=xPp/ClYZgzM+1U+QFbDcHJs/6imwSQiPcKsdqOO410E=; b=WECtS4E7uL84lsvMmWTK/lQv5BVtYmVEo6YPDEh2EmqIEILNqME4jdEQFML9VHJ1P7hBp5 Ov1BfyuDzjy3Q0YIdocLI+O7jT58VoEnr3C5/JKeei4RCe3fnvwhQe90THcyGUU+QU94uM ZHIbQ+U6K1vC4CZ/z6/qvXA6KdndzzU= ARC-Authentication-Results: i=1; imf26.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=dlkUGyeg; spf=pass (imf26.hostedemail.com: domain of refault0@gmail.com designates 209.85.219.42 as permitted sender) smtp.mailfrom=refault0@gmail.com; dmarc=pass (policy=none) header.from=gmail.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1751032695; a=rsa-sha256; cv=none; b=QVSx1RExuGcZzEqsptpeCRY5ArL6s/ApgQgmTmuvwWDO6jhaxn2t7kbxHTNavmHW6rJKtN iaCvUwH63YoPiSNwcUOnQDGGYJbwu2Nwcs42JQHRdNrJ/gUe6um23u7c7kmu+lbOf8w6J/ MRshLarzfAsRNYIwoVT4VLknbfRUUek= Received: by mail-qv1-f42.google.com with SMTP id 6a1803df08f44-6facf4d8e9eso23489576d6.1 for ; Fri, 27 Jun 2025 06:58:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1751032695; x=1751637495; darn=kvack.org; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:from:to:cc:subject:date :message-id:reply-to; bh=xPp/ClYZgzM+1U+QFbDcHJs/6imwSQiPcKsdqOO410E=; b=dlkUGyegfIv9Kgrk90z+Cy59KwVxdLzTCHueJPD6dzkC2tTurg0oumOg0mTauMZQq8 GyLqmGo99xmCaChAOadaCZeexnV9t10mFdD3XKu2jd6FwVwGWmaLfFGTsoUhR9juscSL Y/Q+hkW40er2121j+MQNBEQejBE6db7dATtzlC/wnvgVjw3iMiSj8sKCz5uAAHka/QrF 1PwZQAdyixEwAwhyWAtXV/T0WvK+hvu35fNYRV1kyLJ8nH5sXZUPjIznqGVQrF123pAG WK7ac2rR/cjx8sDvKo5rBymF9IZCgyvBZUGEIGmbDkmKNTr+7TbvfcbUIbLZsS2G1xer tu2A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1751032695; x=1751637495; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=xPp/ClYZgzM+1U+QFbDcHJs/6imwSQiPcKsdqOO410E=; b=Fsj2bzNL8BZnAsn3+0Bv8rU+dBe1l93bJo33g4Bx697duYToK9ifD7N2mO4zfO/d30 etWJLH3dlyEzOGVN4VleXcWXwk5nETgNy1rKVWy/+DLJl+dq6L1m6Zc9KHq7NGSL1l+B bjsYrpzQtVmrpFCzRY0LVwzWYUOGZZ9rBoBg2rpTgxSbMXsXN0xRHazdxx11GkrpzoXh BO7IWXdytfcLJsBQ77o6/VvQbXEN0ZnSQ2nEVi2gMHoDjqj+aQebUpOl0gtlYHCY73b/ OVHCpaZdMYvV2GQqx5r6kkoUH0YNn46Ol0QPDj3eFXN0m+wCWtETLd0LtPy9aW0LR4cP O6Jg== X-Forwarded-Encrypted: i=1; AJvYcCVmVIrjweE1CZ73nQxEjRryewU1QiZDpAZjuQwZoBr8sItUfPhk/6BdtkxeeFbOhXonQtDAVsKiiQ==@kvack.org X-Gm-Message-State: AOJu0YzooCNRLFP1quoaUgKLEFswB+7Tr+Q45hZDL2vpvw85SVHZZsM+ Oy2/lKYL+y8qs3cGQtdFw5kNSvPaHJ2Tx1SnRTDB8smPLwI0j++0OUquQ9uqsBYIhuMoS6dR9Qq JuOgU5S7BRsqm0kc2uumuSGg9oFYKT74jZBR3oYA= X-Gm-Gg: ASbGncvZHqftMgvMT/MrrWu8SNI0JIkH6C1w1SfxHfPVMoOJA40/FW6tZHKQZ/nWMjT JaB8o91yfXndki/UMmq14I2oABOVjSWH7wZiKvHzka4N1HwttA15FnkRVwciurm7873wDosolzZ LkbhcG0KF1VYMP9m/2HZCAhCF1IcLzfsm2wJV5Lfjd5yQDLAY= X-Google-Smtp-Source: AGHT+IFpz83flyurGfNPQ8AbMQA21CHaV6uWbep69Uq7TnkmpyxVeWsBqTGWH7RYjX9d4WBpwpvNCs9ZJfQpXumdBHY= X-Received: by 2002:ad4:5bcf:0:b0:6fb:4caf:5d04 with SMTP id 6a1803df08f44-700031c6a5bmr53652566d6.45.1751032694524; Fri, 27 Jun 2025 06:58:14 -0700 (PDT) MIME-Version: 1.0 References: <20250627115510.3273675-1-david@redhat.com> <20250627115510.3273675-3-david@redhat.com> In-Reply-To: <20250627115510.3273675-3-david@redhat.com> From: Lance Yang Date: Fri, 27 Jun 2025 21:58:00 +0800 X-Gm-Features: Ac12FXzXEXO95rUOIhdNLv7ixexjXu4CIZwfTgmr5h-Nl8qkP697ay-q0c7YJ5k Message-ID: Subject: Re: [PATCH v1 2/4] mm: smaller folio_pte_batch() improvements To: David Hildenbrand Cc: linux-kernel@vger.kernel.org, linux-mm@kvack.org, Andrew Morton , "Liam R. Howlett" , Lorenzo Stoakes , Vlastimil Babka , Jann Horn , Mike Rapoport , Suren Baghdasaryan , Michal Hocko , Zi Yan , Matthew Brost , Joshua Hahn , Rakie Kim , Byungchul Park , Gregory Price , Ying Huang , Alistair Popple , Pedro Falcato , Rik van Riel , Harry Yoo Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Rspamd-Server: rspam11 X-Rspam-User: X-Rspamd-Queue-Id: BF25C14000A X-Stat-Signature: uttsrjn5bdpmq9awnkb9cpdz79bjfmrg X-HE-Tag: 1751032695-519170 X-HE-Meta: U2FsdGVkX1+WgDKqZjX6KqJoUN5Iyk/7+310avdFV3J9HAvcoL8ch+wusU/96B9OjtNzIvpsfjwfu2MxqVux2cEWJhaqwmQTVbSwoM/fn5i5J2ZtE7yiQJfsddGGO/ldzQxcLUTmEnIeEbDHTv8KpY2zAmOAwdUkCbAS5K0LpapJNPh0J2B5jsNzrVPpqKsKUJF80nTZKvRnvsM6E9hOCPJ34C9kj6DI/GlV+ZMP/yR/KwUzrNjizPo66UwIIkjNnEwd4aeogHvz/HzqtJt+XTMv/enTTYLgIJO+6wWCNVywGSA7Bh7jKCTuEsOW8nNQjvdPRkTtpBl7F3EmFB6mdfMcIxjiM67Gxma/NFonHWsy/PmMTsu6NVmfHZrb5Q414q8trxbofdssLiFcx280AwTM0B7PzfDml9G23H2xm2Vknp4oG5oeL3FzlMSoWUjK4bsULEH4tE06opc7ocy8JUwdSOeg1tZWLq0yubcvk2Ccbq8rp3GywOMoWFfx2P5lMFVlMccbTCl9GRRbLOnvpVXen8m9X2x9K9fezanVQ+SaiKzsjPrHJmf1lNPs0nybUbrRdkv2Dp6SO3zJrhyj/qv3XPr2h3PiKyouqdF9NpHA2NlzHwsXxaF4b/i5WtDwg0d1mMo6PXvCm+0MfA1BFqgH2YjNjyIdDguc0W7p1rGMoV/HRpYmbek32QZuqhqaFxEQ03uD6wnPqOEYynf2jUm+Q+cvCZDQ8u1ucj0SQGrqOwb325Xd0jehrwPXSJSxHccUO/KiL17KG34ACwXLG+3oxkcNKT9iYvtntUc0HIX7seK6Yzc05Nt7aZSo7sm7Nf2fFVenQbUzrBwd2qQ2FzSXRfebCv4q6Q93iNjWtpb2bXtj/UPxwCOfbigj0UMoHt4vTVptffwezKemUqzvCvEzAoJZ1pVsjHO+B2UeHZnERFVtZ1WNvh8GBntIVe1rerd8YhbtBpeIIvKB5Pm +ScGRF9g s4dnhbf3XN2cNXvlfT2lM0X49nnTFJESVL9T7h3pCf9S+K/hv7z79tjx0ym0O9SELm/0fftOnCiqkyy2eXPp/ZRq/1xnB72bOyajYS48sDqz/36wdMrdKYoC9Qp1SsZ1HHTxh5ABEg/UVkBg4Jxw0N03567IQjR1TF9LJ4RXgRhrQxqH7GJ0Bpc2JoFUX7btfbc2691g8vexApjtNnHmEyaWOZiTsOpSiqO0whDDJSkF0q2b+TBRA6bwgYlnGBzy1vNeXEHLnBDCnZzzS1Ev3Go0HDk3iEdw2kiEjCPVr/wqRCXPViY0UOAqMNrZBmZVl2paZS4yTw2c1DX3thCMKUDzZL5Y1URSXV1xzO7Wmgzb2VXZvh/I0tMVuYcSmysDu/GjF2lrtLOmum9dqhDd8tbfiVsZGP/2hPwF2bTR7BFpS4cxqoIyHKpCiJwxLNGr+XZAkCany8/I17Lg+j4XQkAJUj3pvS67KQxDi7niFpVnD+PzwAtV9z0e0xc4GKcu0dlLMusZpyG/A7baX2TybtJ93Ni2/9FiB50HviVrGh8jP5h3jRizm/2tc4qwDyDT9H2Io3pwk/Pc3nQEuuu48GF9lfxB83PUl6Xm5eyKExK4jpkRITv2mmSPrBw== 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 Fri, Jun 27, 2025 at 7:55=E2=80=AFPM David Hildenbrand wrote: > > Let's clean up a bit: > > (1) No need for start_ptep vs. ptep anymore, we can simply use ptep > > (2) Let's switch to "unsigned int" for everything > > (3) We can simplify the code by leaving the pte unchanged after the > pte_same() check. > > (4) Clarify that we should never exceed a single VMA; it indicates a > problem in the caller. > > No functional change intended. Nice cleanup! Simplifying the loop and removing the temporary variables makes the code much easier to follow. Also, clarifying the caller's responsibility to stay within a single VMA and page table is a nice change ;) Feel free to add: Reviewed-by: Lance Yang Thanks, Lance > > Signed-off-by: David Hildenbrand > --- > mm/internal.h | 37 +++++++++++++++---------------------- > 1 file changed, 15 insertions(+), 22 deletions(-) > > diff --git a/mm/internal.h b/mm/internal.h > index 9690c75063881..ca6590c6d9eab 100644 > --- a/mm/internal.h > +++ b/mm/internal.h > @@ -221,7 +221,7 @@ static inline pte_t __pte_batch_clear_ignored(pte_t p= te, fpb_t flags) > * folio_pte_batch - detect a PTE batch for a large folio > * @folio: The large folio to detect a PTE batch for. > * @addr: The user virtual address the first page is mapped at. > - * @start_ptep: Page table pointer for the first entry. > + * @ptep: Page table pointer for the first entry. > * @pte: Page table entry for the first page. > * @max_nr: The maximum number of table entries to consider. > * @flags: Flags to modify the PTE batch semantics. > @@ -233,24 +233,24 @@ static inline pte_t __pte_batch_clear_ignored(pte_t= pte, fpb_t flags) > * first one is dirty. > * > * Detect a PTE batch: consecutive (present) PTEs that map consecutive > - * pages of the same large folio. > + * pages of the same large folio in a single VMA and a single page table= . > * > * All PTEs inside a PTE batch have the same PTE bits set, excluding the= PFN, > * the accessed bit, writable bit, dirty bit (unless FPB_HONOR_DIRTY is = set) and > * soft-dirty bit (unless FPB_HONOR_SOFT_DIRTY is set). > * > - * start_ptep must map any page of the folio. max_nr must be at least on= e and > - * must be limited by the caller so scanning cannot exceed a single page= table. > + * @ptep must map any page of the folio. max_nr must be at least one and > + * must be limited by the caller so scanning cannot exceed a single VMA = and > + * a single page table. > * > * Return: the number of table entries in the batch. > */ > -static inline int folio_pte_batch(struct folio *folio, unsigned long add= r, > - pte_t *start_ptep, pte_t pte, int max_nr, fpb_t flags, > +static inline unsigned int folio_pte_batch(struct folio *folio, unsigned= long addr, > + pte_t *ptep, pte_t pte, unsigned int max_nr, fpb_t flags, > bool *any_writable, bool *any_young, bool *any_dirty) > { > - pte_t expected_pte, *ptep; > - bool writable, young, dirty; > - int nr, cur_nr; > + unsigned int nr, cur_nr; > + pte_t expected_pte; > > if (any_writable) > *any_writable =3D false; > @@ -267,29 +267,22 @@ static inline int folio_pte_batch(struct folio *fol= io, unsigned long addr, > max_nr =3D min_t(unsigned long, max_nr, > folio_pfn(folio) + folio_nr_pages(folio) - pte_pfn= (pte)); > > - nr =3D pte_batch_hint(start_ptep, pte); > + nr =3D pte_batch_hint(ptep, pte); > expected_pte =3D __pte_batch_clear_ignored(pte_advance_pfn(pte, n= r), flags); > - ptep =3D start_ptep + nr; > + ptep =3D ptep + nr; > > while (nr < max_nr) { > pte =3D ptep_get(ptep); > - if (any_writable) > - writable =3D !!pte_write(pte); > - if (any_young) > - young =3D !!pte_young(pte); > - if (any_dirty) > - dirty =3D !!pte_dirty(pte); > - pte =3D __pte_batch_clear_ignored(pte, flags); > > - if (!pte_same(pte, expected_pte)) > + if (!pte_same(__pte_batch_clear_ignored(pte, flags), expe= cted_pte)) > break; > > if (any_writable) > - *any_writable |=3D writable; > + *any_writable |=3D pte_write(pte); > if (any_young) > - *any_young |=3D young; > + *any_young |=3D pte_young(pte); > if (any_dirty) > - *any_dirty |=3D dirty; > + *any_dirty |=3D pte_dirty(pte); > > cur_nr =3D pte_batch_hint(ptep, pte); > expected_pte =3D pte_advance_pfn(expected_pte, cur_nr); > -- > 2.49.0 > >