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 'next' of git://git.kernel.org/pub/scm/virt/kvm/kvm

Pull KVM fixes from Gleb Natapov.

* 'next' of git://git.kernel.org/pub/scm/virt/kvm/kvm:
KVM: kvm_clear_guest_page(): fix empty_zero_page usage
kvm: mmu: delay mmu audit activation
arm/arm64: KVM: Fix hyp mappings of vmalloc regions

+32 -9
+28 -6
arch/arm/kvm/mmu.c
··· 334 334 return err; 335 335 } 336 336 337 + static phys_addr_t kvm_kaddr_to_phys(void *kaddr) 338 + { 339 + if (!is_vmalloc_addr(kaddr)) { 340 + BUG_ON(!virt_addr_valid(kaddr)); 341 + return __pa(kaddr); 342 + } else { 343 + return page_to_phys(vmalloc_to_page(kaddr)) + 344 + offset_in_page(kaddr); 345 + } 346 + } 347 + 337 348 /** 338 349 * create_hyp_mappings - duplicate a kernel virtual address range in Hyp mode 339 350 * @from: The virtual kernel start address of the range ··· 356 345 */ 357 346 int create_hyp_mappings(void *from, void *to) 358 347 { 359 - unsigned long phys_addr = virt_to_phys(from); 348 + phys_addr_t phys_addr; 349 + unsigned long virt_addr; 360 350 unsigned long start = KERN_TO_HYP((unsigned long)from); 361 351 unsigned long end = KERN_TO_HYP((unsigned long)to); 362 352 363 - /* Check for a valid kernel memory mapping */ 364 - if (!virt_addr_valid(from) || !virt_addr_valid(to - 1)) 365 - return -EINVAL; 353 + start = start & PAGE_MASK; 354 + end = PAGE_ALIGN(end); 366 355 367 - return __create_hyp_mappings(hyp_pgd, start, end, 368 - __phys_to_pfn(phys_addr), PAGE_HYP); 356 + for (virt_addr = start; virt_addr < end; virt_addr += PAGE_SIZE) { 357 + int err; 358 + 359 + phys_addr = kvm_kaddr_to_phys(from + virt_addr - start); 360 + err = __create_hyp_mappings(hyp_pgd, virt_addr, 361 + virt_addr + PAGE_SIZE, 362 + __phys_to_pfn(phys_addr), 363 + PAGE_HYP); 364 + if (err) 365 + return err; 366 + } 367 + 368 + return 0; 369 369 } 370 370 371 371 /**
+1 -1
arch/x86/kvm/mmu_audit.c
··· 296 296 .get = param_get_bool, 297 297 }; 298 298 299 - module_param_cb(mmu_audit, &audit_param_ops, &mmu_audit, 0644); 299 + arch_param_cb(mmu_audit, &audit_param_ops, &mmu_audit, 0644);
+3 -2
virt/kvm/kvm_main.c
··· 1615 1615 1616 1616 int kvm_clear_guest_page(struct kvm *kvm, gfn_t gfn, int offset, int len) 1617 1617 { 1618 - return kvm_write_guest_page(kvm, gfn, (const void *) empty_zero_page, 1619 - offset, len); 1618 + const void *zero_page = (const void *) __va(page_to_phys(ZERO_PAGE(0))); 1619 + 1620 + return kvm_write_guest_page(kvm, gfn, zero_page, offset, len); 1620 1621 } 1621 1622 EXPORT_SYMBOL_GPL(kvm_clear_guest_page); 1622 1623