From patchwork Wed May 8 19:19:27 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alexandre Ghiti X-Patchwork-Id: 13659108 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 611B5C04FFE for ; Wed, 8 May 2024 19:27:49 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id ECD1E6B00A4; Wed, 8 May 2024 15:27:48 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id E7CD76B00A5; Wed, 8 May 2024 15:27:48 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id D6BC46B00A6; Wed, 8 May 2024 15:27:48 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0015.hostedemail.com [216.40.44.15]) by kanga.kvack.org (Postfix) with ESMTP id BA1106B00A4 for ; Wed, 8 May 2024 15:27:48 -0400 (EDT) Received: from smtpin20.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay09.hostedemail.com (Postfix) with ESMTP id 6E2F58121C for ; Wed, 8 May 2024 19:27:48 +0000 (UTC) X-FDA: 82096213416.20.BCF0F66 Received: from mail-wm1-f48.google.com (mail-wm1-f48.google.com [209.85.128.48]) by imf28.hostedemail.com (Postfix) with ESMTP id 90836C001D for ; Wed, 8 May 2024 19:27:46 +0000 (UTC) Authentication-Results: imf28.hostedemail.com; dkim=pass header.d=rivosinc-com.20230601.gappssmtp.com header.s=20230601 header.b=CeSbsAPd; dmarc=none; spf=pass (imf28.hostedemail.com: domain of alexghiti@rivosinc.com designates 209.85.128.48 as permitted sender) smtp.mailfrom=alexghiti@rivosinc.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1715196466; 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-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=jcfQWqIQyCa6XQTZ9KciN3KqArzYv/m686IwSCSxNEA=; b=Q9KCUoSRQPWiBB80xDXoHoCOvFvtFcT2iPi8PHM6WhZqqpCN0hr4STkA0awvCIOvFAzx5S 6c1Cf+JPZZxbFGeXaMsOoRN0kNLMlVDOw0WnR3QYb++q/fvME6iD9E5ok4PnUuOB9dZkli axvi/N45+Dz/6OCnNqymWKfw1v8HyE4= ARC-Authentication-Results: i=1; imf28.hostedemail.com; dkim=pass header.d=rivosinc-com.20230601.gappssmtp.com header.s=20230601 header.b=CeSbsAPd; dmarc=none; spf=pass (imf28.hostedemail.com: domain of alexghiti@rivosinc.com designates 209.85.128.48 as permitted sender) smtp.mailfrom=alexghiti@rivosinc.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1715196466; a=rsa-sha256; cv=none; b=Njf4Un40fhp7vqiRkkIiKsynzKf+1UyRuZAEsaS/rKXQaJCNLYSIIjXDPv+jWbW8O+zGrs rcsWuQfqGm4Lk1GfYEDkIsfgsyD3YXVij1NFiLs4oQfRCNxnYVNxYSfeQkwhhztNwTMhZ9 7P9EQzNbgNFFtirdvzcdarTPD/ZcFRI= Received: by mail-wm1-f48.google.com with SMTP id 5b1f17b1804b1-41ba1ba55ffso795205e9.1 for ; Wed, 08 May 2024 12:27:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rivosinc-com.20230601.gappssmtp.com; s=20230601; t=1715196465; x=1715801265; 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=jcfQWqIQyCa6XQTZ9KciN3KqArzYv/m686IwSCSxNEA=; b=CeSbsAPd6jYQkzi8N2rE6EugEymvv6m+REtE1vv4a6rEl54ANAsowKyC+gwhJ+gRFn MxaVAdHOFTR3FulAvrQDMbFTuyXFmYYw6P3hgA2bUoUGxbA3d9bTca+qwio8y/uv00MY elAZbiFiIjBH4wWY+RjNPODS2XpvvVXrQlOjaZLpRxlMg2lBTIB8kVUkLb1+1h9G+lMI habTD1y8C9pAJ+3E/1xFDITlC/6c+K49ZbSO9Dc7BzdAumOu/EyH9LcLoIXZjJqOv87k fJ2W7oTMOeqzdbrNcmISIFop8qxaaGmFyQzmQhjGWzu9XlRvYWOHzOU1J2xKMHW6k4Wm 6n2w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1715196465; x=1715801265; 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=jcfQWqIQyCa6XQTZ9KciN3KqArzYv/m686IwSCSxNEA=; b=sYymTI8/c/6XGjgW5J37k0cBV2kdEo/KCAahlU8odMbfkxaoRYepk9jmNUH2Vqe2Ox sHLS67LWSRSvKwAgnE8ZaQxiLu687YsrR1MHm575MjvpUvkwKl0HHqFzU8T3pNBfRX4c mRKCk3y+x+CmGig/pJjc2XZS7EI6zVeKtUQ+iCpALZll7j/vLABpzww6PESAfEPA/Hka SR0px8DQ8hD+v1yxF4cCId3gpDumjZrmDR5kR23zGLmfM4tk2F0YBiK3RZ9SxVRJ0Ebh 8MeMakxOpC3WM8hUoc7gjPMpGzNCS3Ng3dIiilemBD3ec3e0WguQPqs7aM5rMmC88Fh9 S+6w== X-Forwarded-Encrypted: i=1; AJvYcCVHfYBzk6xQ6pL7w/zo9AS4bISZ1OGtC3FK0qHwJAxttJrFyPK024jXKvANT0x9iGCfgJP30Cy2vI9HqLv4M23+uTw= X-Gm-Message-State: AOJu0YzKjdhoUfYOTq+6oAIFl4JTgHhpgky/Rw7k2cmJLA0b+zxC5Vxo 4mdKHpsjMIt851X6XBYsb11YQu0OMgy3qAi3H7OY4+zz+IvutGiPofZ7U59ttlA= X-Google-Smtp-Source: AGHT+IG713uLBQWbwM0MRsX1LOPSAYD3hwSeYc9+OS0/mfL1VayM0FBzmqDZCPlWciEj7G1Kaomx7g== X-Received: by 2002:a05:600c:3103:b0:41b:f43b:e263 with SMTP id 5b1f17b1804b1-41fbc12bdcbmr5274575e9.0.1715196465070; Wed, 08 May 2024 12:27:45 -0700 (PDT) Received: from alex-rivos.ba.rivosinc.com (amontpellier-656-1-456-62.w92-145.abo.wanadoo.fr. [92.145.124.62]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-41f87c24f8fsm33175985e9.15.2024.05.08.12.27.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 08 May 2024 12:27:44 -0700 (PDT) From: Alexandre Ghiti To: Ryan Roberts , Catalin Marinas , Will Deacon , Alexander Potapenko , Marco Elver , Dmitry Vyukov , Paul Walmsley , Palmer Dabbelt , Albert Ou , Ard Biesheuvel , Anup Patel , Atish Patra , Andrey Ryabinin , Andrey Konovalov , Vincenzo Frascino , Andrew Morton , linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, kasan-dev@googlegroups.com, linux-riscv@lists.infradead.org, linux-efi@vger.kernel.org, kvm@vger.kernel.org, kvm-riscv@lists.infradead.org, linux-mm@kvack.org Cc: Alexandre Ghiti Subject: [PATCH 08/12] mm, riscv, arm64: Use common ptep_test_and_clear_young() function Date: Wed, 8 May 2024 21:19:27 +0200 Message-Id: <20240508191931.46060-9-alexghiti@rivosinc.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20240508191931.46060-1-alexghiti@rivosinc.com> References: <20240508191931.46060-1-alexghiti@rivosinc.com> MIME-Version: 1.0 X-Rspamd-Server: rspam01 X-Stat-Signature: rz8ffxp3q8qfya6swomjjheu1qkf6gez X-Rspam-User: X-Rspamd-Queue-Id: 90836C001D X-HE-Tag: 1715196466-59398 X-HE-Meta: U2FsdGVkX18qOiv1Wgec46uAA3AnhXw5kNMwQYq+sdfHSZYLVVitMWcJtWQ2vJi4AfjfX8uvY/ipdfHDUivxopzKfQUYzQZaPxcxBwgny4/lkmRi2N5xzX9uGuvG4SnFdDM9Hueuc2e6/gJhJ7sqAxrgWaVUsJ8SWKMBXfFMqu+qkD9QOruKDnHF1OeOT3rNvdM4PMwevs8ysYQfzBVKz/MR97IhNDcQTZR1LqToyJQW/4FJKYDIgL1GPJlbmAk/23WfUDb8i9koly0dU7FpgG2J2r+msuUJ/it43W8s4a1TUKlHbbkMSPMAHrrVBw7AM0Kh6yGniVEefPvKe61IcEyQ7Ozhxz1N6Z1rYXEwav0Os6bOeVneJEEA/GjHgYEb1h79OCnTHAWs9dDkPOoh38roNf8Gr/O/ZhlbK3ubYDghjO29dDGqGyOEjbCZRwNxyWieIs/zRbXS7SvZUU4i5AxT0L4uCR800tg+mn79u5tS5TRgx4OrO3v56VPbluAXltr7kl8XmrXki1pjv+ggGV/cRHrnvhZTaCV7uA/iXGT5rJv48hz1+7d0XKK6HGCXk1iNTbiLzS2o9CWDkT3yp/En5arZ+je5B36ih6DO9FsPF6FjQ6FIgj44XJpunRi+SYE+cds5NjSh4V2pfuWFpoUG77v039esuWH1gUMCOUNswpPG3pZ9dwkmn/ECNv+dVQPGsgZJvSJUxrcx0SRNbhtcAJ1eMj9GQRlmalcHnDptGJbOWGc6nfRhW6/k2FeI5PB60TVoXZd6RdG5euVWwdhKHmgD5cxmYrIfaFNcAuHL/LmYOU1S1o4giKTmmada2Bqs3cOc+LHt0QYjc7FWTr0u6H/l8hcAOSW+jM5Fv6+FpIgiI77K/fy0EJokLwGrrm1+Vq/JSuS9kwDv1WL2SHa3YwOpxDFl+oE0cjfvWvkQv2CUtVA0zBsmOQ9RIozfSA1YUOWTqy4O2jjRLKs wBblQojn zS6wgSCvBzWrh541qAP+YqunUlrvyyH2R8bnXk0Tq77EODx2RnonA8LDP1NqRJS3QRJmyDjjxsTfBFDfAmJiYoM/548azKh7f4iPY0I8kDG0UkstKDQArl/Q922fZM4Xb6JUaCQWQ0AlKA9VQzgPX02TvNQp+qb3r0hgGUDT/aPM31Gu0WZ7zmllO1HJbWDpP85UnpZy02OxfEy370qawkRw8xL7zrnypypoyYArdJ0wApjCBRBJWXB/oJAThGXHvJ6u13+lVfNG1TMwZF0ush0GGdbS/LGBBluPgTGfVqMFtgUwyrtZa6i3qUXWDBbcJEPvuxvZgjjeP3UJdgNO1hG3SKpWE6ZgyEyXJzlFnmb7e4KBhEwBTPlqXlpWIcOLUET9ewrDMw1cdgEWphcyWywVwMyri7w8pkyr/IL/Djb98rIO4dytf4he3etyeSPvGAo25ABF/2KnNMII2CbwdUf5ofuZmNaKSBV5VNLcuHWcHZU+dmkh59/PjDlqxuSY3epE1QAac+XrAV8RcfYrHNa5zU1RpSuwncHz1YUcww9sdi/eYAn1IWHOHTA== 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: Make riscv use the contpte aware ptep_test_and_clear_young() function from arm64. Signed-off-by: Alexandre Ghiti --- arch/arm64/include/asm/pgtable.h | 14 ++---------- arch/arm64/mm/contpte.c | 25 -------------------- arch/riscv/include/asm/pgtable.h | 12 ++++++---- arch/riscv/kvm/mmu.c | 2 +- arch/riscv/mm/pgtable.c | 2 +- include/linux/contpte.h | 2 ++ mm/contpte.c | 39 ++++++++++++++++++++++++++++++++ 7 files changed, 53 insertions(+), 43 deletions(-) diff --git a/arch/arm64/include/asm/pgtable.h b/arch/arm64/include/asm/pgtable.h index ff7fe1d9cabe..9a8702d1ad00 100644 --- a/arch/arm64/include/asm/pgtable.h +++ b/arch/arm64/include/asm/pgtable.h @@ -1389,8 +1389,6 @@ extern void contpte_clear_full_ptes(struct mm_struct *mm, unsigned long addr, extern pte_t contpte_get_and_clear_full_ptes(struct mm_struct *mm, unsigned long addr, pte_t *ptep, unsigned int nr, int full); -extern int contpte_ptep_test_and_clear_young(struct vm_area_struct *vma, - unsigned long addr, pte_t *ptep); extern int contpte_ptep_clear_flush_young(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep); extern void contpte_wrprotect_ptes(struct mm_struct *mm, unsigned long addr, @@ -1477,16 +1475,8 @@ extern pte_t ptep_get_and_clear(struct mm_struct *mm, unsigned long addr, pte_t *ptep); #define __HAVE_ARCH_PTEP_TEST_AND_CLEAR_YOUNG -static inline int ptep_test_and_clear_young(struct vm_area_struct *vma, - unsigned long addr, pte_t *ptep) -{ - pte_t orig_pte = __ptep_get(ptep); - - if (likely(!pte_valid_cont(orig_pte))) - return __ptep_test_and_clear_young(vma, addr, ptep); - - return contpte_ptep_test_and_clear_young(vma, addr, ptep); -} +extern int ptep_test_and_clear_young(struct vm_area_struct *vma, + unsigned long addr, pte_t *ptep); #define __HAVE_ARCH_PTEP_CLEAR_YOUNG_FLUSH static inline int ptep_clear_flush_young(struct vm_area_struct *vma, diff --git a/arch/arm64/mm/contpte.c b/arch/arm64/mm/contpte.c index 5e9e40145085..9bf471633ca4 100644 --- a/arch/arm64/mm/contpte.c +++ b/arch/arm64/mm/contpte.c @@ -45,31 +45,6 @@ pte_t contpte_get_and_clear_full_ptes(struct mm_struct *mm, } EXPORT_SYMBOL_GPL(contpte_get_and_clear_full_ptes); -int contpte_ptep_test_and_clear_young(struct vm_area_struct *vma, - unsigned long addr, pte_t *ptep) -{ - /* - * ptep_clear_flush_young() technically requires us to clear the access - * flag for a _single_ pte. However, the core-mm code actually tracks - * access/dirty per folio, not per page. And since we only create a - * contig range when the range is covered by a single folio, we can get - * away with clearing young for the whole contig range here, so we avoid - * having to unfold. - */ - - int young = 0; - int i; - - ptep = arch_contpte_align_down(ptep); - addr = ALIGN_DOWN(addr, CONT_PTE_SIZE); - - for (i = 0; i < CONT_PTES; i++, ptep++, addr += PAGE_SIZE) - young |= __ptep_test_and_clear_young(vma, addr, ptep); - - return young; -} -EXPORT_SYMBOL_GPL(contpte_ptep_test_and_clear_young); - int contpte_ptep_clear_flush_young(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep) { diff --git a/arch/riscv/include/asm/pgtable.h b/arch/riscv/include/asm/pgtable.h index 03cd640137ed..d39cb24c6c4a 100644 --- a/arch/riscv/include/asm/pgtable.h +++ b/arch/riscv/include/asm/pgtable.h @@ -739,8 +739,7 @@ static inline void __pte_clear(struct mm_struct *mm, extern int __ptep_set_access_flags(struct vm_area_struct *vma, unsigned long address, pte_t *ptep, pte_t entry, int dirty); -#define __HAVE_ARCH_PTEP_TEST_AND_CLEAR_YOUNG /* defined in mm/pgtable.c */ -extern int ptep_test_and_clear_young(struct vm_area_struct *vma, unsigned long address, +extern int __ptep_test_and_clear_young(struct vm_area_struct *vma, unsigned long address, pte_t *ptep); static inline pte_t __ptep_get_and_clear(struct mm_struct *mm, @@ -778,7 +777,7 @@ static inline int ptep_clear_flush_young(struct vm_area_struct *vma, * shouldn't really matter because there's no real memory * pressure for swapout to react to. ] */ - return ptep_test_and_clear_young(vma, address, ptep); + return __ptep_test_and_clear_young(vma, address, ptep); } #ifdef CONFIG_THP_CONTPTE @@ -797,6 +796,9 @@ extern void pte_clear(struct mm_struct *mm, unsigned long addr, pte_t *ptep); #define __HAVE_ARCH_PTEP_GET_AND_CLEAR extern pte_t ptep_get_and_clear(struct mm_struct *mm, unsigned long addr, pte_t *ptep); +#define __HAVE_ARCH_PTEP_TEST_AND_CLEAR_YOUNG +extern int ptep_test_and_clear_young(struct vm_area_struct *vma, + unsigned long addr, pte_t *ptep); #else /* CONFIG_THP_CONTPTE */ @@ -806,6 +808,8 @@ extern pte_t ptep_get_and_clear(struct mm_struct *mm, #define pte_clear __pte_clear #define __HAVE_ARCH_PTEP_GET_AND_CLEAR #define ptep_get_and_clear __ptep_get_and_clear +#define __HAVE_ARCH_PTEP_TEST_AND_CLEAR_YOUNG +#define ptep_test_and_clear_young __ptep_test_and_clear_young #endif /* CONFIG_THP_CONTPTE */ @@ -987,7 +991,7 @@ static inline int pmdp_set_access_flags(struct vm_area_struct *vma, static inline int pmdp_test_and_clear_young(struct vm_area_struct *vma, unsigned long address, pmd_t *pmdp) { - return ptep_test_and_clear_young(vma, address, (pte_t *)pmdp); + return __ptep_test_and_clear_young(vma, address, (pte_t *)pmdp); } #define __HAVE_ARCH_PMDP_HUGE_GET_AND_CLEAR diff --git a/arch/riscv/kvm/mmu.c b/arch/riscv/kvm/mmu.c index 1ee6139d495f..554926e33760 100644 --- a/arch/riscv/kvm/mmu.c +++ b/arch/riscv/kvm/mmu.c @@ -585,7 +585,7 @@ bool kvm_age_gfn(struct kvm *kvm, struct kvm_gfn_range *range) &ptep, &ptep_level)) return false; - return ptep_test_and_clear_young(NULL, 0, ptep); + return __ptep_test_and_clear_young(NULL, 0, ptep); } bool kvm_test_age_gfn(struct kvm *kvm, struct kvm_gfn_range *range) diff --git a/arch/riscv/mm/pgtable.c b/arch/riscv/mm/pgtable.c index 5756bde9eb42..5f31d0594109 100644 --- a/arch/riscv/mm/pgtable.c +++ b/arch/riscv/mm/pgtable.c @@ -18,7 +18,7 @@ int __ptep_set_access_flags(struct vm_area_struct *vma, return true; } -int ptep_test_and_clear_young(struct vm_area_struct *vma, +int __ptep_test_and_clear_young(struct vm_area_struct *vma, unsigned long address, pte_t *ptep) { diff --git a/include/linux/contpte.h b/include/linux/contpte.h index 01da4bfc3af6..38092adbe0d4 100644 --- a/include/linux/contpte.h +++ b/include/linux/contpte.h @@ -19,5 +19,7 @@ void contpte_try_unfold(struct mm_struct *mm, unsigned long addr, pte_t *ptep, pte_t pte); void contpte_set_ptes(struct mm_struct *mm, unsigned long addr, pte_t *ptep, pte_t pte, unsigned int nr); +int contpte_ptep_test_and_clear_young(struct vm_area_struct *vma, + unsigned long addr, pte_t *ptep); #endif /* _LINUX_CONTPTE_H */ diff --git a/mm/contpte.c b/mm/contpte.c index 5bf939639233..220e9d81f401 100644 --- a/mm/contpte.c +++ b/mm/contpte.c @@ -47,6 +47,7 @@ * - set_pte() * - pte_clear() * - ptep_get_and_clear() + * - ptep_test_and_clear_young() */ pte_t huge_ptep_get(pte_t *ptep) @@ -690,4 +691,42 @@ pte_t ptep_get_and_clear(struct mm_struct *mm, contpte_try_unfold(mm, addr, ptep, __ptep_get(ptep)); return __ptep_get_and_clear(mm, addr, ptep); } + +int contpte_ptep_test_and_clear_young(struct vm_area_struct *vma, + unsigned long addr, pte_t *ptep) +{ + /* + * ptep_clear_flush_young() technically requires us to clear the access + * flag for a _single_ pte. However, the core-mm code actually tracks + * access/dirty per folio, not per page. And since we only create a + * contig range when the range is covered by a single folio, we can get + * away with clearing young for the whole contig range here, so we avoid + * having to unfold. + */ + + size_t pgsize; + int young = 0; + int i, ncontig; + + ptep = arch_contpte_align_down(ptep); + ncontig = arch_contpte_get_num_contig(vma->vm_mm, addr, ptep, 0, &pgsize); + addr = ALIGN_DOWN(addr, ncontig * pgsize); + + for (i = 0; i < ncontig; i++, ptep++, addr += pgsize) + young |= __ptep_test_and_clear_young(vma, addr, ptep); + + return young; +} +EXPORT_SYMBOL_GPL(contpte_ptep_test_and_clear_young); + +__always_inline int ptep_test_and_clear_young(struct vm_area_struct *vma, + unsigned long addr, pte_t *ptep) +{ + pte_t orig_pte = __ptep_get(ptep); + + if (likely(!pte_valid_cont(orig_pte))) + return __ptep_test_and_clear_young(vma, addr, ptep); + + return contpte_ptep_test_and_clear_young(vma, addr, ptep); +} #endif /* CONFIG_THP_CONTPTE */