Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/avi/kvm

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/avi/kvm:
KVM: MMU: Fix memory leak on guest demand faults
KVM: VMX: convert init_rmode_tss() to slots_lock
KVM: MMU: handle page removal with shadow mapping
KVM: MMU: Fix is_rmap_pte() with io ptes
KVM: VMX: Restore tss even on x86_64

+16 -9
+14 -4
arch/x86/kvm/mmu.c
··· 222 222 223 223 static int is_rmap_pte(u64 pte) 224 224 { 225 - return pte != shadow_trap_nonpresent_pte 226 - && pte != shadow_notrap_nonpresent_pte; 225 + return is_shadow_present_pte(pte); 227 226 } 228 227 229 228 static gfn_t pse36_gfn_delta(u32 gpte) ··· 892 893 int *ptwrite, gfn_t gfn, struct page *page) 893 894 { 894 895 u64 spte; 895 - int was_rmapped = is_rmap_pte(*shadow_pte); 896 + int was_rmapped = 0; 896 897 int was_writeble = is_writeble_pte(*shadow_pte); 898 + hfn_t host_pfn = (*shadow_pte & PT64_BASE_ADDR_MASK) >> PAGE_SHIFT; 897 899 898 900 pgprintk("%s: spte %llx access %x write_fault %d" 899 901 " user_fault %d gfn %lx\n", 900 902 __FUNCTION__, *shadow_pte, pt_access, 901 903 write_fault, user_fault, gfn); 904 + 905 + if (is_rmap_pte(*shadow_pte)) { 906 + if (host_pfn != page_to_pfn(page)) { 907 + pgprintk("hfn old %lx new %lx\n", 908 + host_pfn, page_to_pfn(page)); 909 + rmap_remove(vcpu->kvm, shadow_pte); 910 + } 911 + else 912 + was_rmapped = 1; 913 + } 902 914 903 915 /* 904 916 * We don't set the accessed bit, since we sometimes want to see ··· 1412 1402 up_read(&current->mm->mmap_sem); 1413 1403 1414 1404 vcpu->arch.update_pte.gfn = gfn; 1415 - vcpu->arch.update_pte.page = gfn_to_page(vcpu->kvm, gfn); 1405 + vcpu->arch.update_pte.page = page; 1416 1406 } 1417 1407 1418 1408 void kvm_mmu_pte_write(struct kvm_vcpu *vcpu, gpa_t gpa,
+2 -5
arch/x86/kvm/vmx.c
··· 349 349 350 350 static void reload_tss(void) 351 351 { 352 - #ifndef CONFIG_X86_64 353 - 354 352 /* 355 353 * VT restores TR but not its size. Useless. 356 354 */ ··· 359 361 descs = (void *)gdt.base; 360 362 descs[GDT_ENTRY_TSS].type = 9; /* available TSS */ 361 363 load_TR_desc(); 362 - #endif 363 364 } 364 365 365 366 static void load_transition_efer(struct vcpu_vmx *vmx) ··· 1433 1436 int ret = 0; 1434 1437 int r; 1435 1438 1436 - down_read(&current->mm->mmap_sem); 1439 + down_read(&kvm->slots_lock); 1437 1440 r = kvm_clear_guest_page(kvm, fn, 0, PAGE_SIZE); 1438 1441 if (r < 0) 1439 1442 goto out; ··· 1456 1459 1457 1460 ret = 1; 1458 1461 out: 1459 - up_read(&current->mm->mmap_sem); 1462 + up_read(&kvm->slots_lock); 1460 1463 return ret; 1461 1464 } 1462 1465