From nobody Fri Jun 19 00:40:33 2026 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 4AE19265CC2 for ; Thu, 18 Jun 2026 13:15:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=217.140.110.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781788505; cv=none; b=fSBRhJzQ2h7iszlsuZGLAc0zO2YMVxYWIQPviBzEfiFpdQCVn1pvaHPa+xCV5vA7pRO8fvCxtmWEqYOJn702uJqLs3s76u/QTvCjdnq3bK2hxVe+uyccQXs4mQ8fMgAcFy2rLSUeo9/wEx4EnWJhMvDqAq1Knr46nSlI3DcEaJQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781788505; c=relaxed/simple; bh=dUkILoZJI/RNijTUFLYa3jizknsO8qivApkZa+N0csA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ZR0OSr0ERpudYNPKfX9THCSEX/g++SoNUDVw/Q4Rj9h6qFtyKqCx0yeJxWAUKgB94/Ais6/fTH2bDuLWKTbBR3HcTs8rC5z6LjZO3P/NMl2uoi3A34k6o78ou1pmrWV4BO/2vHZGRt0W4rEDEFhVgXKodvdFSd99vF79A/goDJc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com; spf=pass smtp.mailfrom=arm.com; dkim=pass (1024-bit key) header.d=arm.com header.i=@arm.com header.b=h8tUGLH8; arc=none smtp.client-ip=217.140.110.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=arm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=arm.com header.i=@arm.com header.b="h8tUGLH8" Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id D93E5293B; Thu, 18 Jun 2026 06:14:56 -0700 (PDT) Received: from LeoBrasDK.cambridge.arm.com (LeoBrasDK.cambridge.arm.com [10.2.212.21]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id D68D33F915; Thu, 18 Jun 2026 06:14:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=arm.com; s=foss; t=1781788501; bh=dUkILoZJI/RNijTUFLYa3jizknsO8qivApkZa+N0csA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=h8tUGLH8YhHfADsJHrnePcrz5Icl6qNns8+brYjstpiJKFsDznyqPtCh/QY7zQvgA TfjaTNLe7alu0fMbDYk8GpgAXaFROIZwTN+d/FzDE+T98YZcoOZd1QVabGPi8ajO8o g0ohSiHbmGH8xGPT1rlUb6Xu3royOpz9zofNBPcw= From: Leonardo Bras To: Marc Zyngier , Oliver Upton , Joey Gouly , Steffen Eiden , Suzuki K Poulose , Zenghui Yu , Catalin Marinas , Will Deacon , Fuad Tabba , Leonardo Bras , Raghavendra Rao Ananta Cc: linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev, linux-kernel@vger.kernel.org Subject: [PATCH v2 1/3] KVM: arm64: Avoid re-testing walk_continue Date: Thu, 18 Jun 2026 14:14:42 +0100 Message-ID: <20260618131447.764085-2-leo.bras@arm.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260618131447.764085-1-leo.bras@arm.com> References: <20260618131447.764085-1-leo.bras@arm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=1682; i=leo.bras@arm.com; h=from:subject; bh=dUkILoZJI/RNijTUFLYa3jizknsO8qivApkZa+N0csA=; b=owGbwMvMwCX2pizjszvTwvWMp9WSGLKM3/E+lNK5GLfeielSyew/U2uiov+sP3zgXmHICtHFC +wn7nA83VHKwiDGxSArpsgi+2j+Kp7vUzKOXPmxAGYOKxPIEAYuTgGYSPE1ht9slcImp/1/Tui4 xZ3nyPlzy5dDLkznlPmXXe/Xmd37XHAOw1+peavy3VrerpZmPukR2MT1mkfP0ibWqu7qjDNftA5 cuskCAA== X-Developer-Key: i=leo.bras@arm.com; a=openpgp; fpr=36E6C95AE0F111CC5B6F4D2E688C33F8A0C5B0C5 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" In __kvm_pgtable_visit(), a couple tests for kvm_pgtable_walk_continue() will 'goto out' if it should not continue. This means the same test will be ran again before returning ret, which is unnecessary. Return ret directly instead. This will simplify next patch. Signed-off-by: Leonardo Bras --- arch/arm64/kvm/hyp/pgtable.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/arch/arm64/kvm/hyp/pgtable.c b/arch/arm64/kvm/hyp/pgtable.c index 91a7dfad6686..4be1d51a6ac5 100644 --- a/arch/arm64/kvm/hyp/pgtable.c +++ b/arch/arm64/kvm/hyp/pgtable.c @@ -183,32 +183,32 @@ static inline int __kvm_pgtable_visit(struct kvm_pgta= ble_walk_data *data, * Reload the page table after invoking the walker callback for leaf * entries or after pre-order traversal, to allow the walker to descend * into a newly installed or replaced table. */ if (reload) { ctx.old =3D READ_ONCE(*ptep); table =3D kvm_pte_table(ctx.old, level); } =20 if (!kvm_pgtable_walk_continue(data->walker, ret)) - goto out; + return ret; =20 if (!table) { data->addr =3D ALIGN_DOWN(data->addr, kvm_granule_size(level)); data->addr +=3D kvm_granule_size(level); goto out; } =20 childp =3D (kvm_pteref_t)kvm_pte_follow(ctx.old, mm_ops); ret =3D __kvm_pgtable_walk(data, mm_ops, childp, level + 1); if (!kvm_pgtable_walk_continue(data->walker, ret)) - goto out; + return ret; =20 if (ctx.flags & KVM_PGTABLE_WALK_TABLE_POST) ret =3D kvm_pgtable_visitor_cb(data, &ctx, KVM_PGTABLE_WALK_TABLE_POST); =20 out: if (kvm_pgtable_walk_continue(data->walker, ret)) return 0; =20 return ret; } --=20 2.54.0 From nobody Fri Jun 19 00:40:33 2026 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 6373D22F767 for ; Thu, 18 Jun 2026 13:15:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=217.140.110.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781788509; cv=none; b=h6x1mny/I/+fOAVI9N2q2ECD+R1en3uIPTvonlk7bCSpWF6Fn1v2JgKOF7B3itwP3c3JGjyH/Nd7FH4G+/hRGvtXfEqCx+l0WFc1J5k0qm1FXmGbmhBqQB1w41TUgtndViCzjfe18sWR91YhP5+KY7MrNfXY+7yi5aC6h2Hrbq8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781788509; c=relaxed/simple; bh=M0AEHVdRuakQwURg5xGosQrOsitPBG7wqlEz8xjdIqY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=hHbcSqwigLyBd6qatPSf3taGls/PQrkQGQnseHyF+bVLubPzQ3XMcufg3Ay+Fep69nL8FVDGEUkNdfzrA7Fpg5i4kEnjsAa1VTOuvBDxAic1gInzYx+2JRFpSyC8OYZ2U9S/gHExkmL7Qt5Hudq41ibST2dn8Epil5xoC9Qir3U= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com; spf=pass smtp.mailfrom=arm.com; dkim=pass (1024-bit key) header.d=arm.com header.i=@arm.com header.b=ZMFonJem; arc=none smtp.client-ip=217.140.110.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=arm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=arm.com header.i=@arm.com header.b="ZMFonJem" Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id D54E02BC3; Thu, 18 Jun 2026 06:14:58 -0700 (PDT) Received: from LeoBrasDK.cambridge.arm.com (LeoBrasDK.cambridge.arm.com [10.2.212.21]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id CBFFC3F915; Thu, 18 Jun 2026 06:15:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=arm.com; s=foss; t=1781788503; bh=M0AEHVdRuakQwURg5xGosQrOsitPBG7wqlEz8xjdIqY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ZMFonJemhJMaoqXIcyVcopyzojkpUGz+Zy4Vh2JSVnexnc8S+jobr69hLdiU2pweP YEMquuRkeamkdjNnWSWqo07JoBbSdpLHnpbCZXRckpeQEIswF7irZmC/9CPa0uoB6n J1DojSE6NF04D3WvritV9wMexLPjP1hZdjuSD3wU= From: Leonardo Bras To: Marc Zyngier , Oliver Upton , Joey Gouly , Steffen Eiden , Suzuki K Poulose , Zenghui Yu , Catalin Marinas , Will Deacon , Fuad Tabba , Leonardo Bras , Raghavendra Rao Ananta Cc: linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev, linux-kernel@vger.kernel.org Subject: [PATCH v2 2/3] KVM: arm64: Introduce KVM_PGTABLE_WALK_SKIP_LEVEL* walk flags Date: Thu, 18 Jun 2026 14:14:43 +0100 Message-ID: <20260618131447.764085-3-leo.bras@arm.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260618131447.764085-1-leo.bras@arm.com> References: <20260618131447.764085-1-leo.bras@arm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=4894; i=leo.bras@arm.com; h=from:subject; bh=M0AEHVdRuakQwURg5xGosQrOsitPBG7wqlEz8xjdIqY=; b=owGbwMvMwCX2pizjszvTwvWMp9WSGLKM3/GpxZz0r9fwvGqZuYr7Sc7bFNn0Ep2Sv03HROOf9 ZTNDjjXUcrCIMbFICumyCL7aP4qnu9TMo5c+bEAZg4rE8gQBi5OAZjInLkM/93eq8QJTiosPf17 UddND7lrcZ/PuSRzrP57WqnTfZLB+78Mf0X6WrPirm13fV46d6/r1wfVkyVWeCjmSsx497Ut0O/ UKh4A X-Developer-Key: i=leo.bras@arm.com; a=openpgp; fpr=36E6C95AE0F111CC5B6F4D2E688C33F8A0C5B0C5 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add the new walking flags that tell kvm_pgtable_walk() to skip lower levels when walking the pagetables. Signed-off-by: Leonardo Bras --- arch/arm64/include/asm/kvm_pgtable.h | 13 +++++++++++++ arch/arm64/kvm/hyp/pgtable.c | 19 ++++++++++++++++--- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/arch/arm64/include/asm/kvm_pgtable.h b/arch/arm64/include/asm/= kvm_pgtable.h index 41a8687938eb..20c7c12e0e76 100644 --- a/arch/arm64/include/asm/kvm_pgtable.h +++ b/arch/arm64/include/asm/kvm_pgtable.h @@ -311,31 +311,44 @@ typedef bool (*kvm_pgtable_force_pte_cb_t)(u64 addr, = u64 end, * @KVM_PGTABLE_WALK_SHARED: Indicates the page-tables may be shared * with other software walkers. * @KVM_PGTABLE_WALK_IGNORE_EAGAIN: Don't terminate the walk early if * the walker returns -EAGAIN. * @KVM_PGTABLE_WALK_SKIP_BBM_TLBI: Visit and update table entries * without Break-before-make's * TLB invalidation. * @KVM_PGTABLE_WALK_SKIP_CMO: Visit and update table entries * without Cache maintenance * operations required. + * @KVM_PGTABLE_WALK_SKIP_LEVEL0: Skip visiting level-0+ entries + * @KVM_PGTABLE_WALK_SKIP_LEVEL1: Skip visiting level-1+ entries + * @KVM_PGTABLE_WALK_SKIP_LEVEL2: Skip visiting level-2+ entries + * @KVM_PGTABLE_WALK_SKIP_LEVEL3: Skip visiting level-3 entries */ enum kvm_pgtable_walk_flags { KVM_PGTABLE_WALK_LEAF =3D BIT(0), KVM_PGTABLE_WALK_TABLE_PRE =3D BIT(1), KVM_PGTABLE_WALK_TABLE_POST =3D BIT(2), KVM_PGTABLE_WALK_SHARED =3D BIT(3), KVM_PGTABLE_WALK_IGNORE_EAGAIN =3D BIT(4), KVM_PGTABLE_WALK_SKIP_BBM_TLBI =3D BIT(5), KVM_PGTABLE_WALK_SKIP_CMO =3D BIT(6), + KVM_PGTABLE_WALK_SKIP_LEVEL0 =3D BIT(7), + KVM_PGTABLE_WALK_SKIP_LEVEL1 =3D BIT(8), + KVM_PGTABLE_WALK_SKIP_LEVEL2 =3D BIT(9), + KVM_PGTABLE_WALK_SKIP_LEVEL3 =3D BIT(10), }; =20 +#define KVM_PGTABLE_WALK_SKIP_LEVELS (KVM_PGTABLE_WALK_SKIP_LEVEL0 | \ + KVM_PGTABLE_WALK_SKIP_LEVEL1 | \ + KVM_PGTABLE_WALK_SKIP_LEVEL2 | \ + KVM_PGTABLE_WALK_SKIP_LEVEL3 ) + struct kvm_pgtable_visit_ctx { kvm_pte_t *ptep; kvm_pte_t old; void *arg; struct kvm_pgtable_mm_ops *mm_ops; u64 start; u64 addr; u64 end; s8 level; enum kvm_pgtable_walk_flags flags; diff --git a/arch/arm64/kvm/hyp/pgtable.c b/arch/arm64/kvm/hyp/pgtable.c index 4be1d51a6ac5..b9a2078efc51 100644 --- a/arch/arm64/kvm/hyp/pgtable.c +++ b/arch/arm64/kvm/hyp/pgtable.c @@ -137,20 +137,33 @@ static bool kvm_pgtable_walk_continue(const struct kv= m_pgtable_walker *walker, * Ignore the return code altogether for walkers outside a fault handler * (e.g. write protecting a range of memory) and chug along with the * page table walk. */ if (r =3D=3D -EAGAIN) return walker->flags & KVM_PGTABLE_WALK_IGNORE_EAGAIN; =20 return !r; } =20 +static __always_inline bool kvm_pgtable_skip_level(s8 level, enum kvm_pgta= ble_walk_flags flags) +{ + flags &=3D KVM_PGTABLE_WALK_SKIP_LEVELS; + + if (likely(!flags)) + return false; + + if (level >=3D (ffs(flags) - ffs(KVM_PGTABLE_WALK_SKIP_LEVELS))) + return true; + + return false; +} + static int __kvm_pgtable_walk(struct kvm_pgtable_walk_data *data, struct kvm_pgtable_mm_ops *mm_ops, kvm_pteref_t pgtable, s8 level= ); =20 static inline int __kvm_pgtable_visit(struct kvm_pgtable_walk_data *data, struct kvm_pgtable_mm_ops *mm_ops, kvm_pteref_t pteref, s8 level) { enum kvm_pgtable_walk_flags flags =3D data->walker->flags; kvm_pte_t *ptep =3D kvm_dereference_pteref(data->walker, pteref); struct kvm_pgtable_visit_ctx ctx =3D { @@ -185,35 +198,35 @@ static inline int __kvm_pgtable_visit(struct kvm_pgta= ble_walk_data *data, * into a newly installed or replaced table. */ if (reload) { ctx.old =3D READ_ONCE(*ptep); table =3D kvm_pte_table(ctx.old, level); } =20 if (!kvm_pgtable_walk_continue(data->walker, ret)) return ret; =20 - if (!table) { + if (!table || kvm_pgtable_skip_level(level + 1, ctx.flags)) { data->addr =3D ALIGN_DOWN(data->addr, kvm_granule_size(level)); data->addr +=3D kvm_granule_size(level); goto out; } =20 childp =3D (kvm_pteref_t)kvm_pte_follow(ctx.old, mm_ops); ret =3D __kvm_pgtable_walk(data, mm_ops, childp, level + 1); if (!kvm_pgtable_walk_continue(data->walker, ret)) return ret; =20 - if (ctx.flags & KVM_PGTABLE_WALK_TABLE_POST) +out: + if (table && ctx.flags & KVM_PGTABLE_WALK_TABLE_POST) ret =3D kvm_pgtable_visitor_cb(data, &ctx, KVM_PGTABLE_WALK_TABLE_POST); =20 -out: if (kvm_pgtable_walk_continue(data->walker, ret)) return 0; =20 return ret; } =20 static int __kvm_pgtable_walk(struct kvm_pgtable_walk_data *data, struct kvm_pgtable_mm_ops *mm_ops, kvm_pteref_t pgtable, s8 level) { u32 idx; --=20 2.54.0 From nobody Fri Jun 19 00:40:33 2026 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 4FEA73AE70A for ; Thu, 18 Jun 2026 13:15:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=217.140.110.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781788509; cv=none; b=l70MhN12eFgqn5AB/fJO3GAmfCWVEDp613Wnh6dBwGmst4n+c9QdwB322TohnOsuQGugfBtb2qFEPvjNmL1YYMjsWzyh37j0/bULcFakaZO4dHVWlxiZJ15XZdsq2dAr0a7drM175TS6qX+eqajTDvKEVedFJgQHrHdyFKq9L84= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781788509; c=relaxed/simple; bh=25u6iOGbg9fNy6qgll3Uzb90+VukHpHTe6XSwkGqFSg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=sEj+8IL4FiAR9nJO/cA+P9uBoWnL/bs4JiMZmJA1rq9y+ZkHe22AgsS4jBEHxbP5dNANZo2/MN7xeECARgnBCO14rgznnC/0IdGIi1lLKl9iGwfCfCQ6RLG/vbZOUTgMFI3nwVpiPaFDHPWI/3J38srRqwjx50cQhDjpF5Jc3uY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com; spf=pass smtp.mailfrom=arm.com; dkim=pass (1024-bit key) header.d=arm.com header.i=@arm.com header.b=FyiBBvos; arc=none smtp.client-ip=217.140.110.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=arm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=arm.com header.i=@arm.com header.b="FyiBBvos" Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id C78E02BCD; Thu, 18 Jun 2026 06:15:00 -0700 (PDT) Received: from LeoBrasDK.cambridge.arm.com (LeoBrasDK.cambridge.arm.com [10.2.212.21]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id C328B3F915; Thu, 18 Jun 2026 06:15:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=arm.com; s=foss; t=1781788505; bh=25u6iOGbg9fNy6qgll3Uzb90+VukHpHTe6XSwkGqFSg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=FyiBBvoseEo0De+YmrlHGvcvRb/ht1q2BR+GQCrh3eYOr8IpmmO0Ll9XtkpHhfpQz 24mXB+tnR6pypDksU420wAdSGojwSLvtkoyXPnRY0r1PBry3VYk3HLqo8XRmaHU0B+ jGvTqDPs3CZhX7zQ70VfOv1ZM15xzE84jS4tSiLo= From: Leonardo Bras To: Marc Zyngier , Oliver Upton , Joey Gouly , Steffen Eiden , Suzuki K Poulose , Zenghui Yu , Catalin Marinas , Will Deacon , Fuad Tabba , Leonardo Bras , Raghavendra Rao Ananta Cc: linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev, linux-kernel@vger.kernel.org Subject: [PATCH v2 3/3] KVM: arm64: Make stage2_split_walker() skip unnecessary walks Date: Thu, 18 Jun 2026 14:14:44 +0100 Message-ID: <20260618131447.764085-4-leo.bras@arm.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260618131447.764085-1-leo.bras@arm.com> References: <20260618131447.764085-1-leo.bras@arm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=1659; i=leo.bras@arm.com; h=from:subject; bh=25u6iOGbg9fNy6qgll3Uzb90+VukHpHTe6XSwkGqFSg=; b=owGbwMvMwCX2pizjszvTwvWMp9WSGLKM3/GZzrDIklmk7eecpX8uJoPT6c7EDZPc5125fn7rA /mAK8d2dJSyMIhxMciKKbLIPpq/iuf7lIwjV34sgJnDygQyhIGLUwAmsmguw1+BJau4/qoclnVp SXxts6yw6/nJn3q370gwLPmm9aTv8QEbRobnZdu3P7DT4BH/b7BV70/4zL6wtpbbL6O2Te+4vvT O292sAA== X-Developer-Key: i=leo.bras@arm.com; a=openpgp; fpr=36E6C95AE0F111CC5B6F4D2E688C33F8A0C5B0C5 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Currently, when splitting, all the child and sibling nodes will be walked, with the walker just returning earlier if there is nothing to do. This means all pagetable entries in the splitting range get a callback from the walker function, even if it was a level-3 entry. Optimize splitting by skipping all level-3 entries, as they are already the smallest block size and can't be split any further. (i.e. set flag KVM_PGTABLE_WALK_SKIP_LEVEL3) kvm_mmu_split_huge_pages called in kvm_clear_dirty_log_protect() - manual - 64-page granularity kvm_mmu_split_memory_region() - no manual - all memory Signed-off-by: Leonardo Bras --- arch/arm64/kvm/hyp/pgtable.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/arch/arm64/kvm/hyp/pgtable.c b/arch/arm64/kvm/hyp/pgtable.c index b9a2078efc51..9ae4d9d7ed56 100644 --- a/arch/arm64/kvm/hyp/pgtable.c +++ b/arch/arm64/kvm/hyp/pgtable.c @@ -1565,21 +1565,22 @@ static int stage2_split_walker(const struct kvm_pgt= able_visit_ctx *ctx, new =3D kvm_init_table_pte(childp, mm_ops); stage2_make_pte(ctx, new); return 0; } =20 int kvm_pgtable_stage2_split(struct kvm_pgtable *pgt, u64 addr, u64 size, struct kvm_mmu_memory_cache *mc) { struct kvm_pgtable_walker walker =3D { .cb =3D stage2_split_walker, - .flags =3D KVM_PGTABLE_WALK_LEAF, + .flags =3D KVM_PGTABLE_WALK_LEAF | + KVM_PGTABLE_WALK_SKIP_LEVEL3, .arg =3D mc, }; int ret; =20 ret =3D kvm_pgtable_walk(pgt, addr, size, &walker); dsb(ishst); return ret; } =20 int __kvm_pgtable_stage2_init(struct kvm_pgtable *pgt, struct kvm_s2_mmu *= mmu, --=20 2.54.0