Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/1.2/patches/2225612/?format=api
{ "id": 2225612, "url": "http://patchwork.ozlabs.org/api/1.2/patches/2225612/?format=api", "web_url": "http://patchwork.ozlabs.org/project/kvm-riscv/patch/20260421092457.37649-6-cuiyunhui@bytedance.com/", "project": { "id": 70, "url": "http://patchwork.ozlabs.org/api/1.2/projects/70/?format=api", "name": "Linux KVM RISC-V", "link_name": "kvm-riscv", "list_id": "kvm-riscv.lists.infradead.org", "list_email": "kvm-riscv@lists.infradead.org", "web_url": "", "scm_url": "", "webscm_url": "", "list_archive_url": "http://lists.infradead.org/pipermail/kvm-riscv/", "list_archive_url_format": "", "commit_url_format": "" }, "msgid": "<20260421092457.37649-6-cuiyunhui@bytedance.com>", "list_archive_url": null, "date": "2026-04-21T09:24:55", "name": "[5/7] riscv: add contiguous PTE range clearing helpers", "commit_ref": null, "pull_url": null, "state": "new", "archived": false, "hash": "fd05447220c515573b5032bd320fbbd5c19eb879", "submitter": { "id": 88211, "url": "http://patchwork.ozlabs.org/api/1.2/people/88211/?format=api", "name": "Yunhui Cui", "email": "cuiyunhui@bytedance.com" }, "delegate": null, "mbox": "http://patchwork.ozlabs.org/project/kvm-riscv/patch/20260421092457.37649-6-cuiyunhui@bytedance.com/mbox/", "series": [ { "id": 500766, "url": "http://patchwork.ozlabs.org/api/1.2/series/500766/?format=api", "web_url": "http://patchwork.ozlabs.org/project/kvm-riscv/list/?series=500766", "date": "2026-04-21T09:24:50", "name": "riscv: add Svnapot-based contiguous PTE support", "version": 1, "mbox": "http://patchwork.ozlabs.org/series/500766/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/2225612/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/2225612/checks/", "tags": {}, "related": [], "headers": { "Return-Path": "\n <kvm-riscv-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org>", "X-Original-To": "incoming@patchwork.ozlabs.org", "Delivered-To": "patchwork-incoming@legolas.ozlabs.org", "Authentication-Results": [ "legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n secure) header.d=lists.infradead.org header.i=@lists.infradead.org\n header.a=rsa-sha256 header.s=bombadil.20210309 header.b=q4X/Wk8D;\n\tdkim=fail reason=\"signature verification failed\" (2048-bit key;\n unprotected) header.d=bytedance.com header.i=@bytedance.com\n header.a=rsa-sha256 header.s=google header.b=iH4Ez+mm;\n\tdkim-atps=neutral", "legolas.ozlabs.org;\n spf=none (no SPF record) smtp.mailfrom=lists.infradead.org\n (client-ip=2607:7c80:54:3::133; helo=bombadil.infradead.org;\n envelope-from=kvm-riscv-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org;\n receiver=patchwork.ozlabs.org)" ], "Received": [ "from bombadil.infradead.org (bombadil.infradead.org\n [IPv6:2607:7c80:54:3::133])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519 server-signature ECDSA (secp384r1) server-digest SHA384)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4g0H623481z1yGs\n\tfor <incoming@patchwork.ozlabs.org>; Tue, 21 Apr 2026 19:26:02 +1000 (AEST)", "from localhost ([::1] helo=bombadil.infradead.org)\n\tby bombadil.infradead.org with esmtp (Exim 4.98.2 #2 (Red Hat Linux))\n\tid 1wF7Mm-00000008Kba-3R3A;\n\tTue, 21 Apr 2026 09:26:00 +0000", "from mail-pl1-x634.google.com ([2607:f8b0:4864:20::634])\n\tby bombadil.infradead.org with esmtps (Exim 4.98.2 #2 (Red Hat Linux))\n\tid 1wF7Mk-00000008KZA-0fMC\n\tfor kvm-riscv@lists.infradead.org;\n\tTue, 21 Apr 2026 09:25:59 +0000", "by mail-pl1-x634.google.com with SMTP id\n d9443c01a7336-2adff872068so18950255ad.1\n for <kvm-riscv@lists.infradead.org>;\n Tue, 21 Apr 2026 02:25:57 -0700 (PDT)", "from L6YN4KR4K9.bytedance.net ([61.213.176.6])\n by smtp.gmail.com with ESMTPSA id\n d9443c01a7336-2b5fa9ff39csm131965105ad.4.2026.04.21.02.25.48\n (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256);\n Tue, 21 Apr 2026 02:25:56 -0700 (PDT)" ], "DKIM-Signature": [ "v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed;\n\td=lists.infradead.org; s=bombadil.20210309; h=Sender:\n\tContent-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post:\n\tList-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To:\n\tMessage-Id:Date:Subject:To:From:Reply-To:Cc:Content-ID:Content-Description:\n\tResent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:\n\tList-Owner; bh=s4uQg+cYPiuLTsCACW5NWTjgG/uKL9u47++0+GLpdSY=; b=q4X/Wk8D/IALqN\n\tylo5J0AMkW1bBRYdO5HLmWe3vigCRzZTRGTPpDroIvSD6xKYumjubhXXT1FJRU1QCsxk5lsPRF5Az\n\tz1hLDGHmSUDjPTc7jbO6pLb9CT+wiZKqTjW3pdzQBeCvlDiPpypmi/oHLUKdF6aIJvWar64jqzg0c\n\tnPmtNX9l5rB9pc0U0Ttv4fVtR/hqmk61FVSJoI8nNAVBIL5Pb4u9zW2rLeO9FyPytuztfOSjqNByf\n\tM6b8pRAZE63KSfbVgh/oZS5I2QBIEzQSMubylpAgkWeajDDJWZFowXTLq/MC43qhtXuzrPAXlQr73\n\tCFLv12u3obkPSA+CUilg==;", "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=bytedance.com; s=google; t=1776763557; x=1777368357;\n darn=lists.infradead.org;\n h=content-transfer-encoding:mime-version:references:in-reply-to\n :message-id:date:subject:to:from:from:to:cc:subject:date:message-id\n :reply-to;\n bh=CqGRaYikd48k8jEHjjdiykQw70hWXJqzRcIUQ0MV2mg=;\n b=iH4Ez+mmZb6AgH/crarxKBxh6EBAJATE83Iz/U1sDzGFDwS3ueQXVykBlL7NMa6cWA\n auhvo9Db+6oQtUYozDdKhUGSnQsiJ4gkPQfEl6H+LQR8ldEJUDNbMmXLT801I7vtrk+F\n frlz09a5No0W9ot2KUjc1L35LgUZknc3xoXFfsrGp2UkzxuTHXzkc0Zbmq2lNl7XjbuQ\n qvFDtFSFsqGSriuyZgxZtAkrqagrmkRho2LFbct+p+Nlbtccs5VbhhIjauw2XYojj292\n MnLKHG6gs3Gs6zYgWqt0XYw6QCWom+izI6TAuFJvXytolbGwWstnhlZcL6C3Z6EogwDO\n knTQ==" ], "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20251104; t=1776763557; x=1777368357;\n h=content-transfer-encoding:mime-version:references:in-reply-to\n :message-id:date:subject:to:from:x-gm-gg:x-gm-message-state:from:to\n :cc:subject:date:message-id:reply-to;\n bh=CqGRaYikd48k8jEHjjdiykQw70hWXJqzRcIUQ0MV2mg=;\n b=PM5fL3gvgGZzd2ykkgEjvsTlq3Hd7/rAit27YwdNyGSMOjSonu5hOr/DXxnfNhULc2\n Z/6B1rU529AHBeW6P4kElkivMVW9iiSFSWv84KRNDrPQ/bDF1BescldZKKt0P9O3Ydz3\n vYfNgEkTD/m1qQgZzVdvbi5Adf/nuLxcbKycyi+9wAM8WqDOuSwGAwvPVYJkZnUZVvxW\n 1sVhV/BdKUYTmypx5MdXp9bxK3uUyTq9S070BhfaWwp5l5WhqON3E1Xwps/Mdz+RBJKU\n ntR4Dq29+T0nMRn+vxvZHAHRINK87QHgC7ggAyIs3daQqb+/m+aYPef/RVJjojy3Ks02\n gnJA==", "X-Forwarded-Encrypted": "i=1;\n AFNElJ9u4P+aRhWZ7XA/1Yeun5iZs62BJjw4gGiCSInMACIHHTaUyFVMbWg28f95EnO9YV5+DEwamaUMW4I=@lists.infradead.org", "X-Gm-Message-State": "AOJu0Yx8KydLxtZ8cmp9Ggb5NVBwGA2z/PAYAzAio37AyEC+1UM3iouO\n\tm/2xnm38T87Cytv5JnSzXIY4Zud04FxVXt/JLbpDPtYe79/o4Y/2xj8m7LHGNFKrNXw=", "X-Gm-Gg": "AeBDiestOyrBW201gNpRpOAEpiWcgrOg6wRaVK5Lgs9QtCDkwWnrIdcZe2fUZPM4D5U\n\tRDGvs7phZmqucE5yUGV+g5kNxmIK1g4IvOqpLQoK/vmGd1ISLFhBGw31M3c5Ccp7k9232Y4Ood5\n\tBkTk24TMID9a5V/KgvgvwGqyM6K7ikrIkm5yJ63zdhuBU6E7iNsfWfEwsOQ2Vovt/T96Hu2VH79\n\trcHpUEETpVBCgsWRxJjhRKG8icYer+PobxsLPMKwczGErCbl5mcnCg6NKGcMMHHVSGUlbmxeNcc\n\tg60mhMmS8JRUgPgg1tIZ+q8xolbaoaJZVXEoldo4ZHLymfBOPVb7ZFxL8OmCekZ/Sq+E/6I04KR\n\tWGCUFgK3nEWT4DTdB4QvoBKcuey6q1Ab5OvTLf1YdYfx8kxklpFIWMNq4aBbQ6qIBE0ZyGDRWzs\n\tqm7PAtfEnfuwBNz6r9OjIR678y5Z0F80dpzRz86+uwSliy3V4nG+qzg/+VfSAEs1Mk6SAQ", "X-Received": "by 2002:a17:903:1b30:b0:2b4:586d:2e5c with SMTP id\n d9443c01a7336-2b5f9ecbaa1mr174163805ad.2.1776763557022;\n Tue, 21 Apr 2026 02:25:57 -0700 (PDT)", "From": "Yunhui Cui <cuiyunhui@bytedance.com>", "To": "akpm@linux-foundation.org,\n\talex@ghiti.fr,\n\tandrew+kernel@donnellan.id.au,\n\tandreyknvl@gmail.com,\n\tanup@brainfault.org,\n\taou@eecs.berkeley.edu,\n\tapopple@nvidia.com,\n\tardb@kernel.org,\n\tatish.patra@linux.dev,\n\tbaolin.wang@linux.alibaba.com,\n\tcuiyunhui@bytedance.com,\n\tdavid@kernel.org,\n\tdebug@rivosinc.com,\n\tdjordje.todorovic@htecgroup.com,\n\tdvyukov@google.com,\n\telver@google.com,\n\tglider@google.com,\n\tilias.apalodimas@linaro.org,\n\tjunhui.liu@pigmoral.tech,\n\tkasan-dev@googlegroups.com,\n\tkees@kernel.org,\n\tkevin.brodsky@arm.com,\n\tkvm-riscv@lists.infradead.org,\n\tkvm@vger.kernel.org,\n\tlinux-efi@vger.kernel.org,\n\tlinux-kernel@vger.kernel.org,\n\tlinux-riscv@lists.infradead.org,\n\tliu.xuemei1@zte.com.cn,\n\tljs@kernel.org,\n\tnamcao@linutronix.de,\n\tosalvador@suse.de,\n\tpalmer@dabbelt.com,\n\tpjw@kernel.org,\n\trmclure@linux.ibm.com,\n\trostedt@goodmis.org,\n\trppt@kernel.org,\n\tryabinin.a.a@gmail.com,\n\tsurenb@google.com,\n\tvincenzo.frascino@arm.com,\n\tvishal.moola@gmail.com,\n\twangruikang@iscas.ac.cn,\n\tzhangchunyan@iscas.ac.cn", "Subject": "[PATCH 5/7] riscv: add contiguous PTE range clearing helpers", "Date": "Tue, 21 Apr 2026 17:24:55 +0800", "Message-Id": "<20260421092457.37649-6-cuiyunhui@bytedance.com>", "X-Mailer": "git-send-email 2.39.2 (Apple Git-143)", "In-Reply-To": "<20260421092457.37649-1-cuiyunhui@bytedance.com>", "References": "<20260421092457.37649-1-cuiyunhui@bytedance.com>", "MIME-Version": "1.0", "X-CRM114-Version": "20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 ", "X-CRM114-CacheID": "sfid-20260421_022558_203365_F22517C6 ", "X-CRM114-Status": "GOOD ( 14.11 )", "X-Spam-Score": "0.4 (/)", "X-Spam-Report": "Spam detection software,\n running on the system \"bombadil.infradead.org\",\n has NOT identified this incoming email as spam. The original\n message has been attached to this so you can view it or label\n similar future email. If you have any questions, see\n the administrator of that system for details.\n Content preview: Add Svnapot-aware implementations of clear_full_ptes() and\n get_and_clear_full_ptes() so full PTE batches can be cleared without\n losing\n the required unfold semantics for NAPOT mappings. Signed-off-by: Yunhui\n Cui\n <cuiyunhui@bytedance.com> --- arch/riscv/include/asm/pgtable.h | 75\n ++++++++++++++++++++++++-\n arch/riscv/mm/contpte.c | 96 ++++++++++++++++++++++++++++++++ 2 files\n changed,\n 1 [...]\n Content analysis details: (0.4 points, 5.0 required)\n pts rule name description\n ---- ----------------------\n --------------------------------------------------\n -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at https://www.dnswl.org/, no\n trust\n [2607:f8b0:4864:20:0:0:0:634 listed in]\n [list.dnswl.org]\n -0.0 SPF_PASS SPF: sender matches SPF record\n 0.0 SPF_HELO_NONE SPF: HELO does not publish an SPF Record\n -0.1 DKIM_VALID_EF Message has a valid DKIM or DK signature from\n envelope-from domain\n -0.1 DKIM_VALID Message has at least one valid DKIM or DK\n signature\n -0.1 DKIM_VALID_AU Message has a valid DKIM or DK signature from\n author's\n domain\n 0.1 DKIM_SIGNED Message has a DKIM or DK signature,\n not necessarily valid\n -1.9 BAYES_00 BODY: Bayes spam probability is 0 to 1%\n [score: 0.0000]\n 2.5 SORTED_RECIPS Recipient list is sorted by address", "X-BeenThere": "kvm-riscv@lists.infradead.org", "X-Mailman-Version": "2.1.34", "Precedence": "list", "List-Id": "<kvm-riscv.lists.infradead.org>", "List-Unsubscribe": "<http://lists.infradead.org/mailman/options/kvm-riscv>,\n <mailto:kvm-riscv-request@lists.infradead.org?subject=unsubscribe>", "List-Archive": "<http://lists.infradead.org/pipermail/kvm-riscv/>", "List-Post": "<mailto:kvm-riscv@lists.infradead.org>", "List-Help": "<mailto:kvm-riscv-request@lists.infradead.org?subject=help>", "List-Subscribe": "<http://lists.infradead.org/mailman/listinfo/kvm-riscv>,\n <mailto:kvm-riscv-request@lists.infradead.org?subject=subscribe>", "Content-Type": "text/plain; charset=\"us-ascii\"", "Content-Transfer-Encoding": "7bit", "Sender": "\"kvm-riscv\" <kvm-riscv-bounces@lists.infradead.org>", "Errors-To": "kvm-riscv-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org" }, "content": "Add Svnapot-aware implementations of clear_full_ptes() and\nget_and_clear_full_ptes() so full PTE batches can be cleared without\nlosing the required unfold semantics for NAPOT mappings.\n\nSigned-off-by: Yunhui Cui <cuiyunhui@bytedance.com>\n---\n arch/riscv/include/asm/pgtable.h | 75 ++++++++++++++++++++++++-\n arch/riscv/mm/contpte.c | 96 ++++++++++++++++++++++++++++++++\n 2 files changed, 170 insertions(+), 1 deletion(-)", "diff": "diff --git a/arch/riscv/include/asm/pgtable.h b/arch/riscv/include/asm/pgtable.h\nindex 722483d4df37f..3e6516b5a4587 100644\n--- a/arch/riscv/include/asm/pgtable.h\n+++ b/arch/riscv/include/asm/pgtable.h\n@@ -657,7 +657,6 @@ static inline void __set_pte_at(struct mm_struct *mm, pte_t *ptep, pte_t pteval)\n }\n \n #define PFN_PTE_SHIFT\t\t_PAGE_PFN_SHIFT\n-\n static inline void __set_ptes(struct mm_struct *mm, unsigned long addr,\n \t\t\t pte_t *ptep, pte_t pteval, unsigned int nr)\n {\n@@ -764,6 +763,47 @@ __ptep_get_and_clear(struct mm_struct *mm, unsigned long address, pte_t *ptep)\n \n #define __ptep_get_and_clear __ptep_get_and_clear\n \n+static inline void __clear_full_ptes(struct mm_struct *mm, unsigned long addr,\n+\t\t\t\t pte_t *ptep, unsigned int nr, int full)\n+{\n+\t(void)full;\n+\n+\tfor (;;) {\n+\t\t__ptep_get_and_clear(mm, addr, ptep);\n+\t\tif (--nr == 0)\n+\t\t\tbreak;\n+\t\tptep++;\n+\t\taddr += PAGE_SIZE;\n+\t}\n+}\n+\n+#define __clear_full_ptes __clear_full_ptes\n+\n+static inline pte_t __get_and_clear_full_ptes(struct mm_struct *mm,\n+\t\t\t\t\t unsigned long addr,\n+\t\t\t\t pte_t *ptep,\n+\t\t\t\t unsigned int nr,\n+\t\t\t\t int full)\n+{\n+\tpte_t pte, tmp_pte;\n+\n+\t(void)full;\n+\n+\tpte = __ptep_get_and_clear(mm, addr, ptep);\n+\twhile (--nr) {\n+\t\tptep++;\n+\t\taddr += PAGE_SIZE;\n+\t\ttmp_pte = __ptep_get_and_clear(mm, addr, ptep);\n+\t\tif (pte_dirty(tmp_pte))\n+\t\t\tpte = pte_mkdirty(pte);\n+\t\tif (pte_young(tmp_pte))\n+\t\t\tpte = pte_mkyoung(pte);\n+\t}\n+\n+\treturn pte;\n+}\n+\n+#define __get_and_clear_full_ptes __get_and_clear_full_ptes\n static inline void\n __ptep_set_wrprotect(struct mm_struct *mm, unsigned long address, pte_t *ptep)\n {\n@@ -831,6 +871,11 @@ pte_t napotpte_ptep_get(pte_t *ptep, pte_t orig_pte);\n pte_t napotpte_ptep_get_lockless(pte_t *ptep);\n void napotpte_set_ptes(struct mm_struct *mm, unsigned long addr,\n \t\t pte_t *ptep, pte_t pte, unsigned int nr);\n+void napotpte_clear_full_ptes(struct mm_struct *mm, unsigned long addr,\n+\t\t\t pte_t *ptep, unsigned int nr, int full);\n+pte_t napotpte_get_and_clear_full_ptes(struct mm_struct *mm,\n+\t\t\t\t unsigned long addr, pte_t *ptep,\n+\t\t\t\t unsigned int nr, int full);\n void napotpte_clear_young_dirty_ptes(struct vm_area_struct *vma,\n \t\t\t\t unsigned long addr, pte_t *ptep,\n \t\t\t unsigned int nr, cydp_t flags);\n@@ -933,6 +978,32 @@ static inline void clear_young_dirty_ptes(struct vm_area_struct *vma,\n \tnapotpte_clear_young_dirty_ptes(vma, addr, ptep, nr, flags);\n }\n \n+#define clear_full_ptes clear_full_ptes\n+static inline void clear_full_ptes(struct mm_struct *mm, unsigned long addr,\n+\t\t\t\t pte_t *ptep, unsigned int nr, int full)\n+{\n+\tif (likely(nr == 1)) {\n+\t\tnapotpte_try_unfold(mm, addr, ptep, __ptep_get(ptep));\n+\t\t__clear_full_ptes(mm, addr, ptep, nr, full);\n+\t\treturn;\n+\t}\n+\n+\tnapotpte_clear_full_ptes(mm, addr, ptep, nr, full);\n+}\n+\n+#define get_and_clear_full_ptes get_and_clear_full_ptes\n+static inline pte_t get_and_clear_full_ptes(struct mm_struct *mm,\n+\t\t\t\t\t unsigned long addr, pte_t *ptep,\n+\t\t\t\t unsigned int nr, int full)\n+{\n+\tif (likely(nr == 1)) {\n+\t\tnapotpte_try_unfold(mm, addr, ptep, __ptep_get(ptep));\n+\t\treturn __get_and_clear_full_ptes(mm, addr, ptep, nr, full);\n+\t}\n+\n+\treturn napotpte_get_and_clear_full_ptes(mm, addr, ptep, nr, full);\n+}\n+\n #define __HAVE_ARCH_PTEP_SET_WRPROTECT\n static inline void ptep_set_wrprotect(struct mm_struct *mm,\n \t\t\t\t unsigned long address, pte_t *ptep)\n@@ -989,6 +1060,8 @@ napotpte_ptep_clear_flush_young(struct vm_area_struct *vma,\n #define ptep_get_lockless\t\t\t__ptep_get_lockless\n #define ptep_get_and_clear\t\t\t__ptep_get_and_clear\n #define clear_young_dirty_ptes\t\t\t__clear_young_dirty_ptes\n+#define clear_full_ptes\t\t\t\t__clear_full_ptes\n+#define get_and_clear_full_ptes\t\t\t__get_and_clear_full_ptes\n #define __HAVE_ARCH_PTEP_SET_WRPROTECT\n #define ptep_set_wrprotect\t\t\t__ptep_set_wrprotect\n #define __HAVE_ARCH_PTEP_CLEAR_YOUNG_FLUSH\ndiff --git a/arch/riscv/mm/contpte.c b/arch/riscv/mm/contpte.c\nindex f73af7d9b099a..77c2a4dbd3dda 100644\n--- a/arch/riscv/mm/contpte.c\n+++ b/arch/riscv/mm/contpte.c\n@@ -107,6 +107,38 @@ __napot_ptep_get_and_clear(struct mm_struct *mm, unsigned long addr, pte_t *ptep\n \treturn pte;\n }\n \n+static void __napot_clear_full_ptes(struct mm_struct *mm, unsigned long addr,\n+\t\t\t\t pte_t *ptep, unsigned int nr)\n+{\n+\tfor (;;) {\n+\t\t__napot_ptep_get_and_clear(mm, addr, ptep);\n+\t\tif (--nr == 0)\n+\t\t\tbreak;\n+\t\tptep++;\n+\t\taddr += PAGE_SIZE;\n+\t}\n+}\n+\n+static pte_t __napot_get_and_clear_full_ptes(struct mm_struct *mm,\n+\t\t\t\t\t unsigned long addr, pte_t *ptep,\n+\t\t\t\t\t unsigned int nr)\n+{\n+\tpte_t pte, tmp_pte;\n+\n+\tpte = __napot_ptep_get_and_clear(mm, addr, ptep);\n+\twhile (--nr) {\n+\t\tptep++;\n+\t\taddr += PAGE_SIZE;\n+\t\ttmp_pte = __napot_ptep_get_and_clear(mm, addr, ptep);\n+\t\tif (pte_dirty(tmp_pte))\n+\t\t\tpte = pte_mkdirty(pte);\n+\t\tif (pte_young(tmp_pte))\n+\t\t\tpte = pte_mkyoung(pte);\n+\t}\n+\n+\treturn pte;\n+}\n+\n static void napotpte_convert(struct mm_struct *mm, unsigned long addr,\n \t\t\t pte_t *ptep, pte_t target)\n {\n@@ -202,6 +234,33 @@ void __napotpte_try_fold(struct mm_struct *mm, unsigned long addr,\n }\n EXPORT_SYMBOL(__napotpte_try_fold);\n \n+static void napotpte_try_unfold_range(struct mm_struct *mm,\n+\t\t\t\t unsigned long addr, pte_t *ptep,\n+\t\t\t\t unsigned int nr)\n+{\n+\tunsigned long next;\n+\tpte_t pte;\n+\tunsigned int chunk;\n+\n+\twhile (nr) {\n+\t\tpte = READ_ONCE(*ptep);\n+\t\tif (pte_present_napot(pte)) {\n+\t\t\t__napotpte_try_unfold(mm, addr, ptep, pte);\n+\t\t\tnext = napot_align_addr(addr) + napotpte_size();\n+\t\t\tchunk = (next - addr) >> PAGE_SHIFT;\n+\t\t} else {\n+\t\t\tchunk = 1;\n+\t\t}\n+\n+\t\tif (chunk > nr)\n+\t\t\tchunk = nr;\n+\n+\t\tptep += chunk;\n+\t\taddr += chunk * PAGE_SIZE;\n+\t\tnr -= chunk;\n+\t}\n+}\n+\n void __napotpte_try_unfold(struct mm_struct *mm, unsigned long addr,\n \t\t\t pte_t *ptep, pte_t pte)\n {\n@@ -349,6 +408,43 @@ void napotpte_set_ptes(struct mm_struct *mm, unsigned long addr,\n }\n EXPORT_SYMBOL(napotpte_set_ptes);\n \n+void napotpte_clear_full_ptes(struct mm_struct *mm, unsigned long addr,\n+\t\t\t pte_t *ptep, unsigned int nr, int full)\n+{\n+\t(void)full;\n+\n+\tif (!napot_hw_supported() || !mm_is_user(mm)) {\n+\t\t__napot_clear_full_ptes(mm, addr, ptep, nr);\n+\t\treturn;\n+\t}\n+\n+\t/*\n+\t * Unlike arm64 contpte, a Svnapot PTE block stores identical\n+\t * napot-encoded entries across the whole block rather than per-page\n+\t * PFNs. Batch zap paths must therefore unfold the whole covered range\n+\t * so the core MM later sees ordinary per-page PTEs for rmap/rss/tlb\n+\t * batching.\n+\t */\n+\tnapotpte_try_unfold_range(mm, addr, ptep, nr);\n+\t__napot_clear_full_ptes(mm, addr, ptep, nr);\n+}\n+EXPORT_SYMBOL(napotpte_clear_full_ptes);\n+\n+pte_t napotpte_get_and_clear_full_ptes(struct mm_struct *mm,\n+\t\t\t\t unsigned long addr, pte_t *ptep,\n+\t\t\t\t unsigned int nr, int full)\n+{\n+\t(void)full;\n+\n+\tif (!napot_hw_supported() || !mm_is_user(mm))\n+\t\treturn __napot_get_and_clear_full_ptes(mm, addr, ptep, nr);\n+\n+\tnapotpte_try_unfold_range(mm, addr, ptep, nr);\n+\n+\treturn __napot_get_and_clear_full_ptes(mm, addr, ptep, nr);\n+}\n+EXPORT_SYMBOL(napotpte_get_and_clear_full_ptes);\n+\n void napotpte_clear_young_dirty_ptes(struct vm_area_struct *vma,\n \t\t\t\t unsigned long addr, pte_t *ptep,\n \t\t\t\t unsigned int nr, cydp_t flags)\n", "prefixes": [ "5/7" ] }