mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 02:32:09 -04:00
kvm: x86: mmu: Recovery of shattered NX large pages
The page table pages corresponding to broken down large pages are zapped in FIFO order, so that the large page can potentially be recovered, if it is not longer being used for execution. This removes the performance penalty for walking deeper EPT page tables. By default, one large page will last about one hour once the guest reaches a steady state. Signed-off-by: Junaid Shahid <[email protected]> Signed-off-by: Paolo Bonzini <[email protected]> Signed-off-by: Thomas Gleixner <[email protected]>
This commit is contained in:
parent
c57c80467f
commit
1aa9b9572b
6 changed files with 182 additions and 0 deletions
|
|
@ -626,6 +626,23 @@ static int kvm_create_vm_debugfs(struct kvm *kvm, int fd)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Called after the VM is otherwise initialized, but just before adding it to
|
||||
* the vm_list.
|
||||
*/
|
||||
int __weak kvm_arch_post_init_vm(struct kvm *kvm)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Called just after removing the VM from the vm_list, but before doing any
|
||||
* other destruction.
|
||||
*/
|
||||
void __weak kvm_arch_pre_destroy_vm(struct kvm *kvm)
|
||||
{
|
||||
}
|
||||
|
||||
static struct kvm *kvm_create_vm(unsigned long type)
|
||||
{
|
||||
struct kvm *kvm = kvm_arch_alloc_vm();
|
||||
|
|
@ -682,6 +699,10 @@ static struct kvm *kvm_create_vm(unsigned long type)
|
|||
goto out_err_no_irq_srcu;
|
||||
|
||||
r = kvm_init_mmu_notifier(kvm);
|
||||
if (r)
|
||||
goto out_err_no_mmu_notifier;
|
||||
|
||||
r = kvm_arch_post_init_vm(kvm);
|
||||
if (r)
|
||||
goto out_err;
|
||||
|
||||
|
|
@ -694,6 +715,11 @@ static struct kvm *kvm_create_vm(unsigned long type)
|
|||
return kvm;
|
||||
|
||||
out_err:
|
||||
#if defined(CONFIG_MMU_NOTIFIER) && defined(KVM_ARCH_WANT_MMU_NOTIFIER)
|
||||
if (kvm->mmu_notifier.ops)
|
||||
mmu_notifier_unregister(&kvm->mmu_notifier, current->mm);
|
||||
#endif
|
||||
out_err_no_mmu_notifier:
|
||||
cleanup_srcu_struct(&kvm->irq_srcu);
|
||||
out_err_no_irq_srcu:
|
||||
cleanup_srcu_struct(&kvm->srcu);
|
||||
|
|
@ -738,6 +764,8 @@ static void kvm_destroy_vm(struct kvm *kvm)
|
|||
mutex_lock(&kvm_lock);
|
||||
list_del(&kvm->vm_list);
|
||||
mutex_unlock(&kvm_lock);
|
||||
kvm_arch_pre_destroy_vm(kvm);
|
||||
|
||||
kvm_free_irq_routing(kvm);
|
||||
for (i = 0; i < KVM_NR_BUSES; i++) {
|
||||
struct kvm_io_bus *bus = kvm_get_bus(kvm, i);
|
||||
|
|
|
|||
Loading…
Reference in a new issue