Skip to content

Commit 331aa3a

Browse files
ouptonMarc Zyngier
authored andcommitted
KVM: arm64: Split init and set for table PTE
Create a helper to initialize a table and directly call smp_store_release() to install it (for now). Prepare for a subsequent change that generalizes PTE writes with a helper. Signed-off-by: Oliver Upton <[email protected]> Signed-off-by: Marc Zyngier <[email protected]> Link: https://lore.kernel.org/r/[email protected]
1 parent ca5de24 commit 331aa3a

File tree

1 file changed

+10
-10
lines changed

1 file changed

+10
-10
lines changed

arch/arm64/kvm/hyp/pgtable.c

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -136,16 +136,13 @@ static void kvm_clear_pte(kvm_pte_t *ptep)
136136
WRITE_ONCE(*ptep, 0);
137137
}
138138

139-
static void kvm_set_table_pte(kvm_pte_t *ptep, kvm_pte_t *childp,
140-
struct kvm_pgtable_mm_ops *mm_ops)
139+
static kvm_pte_t kvm_init_table_pte(kvm_pte_t *childp, struct kvm_pgtable_mm_ops *mm_ops)
141140
{
142-
kvm_pte_t old = *ptep, pte = kvm_phys_to_pte(mm_ops->virt_to_phys(childp));
141+
kvm_pte_t pte = kvm_phys_to_pte(mm_ops->virt_to_phys(childp));
143142

144143
pte |= FIELD_PREP(KVM_PTE_TYPE, KVM_PTE_TYPE_TABLE);
145144
pte |= KVM_PTE_VALID;
146-
147-
WARN_ON(kvm_pte_valid(old));
148-
smp_store_release(ptep, pte);
145+
return pte;
149146
}
150147

151148
static kvm_pte_t kvm_init_valid_leaf_pte(u64 pa, kvm_pte_t attr, u32 level)
@@ -413,7 +410,7 @@ static bool hyp_map_walker_try_leaf(const struct kvm_pgtable_visit_ctx *ctx,
413410
static int hyp_map_walker(const struct kvm_pgtable_visit_ctx *ctx,
414411
enum kvm_pgtable_walk_flags visit)
415412
{
416-
kvm_pte_t *childp;
413+
kvm_pte_t *childp, new;
417414
struct hyp_map_data *data = ctx->arg;
418415
struct kvm_pgtable_mm_ops *mm_ops = ctx->mm_ops;
419416

@@ -427,8 +424,10 @@ static int hyp_map_walker(const struct kvm_pgtable_visit_ctx *ctx,
427424
if (!childp)
428425
return -ENOMEM;
429426

430-
kvm_set_table_pte(ctx->ptep, childp, mm_ops);
427+
new = kvm_init_table_pte(childp, mm_ops);
431428
mm_ops->get_page(ctx->ptep);
429+
smp_store_release(ctx->ptep, new);
430+
432431
return 0;
433432
}
434433

@@ -796,7 +795,7 @@ static int stage2_map_walk_leaf(const struct kvm_pgtable_visit_ctx *ctx,
796795
struct stage2_map_data *data)
797796
{
798797
struct kvm_pgtable_mm_ops *mm_ops = ctx->mm_ops;
799-
kvm_pte_t *childp;
798+
kvm_pte_t *childp, new;
800799
int ret;
801800

802801
ret = stage2_map_walker_try_leaf(ctx, data);
@@ -821,8 +820,9 @@ static int stage2_map_walk_leaf(const struct kvm_pgtable_visit_ctx *ctx,
821820
if (stage2_pte_is_counted(ctx->old))
822821
stage2_put_pte(ctx, data->mmu, mm_ops);
823822

824-
kvm_set_table_pte(ctx->ptep, childp, mm_ops);
823+
new = kvm_init_table_pte(childp, mm_ops);
825824
mm_ops->get_page(ctx->ptep);
825+
smp_store_release(ctx->ptep, new);
826826

827827
return 0;
828828
}

0 commit comments

Comments
 (0)