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

KVM: ia64: Make pmt table be able to hold physical mmio entries.

Don't try to do put_page once the entries are mmio.
Set the tag to indicate the mmio space for vmm setting
TLB's memory attribute.

Signed-off-by: Xiantao Zhang <xiantao.zhang@intel.com>
Signed-off-by: Avi Kivity <avi@qumranet.com>

authored by

Xiantao Zhang and committed by
Avi Kivity
1cbea809 2f749771

+13 -6
+13 -6
arch/ia64/kvm/kvm-ia64.c
··· 1437 1437 int user_alloc) 1438 1438 { 1439 1439 unsigned long i; 1440 - struct page *page; 1440 + unsigned long pfn; 1441 1441 int npages = mem->memory_size >> PAGE_SHIFT; 1442 1442 struct kvm_memory_slot *memslot = &kvm->memslots[mem->slot]; 1443 1443 unsigned long base_gfn = memslot->base_gfn; 1444 1444 1445 1445 for (i = 0; i < npages; i++) { 1446 - page = gfn_to_page(kvm, base_gfn + i); 1447 - kvm_set_pmt_entry(kvm, base_gfn + i, 1448 - page_to_pfn(page) << PAGE_SHIFT, 1449 - _PAGE_AR_RWX|_PAGE_MA_WB); 1450 - memslot->rmap[i] = (unsigned long)page; 1446 + pfn = gfn_to_pfn(kvm, base_gfn + i); 1447 + if (!kvm_is_mmio_pfn(pfn)) { 1448 + kvm_set_pmt_entry(kvm, base_gfn + i, 1449 + pfn << PAGE_SHIFT, 1450 + _PAGE_MA_WB); 1451 + memslot->rmap[i] = (unsigned long)pfn_to_page(pfn); 1452 + } else { 1453 + kvm_set_pmt_entry(kvm, base_gfn + i, 1454 + GPFN_LOW_MMIO | (pfn << PAGE_SHIFT), 1455 + _PAGE_MA_UC); 1456 + memslot->rmap[i] = 0; 1457 + } 1451 1458 } 1452 1459 1453 1460 return 0;