Skip to content

Commit a5fad1e

Browse files
npigginpaulusmack
authored andcommitted
KVM: PPC: Book3S HV: Use a helper to unmap ptes in the radix fault path
Signed-off-by: Nicholas Piggin <[email protected]> Signed-off-by: Paul Mackerras <[email protected]>
1 parent b755745 commit a5fad1e

File tree

1 file changed

+23
-23
lines changed

1 file changed

+23
-23
lines changed

arch/powerpc/kvm/book3s_64_mmu_radix.c

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -228,14 +228,32 @@ static void kvmppc_pmd_free(pmd_t *pmdp)
228228
kmem_cache_free(kvm_pmd_cache, pmdp);
229229
}
230230

231+
static void kvmppc_unmap_pte(struct kvm *kvm, pte_t *pte,
232+
unsigned long gpa, unsigned int shift)
233+
234+
{
235+
unsigned long page_size = 1ul << shift;
236+
unsigned long old;
237+
238+
old = kvmppc_radix_update_pte(kvm, pte, ~0UL, 0, gpa, shift);
239+
kvmppc_radix_tlbie_page(kvm, gpa, shift);
240+
if (old & _PAGE_DIRTY) {
241+
unsigned long gfn = gpa >> PAGE_SHIFT;
242+
struct kvm_memory_slot *memslot;
243+
244+
memslot = gfn_to_memslot(kvm, gfn);
245+
if (memslot && memslot->dirty_bitmap)
246+
kvmppc_update_dirty_map(memslot, gfn, page_size);
247+
}
248+
}
249+
231250
static int kvmppc_create_pte(struct kvm *kvm, pte_t pte, unsigned long gpa,
232251
unsigned int level, unsigned long mmu_seq)
233252
{
234253
pgd_t *pgd;
235254
pud_t *pud, *new_pud = NULL;
236255
pmd_t *pmd, *new_pmd = NULL;
237256
pte_t *ptep, *new_ptep = NULL;
238-
unsigned long old;
239257
int ret;
240258

241259
/* Traverse the guest's 2nd-level tree, allocate new levels needed */
@@ -287,17 +305,7 @@ static int kvmppc_create_pte(struct kvm *kvm, pte_t pte, unsigned long gpa,
287305
goto out_unlock;
288306
}
289307
/* Valid 1GB page here already, remove it */
290-
old = kvmppc_radix_update_pte(kvm, (pte_t *)pud,
291-
~0UL, 0, hgpa, PUD_SHIFT);
292-
kvmppc_radix_tlbie_page(kvm, hgpa, PUD_SHIFT);
293-
if (old & _PAGE_DIRTY) {
294-
unsigned long gfn = hgpa >> PAGE_SHIFT;
295-
struct kvm_memory_slot *memslot;
296-
memslot = gfn_to_memslot(kvm, gfn);
297-
if (memslot && memslot->dirty_bitmap)
298-
kvmppc_update_dirty_map(memslot,
299-
gfn, PUD_SIZE);
300-
}
308+
kvmppc_unmap_pte(kvm, (pte_t *)pud, hgpa, PUD_SHIFT);
301309
}
302310
if (level == 2) {
303311
if (!pud_none(*pud)) {
@@ -338,17 +346,7 @@ static int kvmppc_create_pte(struct kvm *kvm, pte_t pte, unsigned long gpa,
338346
goto out_unlock;
339347
}
340348
/* Valid 2MB page here already, remove it */
341-
old = kvmppc_radix_update_pte(kvm, pmdp_ptep(pmd),
342-
~0UL, 0, lgpa, PMD_SHIFT);
343-
kvmppc_radix_tlbie_page(kvm, lgpa, PMD_SHIFT);
344-
if (old & _PAGE_DIRTY) {
345-
unsigned long gfn = lgpa >> PAGE_SHIFT;
346-
struct kvm_memory_slot *memslot;
347-
memslot = gfn_to_memslot(kvm, gfn);
348-
if (memslot && memslot->dirty_bitmap)
349-
kvmppc_update_dirty_map(memslot,
350-
gfn, PMD_SIZE);
351-
}
349+
kvmppc_unmap_pte(kvm, pmdp_ptep(pmd), lgpa, PMD_SHIFT);
352350
}
353351
if (level == 1) {
354352
if (!pmd_none(*pmd)) {
@@ -373,6 +371,8 @@ static int kvmppc_create_pte(struct kvm *kvm, pte_t pte, unsigned long gpa,
373371
}
374372
ptep = pte_offset_kernel(pmd, gpa);
375373
if (pte_present(*ptep)) {
374+
unsigned long old;
375+
376376
/* Check if someone else set the same thing */
377377
if (pte_raw(*ptep) == pte_raw(pte)) {
378378
ret = 0;

0 commit comments

Comments
 (0)