[RFC PATCH v2 2/8] KVM: arm64: Add KVM_PGTABLE_WALK_HW_DBM for HW DBM support
Shameer Kolothum
shameerali.kolothum.thodi at huawei.com
Fri Aug 25 02:35:22 PDT 2023
KVM_PGTABLE_WALK_HW_DBM - Indicates page table walk is for HW DBM
related updates.
No functional changes here. Only apply any HW DBM bit updates to last
level only. These will be used by a future commit where we will add
support for HW DBM.
Signed-off-by: Shameer Kolothum <shameerali.kolothum.thodi at huawei.com>
---
arch/arm64/include/asm/kvm_pgtable.h | 3 +++
arch/arm64/kvm/hyp/pgtable.c | 10 ++++++++++
2 files changed, 13 insertions(+)
diff --git a/arch/arm64/include/asm/kvm_pgtable.h b/arch/arm64/include/asm/kvm_pgtable.h
index d3e354bb8351..3f96bdd2086f 100644
--- a/arch/arm64/include/asm/kvm_pgtable.h
+++ b/arch/arm64/include/asm/kvm_pgtable.h
@@ -219,6 +219,8 @@ typedef bool (*kvm_pgtable_force_pte_cb_t)(u64 addr, u64 end,
* @KVM_PGTABLE_WALK_SKIP_CMO: Visit and update table entries
* without Cache maintenance
* operations required.
+ * @KVM_PGTABLE_WALK_HW_DBM: Indicates that the attribute update is
+ * HW DBM related.
*/
enum kvm_pgtable_walk_flags {
KVM_PGTABLE_WALK_LEAF = BIT(0),
@@ -228,6 +230,7 @@ enum kvm_pgtable_walk_flags {
KVM_PGTABLE_WALK_HANDLE_FAULT = BIT(4),
KVM_PGTABLE_WALK_SKIP_BBM_TLBI = BIT(5),
KVM_PGTABLE_WALK_SKIP_CMO = BIT(6),
+ KVM_PGTABLE_WALK_HW_DBM = BIT(7),
};
struct kvm_pgtable_visit_ctx {
diff --git a/arch/arm64/kvm/hyp/pgtable.c b/arch/arm64/kvm/hyp/pgtable.c
index f155b8c9e98c..1e65b8c97059 100644
--- a/arch/arm64/kvm/hyp/pgtable.c
+++ b/arch/arm64/kvm/hyp/pgtable.c
@@ -67,6 +67,11 @@ struct kvm_pgtable_walk_data {
const u64 end;
};
+static bool kvm_pgtable_walk_hw_dbm(const struct kvm_pgtable_visit_ctx *ctx)
+{
+ return ctx->flags & KVM_PGTABLE_WALK_HW_DBM;
+}
+
static bool kvm_pgtable_walk_skip_bbm_tlbi(const struct kvm_pgtable_visit_ctx *ctx)
{
return unlikely(ctx->flags & KVM_PGTABLE_WALK_SKIP_BBM_TLBI);
@@ -1164,6 +1169,11 @@ static int stage2_attr_walker(const struct kvm_pgtable_visit_ctx *ctx,
if (!kvm_pte_valid(ctx->old))
return -EAGAIN;
+ /* Only apply HW DBM for last level */
+ if (kvm_pgtable_walk_hw_dbm(ctx) &&
+ ctx->level != (KVM_PGTABLE_MAX_LEVELS - 1))
+ return 0;
+
data->level = ctx->level;
data->pte = pte;
pte &= ~data->attr_clr;
--
2.34.1
More information about the linux-arm-kernel
mailing list