Skip to content

Commit e615725

Browse files
committed
Revert "KVM: arm64: Split kvm_pgtable_stage2_destroy()"
This reverts commit 0e89ca1. The functional change that depended on this refactoring has been found to be quite problematic. Reverting the whole pile to start fresh when new fixes are available. Message-ID: <[email protected]> Signed-off-by: Oliver Upton <[email protected]>
1 parent fc670ad commit e615725

File tree

5 files changed

+9
-73
lines changed

5 files changed

+9
-73
lines changed

arch/arm64/include/asm/kvm_pgtable.h

Lines changed: 0 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -355,11 +355,6 @@ static inline kvm_pte_t *kvm_dereference_pteref(struct kvm_pgtable_walker *walke
355355
return pteref;
356356
}
357357

358-
static inline kvm_pte_t *kvm_dereference_pteref_raw(kvm_pteref_t pteref)
359-
{
360-
return pteref;
361-
}
362-
363358
static inline int kvm_pgtable_walk_begin(struct kvm_pgtable_walker *walker)
364359
{
365360
/*
@@ -389,11 +384,6 @@ static inline kvm_pte_t *kvm_dereference_pteref(struct kvm_pgtable_walker *walke
389384
return rcu_dereference_check(pteref, !(walker->flags & KVM_PGTABLE_WALK_SHARED));
390385
}
391386

392-
static inline kvm_pte_t *kvm_dereference_pteref_raw(kvm_pteref_t pteref)
393-
{
394-
return rcu_dereference_raw(pteref);
395-
}
396-
397387
static inline int kvm_pgtable_walk_begin(struct kvm_pgtable_walker *walker)
398388
{
399389
if (walker->flags & KVM_PGTABLE_WALK_SHARED)
@@ -561,26 +551,6 @@ static inline int kvm_pgtable_stage2_init(struct kvm_pgtable *pgt, struct kvm_s2
561551
*/
562552
void kvm_pgtable_stage2_destroy(struct kvm_pgtable *pgt);
563553

564-
/**
565-
* kvm_pgtable_stage2_destroy_range() - Destroy the unlinked range of addresses.
566-
* @pgt: Page-table structure initialised by kvm_pgtable_stage2_init*().
567-
* @addr: Intermediate physical address at which to place the mapping.
568-
* @size: Size of the mapping.
569-
*
570-
* The page-table is assumed to be unreachable by any hardware walkers prior
571-
* to freeing and therefore no TLB invalidation is performed.
572-
*/
573-
void kvm_pgtable_stage2_destroy_range(struct kvm_pgtable *pgt,
574-
u64 addr, u64 size);
575-
576-
/**
577-
* kvm_pgtable_stage2_destroy_pgd() - Destroy the PGD of guest stage-2 page-table.
578-
* @pgt: Page-table structure initialised by kvm_pgtable_stage2_init*().
579-
*
580-
* It is assumed that the rest of the page-table is freed before this operation.
581-
*/
582-
void kvm_pgtable_stage2_destroy_pgd(struct kvm_pgtable *pgt);
583-
584554
/**
585555
* kvm_pgtable_stage2_free_unlinked() - Free an unlinked stage-2 paging structure.
586556
* @mm_ops: Memory management callbacks.

arch/arm64/include/asm/kvm_pkvm.h

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -179,9 +179,7 @@ struct pkvm_mapping {
179179

180180
int pkvm_pgtable_stage2_init(struct kvm_pgtable *pgt, struct kvm_s2_mmu *mmu,
181181
struct kvm_pgtable_mm_ops *mm_ops);
182-
void pkvm_pgtable_stage2_destroy_range(struct kvm_pgtable *pgt,
183-
u64 addr, u64 size);
184-
void pkvm_pgtable_stage2_destroy_pgd(struct kvm_pgtable *pgt);
182+
void pkvm_pgtable_stage2_destroy(struct kvm_pgtable *pgt);
185183
int pkvm_pgtable_stage2_map(struct kvm_pgtable *pgt, u64 addr, u64 size, u64 phys,
186184
enum kvm_pgtable_prot prot, void *mc,
187185
enum kvm_pgtable_walk_flags flags);

arch/arm64/kvm/hyp/pgtable.c

Lines changed: 4 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1551,38 +1551,21 @@ static int stage2_free_walker(const struct kvm_pgtable_visit_ctx *ctx,
15511551
return 0;
15521552
}
15531553

1554-
void kvm_pgtable_stage2_destroy_range(struct kvm_pgtable *pgt,
1555-
u64 addr, u64 size)
1554+
void kvm_pgtable_stage2_destroy(struct kvm_pgtable *pgt)
15561555
{
1556+
size_t pgd_sz;
15571557
struct kvm_pgtable_walker walker = {
15581558
.cb = stage2_free_walker,
15591559
.flags = KVM_PGTABLE_WALK_LEAF |
15601560
KVM_PGTABLE_WALK_TABLE_POST,
15611561
};
15621562

1563-
WARN_ON(kvm_pgtable_walk(pgt, addr, size, &walker));
1564-
}
1565-
1566-
void kvm_pgtable_stage2_destroy_pgd(struct kvm_pgtable *pgt)
1567-
{
1568-
size_t pgd_sz;
1569-
1563+
WARN_ON(kvm_pgtable_walk(pgt, 0, BIT(pgt->ia_bits), &walker));
15701564
pgd_sz = kvm_pgd_pages(pgt->ia_bits, pgt->start_level) * PAGE_SIZE;
1571-
1572-
/*
1573-
* Since the pgtable is unlinked at this point, and not shared with
1574-
* other walkers, safely deference pgd with kvm_dereference_pteref_raw()
1575-
*/
1576-
pgt->mm_ops->free_pages_exact(kvm_dereference_pteref_raw(pgt->pgd), pgd_sz);
1565+
pgt->mm_ops->free_pages_exact(kvm_dereference_pteref(&walker, pgt->pgd), pgd_sz);
15771566
pgt->pgd = NULL;
15781567
}
15791568

1580-
void kvm_pgtable_stage2_destroy(struct kvm_pgtable *pgt)
1581-
{
1582-
kvm_pgtable_stage2_destroy_range(pgt, 0, BIT(pgt->ia_bits));
1583-
kvm_pgtable_stage2_destroy_pgd(pgt);
1584-
}
1585-
15861569
void kvm_pgtable_stage2_free_unlinked(struct kvm_pgtable_mm_ops *mm_ops, void *pgtable, s8 level)
15871570
{
15881571
kvm_pteref_t ptep = (kvm_pteref_t)pgtable;

arch/arm64/kvm/mmu.c

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -904,14 +904,6 @@ static int kvm_init_ipa_range(struct kvm_s2_mmu *mmu, unsigned long type)
904904
return 0;
905905
}
906906

907-
static void kvm_stage2_destroy(struct kvm_pgtable *pgt)
908-
{
909-
unsigned int ia_bits = VTCR_EL2_IPA(pgt->mmu->vtcr);
910-
911-
KVM_PGT_FN(kvm_pgtable_stage2_destroy_range)(pgt, 0, BIT(ia_bits));
912-
KVM_PGT_FN(kvm_pgtable_stage2_destroy_pgd)(pgt);
913-
}
914-
915907
/**
916908
* kvm_init_stage2_mmu - Initialise a S2 MMU structure
917909
* @kvm: The pointer to the KVM structure
@@ -988,7 +980,7 @@ int kvm_init_stage2_mmu(struct kvm *kvm, struct kvm_s2_mmu *mmu, unsigned long t
988980
return 0;
989981

990982
out_destroy_pgtable:
991-
kvm_stage2_destroy(pgt);
983+
KVM_PGT_FN(kvm_pgtable_stage2_destroy)(pgt);
992984
out_free_pgtable:
993985
kfree(pgt);
994986
return err;
@@ -1089,7 +1081,7 @@ void kvm_free_stage2_pgd(struct kvm_s2_mmu *mmu)
10891081
write_unlock(&kvm->mmu_lock);
10901082

10911083
if (pgt) {
1092-
kvm_stage2_destroy(pgt);
1084+
KVM_PGT_FN(kvm_pgtable_stage2_destroy)(pgt);
10931085
kfree(pgt);
10941086
}
10951087
}

arch/arm64/kvm/pkvm.c

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -316,16 +316,9 @@ static int __pkvm_pgtable_stage2_unmap(struct kvm_pgtable *pgt, u64 start, u64 e
316316
return 0;
317317
}
318318

319-
void pkvm_pgtable_stage2_destroy_range(struct kvm_pgtable *pgt,
320-
u64 addr, u64 size)
319+
void pkvm_pgtable_stage2_destroy(struct kvm_pgtable *pgt)
321320
{
322-
__pkvm_pgtable_stage2_unmap(pgt, addr, addr + size);
323-
}
324-
325-
void pkvm_pgtable_stage2_destroy_pgd(struct kvm_pgtable *pgt)
326-
{
327-
/* Expected to be called after all pKVM mappings have been released. */
328-
WARN_ON_ONCE(!RB_EMPTY_ROOT(&pgt->pkvm_mappings.rb_root));
321+
__pkvm_pgtable_stage2_unmap(pgt, 0, ~(0ULL));
329322
}
330323

331324
int pkvm_pgtable_stage2_map(struct kvm_pgtable *pgt, u64 addr, u64 size,

0 commit comments

Comments
 (0)