linux_dsm_epyc7002/arch/powerpc/kvm
Nicholas Piggin a5704e83aa KVM: PPC: Book3S HV: Recursively unmap all page table entries when unmapping
When partition scope mappings are unmapped with kvm_unmap_radix, the
pte is cleared, but the page table structure is left in place. If the
next page fault requests a different page table geometry (e.g., due to
THP promotion or split), kvmppc_create_pte is responsible for changing
the page tables.

When a page table entry is to be converted to a large pte, the page
table entry is cleared, the PWC flushed, then the page table it points
to freed. This will cause pte page tables to leak when a 1GB page is
to replace a pud entry points to a pmd table with pte tables under it:
The pmd table will be freed, but its pte tables will be missed.

Fix this by replacing the simple clear and free code with one that
walks down the page tables and frees children. Care must be taken to
clear the root entry being unmapped then flushing the PWC before
freeing any page tables, as explained in comments.

This requires PWC flush to logically become a flush-all-PWC (which it
already is in hardware, but the KVM API needs to be changed to avoid
confusion).

This code also checks that no unexpected pte entries exist in any page
table being freed, and unmaps those and emits a WARN. This is an
expensive operation for the pte page level, but partition scope
changes are rare, so it's unconditional for now to iron out bugs. It
can be put under a CONFIG option or removed after some time.

Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
Signed-off-by: Paul Mackerras <paulus@ozlabs.org>
2018-05-18 15:38:23 +10:00
..
book3s_32_mmu_host.c
book3s_32_mmu.c KVM: PPC: Move nip/ctr/lr/xer registers to pt_regs in kvm_vcpu_arch 2018-05-18 15:38:23 +10:00
book3s_32_sr.S
book3s_64_mmu_host.c
book3s_64_mmu_hv.c KVM: PPC: Book3S HV: Lockless tlbie for HPT hcalls 2018-05-18 15:38:23 +10:00
book3s_64_mmu_radix.c KVM: PPC: Book3S HV: Recursively unmap all page table entries when unmapping 2018-05-18 15:38:23 +10:00
book3s_64_mmu.c KVM: PPC: Book3S PR: Fix WIMG handling under pHyp 2018-01-10 20:45:00 +11:00
book3s_64_slb.S
book3s_64_vio_hv.c KVM: PPC: Add pt_regs into kvm_vcpu_arch and move vcpu->arch.gpr[] into it 2018-05-18 15:38:23 +10:00
book3s_64_vio.c KVM: PPC: Book3S: Change return type to vm_fault_t 2018-05-17 16:41:51 +10:00
book3s_emulate.c
book3s_exports.c
book3s_hv_builtin.c KVM: PPC: Add pt_regs into kvm_vcpu_arch and move vcpu->arch.gpr[] into it 2018-05-18 15:38:23 +10:00
book3s_hv_hmi.c
book3s_hv_interrupts.S KVM: PPC: Book3S HV: Fix inaccurate comment 2018-05-17 16:36:56 +10:00
book3s_hv_ras.c Merge branch 'topic/ppc-kvm' into next 2018-01-21 22:43:43 +11:00
book3s_hv_rm_mmu.c KVM: PPC: Book3S HV: Lockless tlbie for HPT hcalls 2018-05-18 15:38:23 +10:00
book3s_hv_rm_xics.c KVM: PPC: Add pt_regs into kvm_vcpu_arch and move vcpu->arch.gpr[] into it 2018-05-18 15:38:23 +10:00
book3s_hv_rm_xive.c
book3s_hv_rmhandlers.S KVM: PPC: Book 3S HV: Do ptesync in radix guest exit path 2018-05-17 15:17:13 +10:00
book3s_hv_tm_builtin.c KVM: PPC: Move nip/ctr/lr/xer registers to pt_regs in kvm_vcpu_arch 2018-05-18 15:38:23 +10:00
book3s_hv_tm.c KVM: PPC: Move nip/ctr/lr/xer registers to pt_regs in kvm_vcpu_arch 2018-05-18 15:38:23 +10:00
book3s_hv.c KVM: PPC: Move nip/ctr/lr/xer registers to pt_regs in kvm_vcpu_arch 2018-05-18 15:38:23 +10:00
book3s_interrupts.S KVM: PPC: Book3S PR: Fix svcpu copying with preemption enabled 2018-02-01 13:35:33 +11:00
book3s_mmu_hpte.c
book3s_paired_singles.c
book3s_pr_papr.c
book3s_pr.c KVM: PPC: Move nip/ctr/lr/xer registers to pt_regs in kvm_vcpu_arch 2018-05-18 15:38:23 +10:00
book3s_rmhandlers.S
book3s_rtas.c
book3s_segment.S
book3s_xics.c powerpc: Use octal numbers for file permissions 2018-01-22 05:48:33 +11:00
book3s_xics.h
book3s_xive_template.c KVM: PPC: Add pt_regs into kvm_vcpu_arch and move vcpu->arch.gpr[] into it 2018-05-18 15:38:23 +10:00
book3s_xive.c treewide/trivial: Remove ';;$' typo noise 2018-02-22 10:59:33 +01:00
book3s_xive.h KVM: PPC: Book3S HV: Enable use of the new XIVE "single escalation" feature 2018-01-19 12:10:21 +11:00
book3s.c KVM: PPC: Remove unused kvm_unmap_hva callback 2018-03-19 10:08:29 +11:00
book3s.h KVM: PPC: Remove unused kvm_unmap_hva callback 2018-03-19 10:08:29 +11:00
booke_emulate.c KVM: PPC: Move nip/ctr/lr/xer registers to pt_regs in kvm_vcpu_arch 2018-05-18 15:38:23 +10:00
booke_interrupts.S
booke.c KVM: PPC: Move nip/ctr/lr/xer registers to pt_regs in kvm_vcpu_arch 2018-05-18 15:38:23 +10:00
booke.h
bookehv_interrupts.S
e500_emulate.c KVM: PPC: Move nip/ctr/lr/xer registers to pt_regs in kvm_vcpu_arch 2018-05-18 15:38:23 +10:00
e500_mmu_host.c KVM: PPC: Remove unused kvm_unmap_hva callback 2018-03-19 10:08:29 +11:00
e500_mmu_host.h
e500_mmu.c KVM: PPC: Move nip/ctr/lr/xer registers to pt_regs in kvm_vcpu_arch 2018-05-18 15:38:23 +10:00
e500.c
e500.h
e500mc.c
emulate_loadstore.c KVM: PPC: Fix a mmio_host_swabbed uninitialized usage issue 2018-05-18 15:38:23 +10:00
emulate.c powerpc/64s: Remove POWER4 support 2018-04-01 00:47:50 +11:00
fpu.S
irq.h
Kconfig Second PPC KVM update for 4.16 2018-02-09 22:03:06 +01:00
Makefile KVM: PPC: Book3S HV: Work around transactional memory bugs in POWER9 2018-03-24 00:39:13 +11:00
mpic.c
powerpc.c KVM: PPC: Fix a mmio_host_swabbed uninitialized usage issue 2018-05-18 15:38:23 +10:00
timing.c KVM: PPC: Use seq_puts() in kvmppc_exit_timing_show() 2018-01-11 20:36:06 +11:00
timing.h
trace_book3s.h
trace_booke.h
trace_hv.h
trace_pr.h KVM: PPC: Remove unused kvm_unmap_hva callback 2018-03-19 10:08:29 +11:00
trace.h