Commit ba049e93 authored by Dan Williams's avatar Dan Williams Committed by Linus Torvalds

kvm: rename pfn_t to kvm_pfn_t

To date, we have implemented two I/O usage models for persistent memory,
PMEM (a persistent "ram disk") and DAX (mmap persistent memory into
userspace).  This series adds a third, DAX-GUP, that allows DAX mappings
to be the target of direct-i/o.  It allows userspace to coordinate
DMA/RDMA from/to persistent memory.

The implementation leverages the ZONE_DEVICE mm-zone that went into
4.3-rc1 (also discussed at kernel summit) to flag pages that are owned
and dynamically mapped by a device driver.  The pmem driver, after
mapping a persistent memory range into the system memmap via
devm_memremap_pages(), arranges for DAX to distinguish pfn-only versus
page-backed pmem-pfns via flags in the new pfn_t type.

The DAX code, upon seeing a PFN_DEV+PFN_MAP flagged pfn, flags the
resulting pte(s) inserted into the process page tables with a new
_PAGE_DEVMAP flag.  Later, when get_user_pages() is walking ptes it keys
off _PAGE_DEVMAP to pin the device hosting the page range active.
Finally, get_page() and put_page() are modified to take references
against the device driver established page mapping.

Finally, this need for "struct page" for persistent memory requires
memory capacity to store the memmap array.  Given the memmap array for a
large pool of persistent may exhaust available DRAM introduce a
mechanism to allocate the memmap from persistent memory.  The new
"struct vmem_altmap *" parameter to devm_memremap_pages() enables
arch_add_memory() to use reserved pmem capacity rather than the page
allocator.

This patch (of 18):

The core has developed a need for a "pfn_t" type [1].  Move the existing
pfn_t in KVM to kvm_pfn_t [2].

[1]: https://lists.01.org/pipermail/linux-nvdimm/2015-September/002199.html
[2]: https://lists.01.org/pipermail/linux-nvdimm/2015-September/002218.htmlSigned-off-by: default avatarDan Williams <dan.j.williams@intel.com>
Acked-by: default avatarChristoffer Dall <christoffer.dall@linaro.org>
Cc: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 16da3068
...@@ -182,7 +182,8 @@ static inline bool vcpu_has_cache_enabled(struct kvm_vcpu *vcpu) ...@@ -182,7 +182,8 @@ static inline bool vcpu_has_cache_enabled(struct kvm_vcpu *vcpu)
return (vcpu->arch.cp15[c1_SCTLR] & 0b101) == 0b101; return (vcpu->arch.cp15[c1_SCTLR] & 0b101) == 0b101;
} }
static inline void __coherent_cache_guest_page(struct kvm_vcpu *vcpu, pfn_t pfn, static inline void __coherent_cache_guest_page(struct kvm_vcpu *vcpu,
kvm_pfn_t pfn,
unsigned long size, unsigned long size,
bool ipa_uncached) bool ipa_uncached)
{ {
...@@ -246,7 +247,7 @@ static inline void __kvm_flush_dcache_pte(pte_t pte) ...@@ -246,7 +247,7 @@ static inline void __kvm_flush_dcache_pte(pte_t pte)
static inline void __kvm_flush_dcache_pmd(pmd_t pmd) static inline void __kvm_flush_dcache_pmd(pmd_t pmd)
{ {
unsigned long size = PMD_SIZE; unsigned long size = PMD_SIZE;
pfn_t pfn = pmd_pfn(pmd); kvm_pfn_t pfn = pmd_pfn(pmd);
while (size) { while (size) {
void *va = kmap_atomic_pfn(pfn); void *va = kmap_atomic_pfn(pfn);
......
...@@ -992,9 +992,9 @@ int kvm_phys_addr_ioremap(struct kvm *kvm, phys_addr_t guest_ipa, ...@@ -992,9 +992,9 @@ int kvm_phys_addr_ioremap(struct kvm *kvm, phys_addr_t guest_ipa,
return ret; return ret;
} }
static bool transparent_hugepage_adjust(pfn_t *pfnp, phys_addr_t *ipap) static bool transparent_hugepage_adjust(kvm_pfn_t *pfnp, phys_addr_t *ipap)
{ {
pfn_t pfn = *pfnp; kvm_pfn_t pfn = *pfnp;
gfn_t gfn = *ipap >> PAGE_SHIFT; gfn_t gfn = *ipap >> PAGE_SHIFT;
if (PageTransCompound(pfn_to_page(pfn))) { if (PageTransCompound(pfn_to_page(pfn))) {
...@@ -1201,7 +1201,7 @@ void kvm_arch_mmu_enable_log_dirty_pt_masked(struct kvm *kvm, ...@@ -1201,7 +1201,7 @@ void kvm_arch_mmu_enable_log_dirty_pt_masked(struct kvm *kvm,
kvm_mmu_write_protect_pt_masked(kvm, slot, gfn_offset, mask); kvm_mmu_write_protect_pt_masked(kvm, slot, gfn_offset, mask);
} }
static void coherent_cache_guest_page(struct kvm_vcpu *vcpu, pfn_t pfn, static void coherent_cache_guest_page(struct kvm_vcpu *vcpu, kvm_pfn_t pfn,
unsigned long size, bool uncached) unsigned long size, bool uncached)
{ {
__coherent_cache_guest_page(vcpu, pfn, size, uncached); __coherent_cache_guest_page(vcpu, pfn, size, uncached);
...@@ -1218,7 +1218,7 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa, ...@@ -1218,7 +1218,7 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa,
struct kvm *kvm = vcpu->kvm; struct kvm *kvm = vcpu->kvm;
struct kvm_mmu_memory_cache *memcache = &vcpu->arch.mmu_page_cache; struct kvm_mmu_memory_cache *memcache = &vcpu->arch.mmu_page_cache;
struct vm_area_struct *vma; struct vm_area_struct *vma;
pfn_t pfn; kvm_pfn_t pfn;
pgprot_t mem_type = PAGE_S2; pgprot_t mem_type = PAGE_S2;
bool fault_ipa_uncached; bool fault_ipa_uncached;
bool logging_active = memslot_is_logging(memslot); bool logging_active = memslot_is_logging(memslot);
...@@ -1346,7 +1346,7 @@ static void handle_access_fault(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa) ...@@ -1346,7 +1346,7 @@ static void handle_access_fault(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa)
{ {
pmd_t *pmd; pmd_t *pmd;
pte_t *pte; pte_t *pte;
pfn_t pfn; kvm_pfn_t pfn;
bool pfn_valid = false; bool pfn_valid = false;
trace_kvm_access_fault(fault_ipa); trace_kvm_access_fault(fault_ipa);
......
...@@ -230,7 +230,8 @@ static inline bool vcpu_has_cache_enabled(struct kvm_vcpu *vcpu) ...@@ -230,7 +230,8 @@ static inline bool vcpu_has_cache_enabled(struct kvm_vcpu *vcpu)
return (vcpu_sys_reg(vcpu, SCTLR_EL1) & 0b101) == 0b101; return (vcpu_sys_reg(vcpu, SCTLR_EL1) & 0b101) == 0b101;
} }
static inline void __coherent_cache_guest_page(struct kvm_vcpu *vcpu, pfn_t pfn, static inline void __coherent_cache_guest_page(struct kvm_vcpu *vcpu,
kvm_pfn_t pfn,
unsigned long size, unsigned long size,
bool ipa_uncached) bool ipa_uncached)
{ {
......
...@@ -101,9 +101,9 @@ ...@@ -101,9 +101,9 @@
#define CAUSEF_DC (_ULCAST_(1) << 27) #define CAUSEF_DC (_ULCAST_(1) << 27)
extern atomic_t kvm_mips_instance; extern atomic_t kvm_mips_instance;
extern pfn_t(*kvm_mips_gfn_to_pfn) (struct kvm *kvm, gfn_t gfn); extern kvm_pfn_t (*kvm_mips_gfn_to_pfn)(struct kvm *kvm, gfn_t gfn);
extern void (*kvm_mips_release_pfn_clean) (pfn_t pfn); extern void (*kvm_mips_release_pfn_clean)(kvm_pfn_t pfn);
extern bool(*kvm_mips_is_error_pfn) (pfn_t pfn); extern bool (*kvm_mips_is_error_pfn)(kvm_pfn_t pfn);
struct kvm_vm_stat { struct kvm_vm_stat {
u32 remote_tlb_flush; u32 remote_tlb_flush;
......
...@@ -1525,7 +1525,7 @@ int kvm_mips_sync_icache(unsigned long va, struct kvm_vcpu *vcpu) ...@@ -1525,7 +1525,7 @@ int kvm_mips_sync_icache(unsigned long va, struct kvm_vcpu *vcpu)
struct kvm *kvm = vcpu->kvm; struct kvm *kvm = vcpu->kvm;
unsigned long pa; unsigned long pa;
gfn_t gfn; gfn_t gfn;
pfn_t pfn; kvm_pfn_t pfn;
gfn = va >> PAGE_SHIFT; gfn = va >> PAGE_SHIFT;
......
...@@ -38,13 +38,13 @@ atomic_t kvm_mips_instance; ...@@ -38,13 +38,13 @@ atomic_t kvm_mips_instance;
EXPORT_SYMBOL(kvm_mips_instance); EXPORT_SYMBOL(kvm_mips_instance);
/* These function pointers are initialized once the KVM module is loaded */ /* These function pointers are initialized once the KVM module is loaded */
pfn_t (*kvm_mips_gfn_to_pfn)(struct kvm *kvm, gfn_t gfn); kvm_pfn_t (*kvm_mips_gfn_to_pfn)(struct kvm *kvm, gfn_t gfn);
EXPORT_SYMBOL(kvm_mips_gfn_to_pfn); EXPORT_SYMBOL(kvm_mips_gfn_to_pfn);
void (*kvm_mips_release_pfn_clean)(pfn_t pfn); void (*kvm_mips_release_pfn_clean)(kvm_pfn_t pfn);
EXPORT_SYMBOL(kvm_mips_release_pfn_clean); EXPORT_SYMBOL(kvm_mips_release_pfn_clean);
bool (*kvm_mips_is_error_pfn)(pfn_t pfn); bool (*kvm_mips_is_error_pfn)(kvm_pfn_t pfn);
EXPORT_SYMBOL(kvm_mips_is_error_pfn); EXPORT_SYMBOL(kvm_mips_is_error_pfn);
uint32_t kvm_mips_get_kernel_asid(struct kvm_vcpu *vcpu) uint32_t kvm_mips_get_kernel_asid(struct kvm_vcpu *vcpu)
...@@ -144,7 +144,7 @@ EXPORT_SYMBOL(kvm_mips_dump_guest_tlbs); ...@@ -144,7 +144,7 @@ EXPORT_SYMBOL(kvm_mips_dump_guest_tlbs);
static int kvm_mips_map_page(struct kvm *kvm, gfn_t gfn) static int kvm_mips_map_page(struct kvm *kvm, gfn_t gfn)
{ {
int srcu_idx, err = 0; int srcu_idx, err = 0;
pfn_t pfn; kvm_pfn_t pfn;
if (kvm->arch.guest_pmap[gfn] != KVM_INVALID_PAGE) if (kvm->arch.guest_pmap[gfn] != KVM_INVALID_PAGE)
return 0; return 0;
...@@ -262,7 +262,7 @@ int kvm_mips_handle_kseg0_tlb_fault(unsigned long badvaddr, ...@@ -262,7 +262,7 @@ int kvm_mips_handle_kseg0_tlb_fault(unsigned long badvaddr,
struct kvm_vcpu *vcpu) struct kvm_vcpu *vcpu)
{ {
gfn_t gfn; gfn_t gfn;
pfn_t pfn0, pfn1; kvm_pfn_t pfn0, pfn1;
unsigned long vaddr = 0; unsigned long vaddr = 0;
unsigned long entryhi = 0, entrylo0 = 0, entrylo1 = 0; unsigned long entryhi = 0, entrylo0 = 0, entrylo1 = 0;
int even; int even;
...@@ -313,7 +313,7 @@ EXPORT_SYMBOL(kvm_mips_handle_kseg0_tlb_fault); ...@@ -313,7 +313,7 @@ EXPORT_SYMBOL(kvm_mips_handle_kseg0_tlb_fault);
int kvm_mips_handle_commpage_tlb_fault(unsigned long badvaddr, int kvm_mips_handle_commpage_tlb_fault(unsigned long badvaddr,
struct kvm_vcpu *vcpu) struct kvm_vcpu *vcpu)
{ {
pfn_t pfn0, pfn1; kvm_pfn_t pfn0, pfn1;
unsigned long flags, old_entryhi = 0, vaddr = 0; unsigned long flags, old_entryhi = 0, vaddr = 0;
unsigned long entrylo0 = 0, entrylo1 = 0; unsigned long entrylo0 = 0, entrylo1 = 0;
...@@ -360,7 +360,7 @@ int kvm_mips_handle_mapped_seg_tlb_fault(struct kvm_vcpu *vcpu, ...@@ -360,7 +360,7 @@ int kvm_mips_handle_mapped_seg_tlb_fault(struct kvm_vcpu *vcpu,
{ {
unsigned long entryhi = 0, entrylo0 = 0, entrylo1 = 0; unsigned long entryhi = 0, entrylo0 = 0, entrylo1 = 0;
struct kvm *kvm = vcpu->kvm; struct kvm *kvm = vcpu->kvm;
pfn_t pfn0, pfn1; kvm_pfn_t pfn0, pfn1;
if ((tlb->tlb_hi & VPN2_MASK) == 0) { if ((tlb->tlb_hi & VPN2_MASK) == 0) {
pfn0 = 0; pfn0 = 0;
......
...@@ -154,8 +154,8 @@ extern void kvmppc_set_bat(struct kvm_vcpu *vcpu, struct kvmppc_bat *bat, ...@@ -154,8 +154,8 @@ extern void kvmppc_set_bat(struct kvm_vcpu *vcpu, struct kvmppc_bat *bat,
bool upper, u32 val); bool upper, u32 val);
extern void kvmppc_giveup_ext(struct kvm_vcpu *vcpu, ulong msr); extern void kvmppc_giveup_ext(struct kvm_vcpu *vcpu, ulong msr);
extern int kvmppc_emulate_paired_single(struct kvm_run *run, struct kvm_vcpu *vcpu); extern int kvmppc_emulate_paired_single(struct kvm_run *run, struct kvm_vcpu *vcpu);
extern pfn_t kvmppc_gpa_to_pfn(struct kvm_vcpu *vcpu, gpa_t gpa, bool writing, extern kvm_pfn_t kvmppc_gpa_to_pfn(struct kvm_vcpu *vcpu, gpa_t gpa,
bool *writable); bool writing, bool *writable);
extern void kvmppc_add_revmap_chain(struct kvm *kvm, struct revmap_entry *rev, extern void kvmppc_add_revmap_chain(struct kvm *kvm, struct revmap_entry *rev,
unsigned long *rmap, long pte_index, int realmode); unsigned long *rmap, long pte_index, int realmode);
extern void kvmppc_update_rmap_change(unsigned long *rmap, unsigned long psize); extern void kvmppc_update_rmap_change(unsigned long *rmap, unsigned long psize);
......
...@@ -515,7 +515,7 @@ void kvmppc_claim_lpid(long lpid); ...@@ -515,7 +515,7 @@ void kvmppc_claim_lpid(long lpid);
void kvmppc_free_lpid(long lpid); void kvmppc_free_lpid(long lpid);
void kvmppc_init_lpid(unsigned long nr_lpids); void kvmppc_init_lpid(unsigned long nr_lpids);
static inline void kvmppc_mmu_flush_icache(pfn_t pfn) static inline void kvmppc_mmu_flush_icache(kvm_pfn_t pfn)
{ {
struct page *page; struct page *page;
/* /*
......
...@@ -366,7 +366,7 @@ int kvmppc_core_prepare_to_enter(struct kvm_vcpu *vcpu) ...@@ -366,7 +366,7 @@ int kvmppc_core_prepare_to_enter(struct kvm_vcpu *vcpu)
} }
EXPORT_SYMBOL_GPL(kvmppc_core_prepare_to_enter); EXPORT_SYMBOL_GPL(kvmppc_core_prepare_to_enter);
pfn_t kvmppc_gpa_to_pfn(struct kvm_vcpu *vcpu, gpa_t gpa, bool writing, kvm_pfn_t kvmppc_gpa_to_pfn(struct kvm_vcpu *vcpu, gpa_t gpa, bool writing,
bool *writable) bool *writable)
{ {
ulong mp_pa = vcpu->arch.magic_page_pa & KVM_PAM; ulong mp_pa = vcpu->arch.magic_page_pa & KVM_PAM;
...@@ -379,9 +379,9 @@ pfn_t kvmppc_gpa_to_pfn(struct kvm_vcpu *vcpu, gpa_t gpa, bool writing, ...@@ -379,9 +379,9 @@ pfn_t kvmppc_gpa_to_pfn(struct kvm_vcpu *vcpu, gpa_t gpa, bool writing,
gpa &= ~0xFFFULL; gpa &= ~0xFFFULL;
if (unlikely(mp_pa) && unlikely((gpa & KVM_PAM) == mp_pa)) { if (unlikely(mp_pa) && unlikely((gpa & KVM_PAM) == mp_pa)) {
ulong shared_page = ((ulong)vcpu->arch.shared) & PAGE_MASK; ulong shared_page = ((ulong)vcpu->arch.shared) & PAGE_MASK;
pfn_t pfn; kvm_pfn_t pfn;
pfn = (pfn_t)virt_to_phys((void*)shared_page) >> PAGE_SHIFT; pfn = (kvm_pfn_t)virt_to_phys((void*)shared_page) >> PAGE_SHIFT;
get_page(pfn_to_page(pfn)); get_page(pfn_to_page(pfn));
if (writable) if (writable)
*writable = true; *writable = true;
......
...@@ -142,7 +142,7 @@ extern char etext[]; ...@@ -142,7 +142,7 @@ extern char etext[];
int kvmppc_mmu_map_page(struct kvm_vcpu *vcpu, struct kvmppc_pte *orig_pte, int kvmppc_mmu_map_page(struct kvm_vcpu *vcpu, struct kvmppc_pte *orig_pte,
bool iswrite) bool iswrite)
{ {
pfn_t hpaddr; kvm_pfn_t hpaddr;
u64 vpn; u64 vpn;
u64 vsid; u64 vsid;
struct kvmppc_sid_map *map; struct kvmppc_sid_map *map;
......
...@@ -83,7 +83,7 @@ int kvmppc_mmu_map_page(struct kvm_vcpu *vcpu, struct kvmppc_pte *orig_pte, ...@@ -83,7 +83,7 @@ int kvmppc_mmu_map_page(struct kvm_vcpu *vcpu, struct kvmppc_pte *orig_pte,
bool iswrite) bool iswrite)
{ {
unsigned long vpn; unsigned long vpn;
pfn_t hpaddr; kvm_pfn_t hpaddr;
ulong hash, hpteg; ulong hash, hpteg;
u64 vsid; u64 vsid;
int ret; int ret;
......
...@@ -41,7 +41,7 @@ enum vcpu_ftr { ...@@ -41,7 +41,7 @@ enum vcpu_ftr {
#define E500_TLB_MAS2_ATTR (0x7f) #define E500_TLB_MAS2_ATTR (0x7f)
struct tlbe_ref { struct tlbe_ref {
pfn_t pfn; /* valid only for TLB0, except briefly */ kvm_pfn_t pfn; /* valid only for TLB0, except briefly */
unsigned int flags; /* E500_TLB_* */ unsigned int flags; /* E500_TLB_* */
}; };
......
...@@ -163,9 +163,9 @@ void kvmppc_map_magic(struct kvm_vcpu *vcpu) ...@@ -163,9 +163,9 @@ void kvmppc_map_magic(struct kvm_vcpu *vcpu)
struct kvm_book3e_206_tlb_entry magic; struct kvm_book3e_206_tlb_entry magic;
ulong shared_page = ((ulong)vcpu->arch.shared) & PAGE_MASK; ulong shared_page = ((ulong)vcpu->arch.shared) & PAGE_MASK;
unsigned int stid; unsigned int stid;
pfn_t pfn; kvm_pfn_t pfn;
pfn = (pfn_t)virt_to_phys((void *)shared_page) >> PAGE_SHIFT; pfn = (kvm_pfn_t)virt_to_phys((void *)shared_page) >> PAGE_SHIFT;
get_page(pfn_to_page(pfn)); get_page(pfn_to_page(pfn));
preempt_disable(); preempt_disable();
...@@ -246,7 +246,7 @@ static inline int tlbe_is_writable(struct kvm_book3e_206_tlb_entry *tlbe) ...@@ -246,7 +246,7 @@ static inline int tlbe_is_writable(struct kvm_book3e_206_tlb_entry *tlbe)
static inline void kvmppc_e500_ref_setup(struct tlbe_ref *ref, static inline void kvmppc_e500_ref_setup(struct tlbe_ref *ref,
struct kvm_book3e_206_tlb_entry *gtlbe, struct kvm_book3e_206_tlb_entry *gtlbe,
pfn_t pfn, unsigned int wimg) kvm_pfn_t pfn, unsigned int wimg)
{ {
ref->pfn = pfn; ref->pfn = pfn;
ref->flags = E500_TLB_VALID; ref->flags = E500_TLB_VALID;
...@@ -309,7 +309,7 @@ static void kvmppc_e500_setup_stlbe( ...@@ -309,7 +309,7 @@ static void kvmppc_e500_setup_stlbe(
int tsize, struct tlbe_ref *ref, u64 gvaddr, int tsize, struct tlbe_ref *ref, u64 gvaddr,
struct kvm_book3e_206_tlb_entry *stlbe) struct kvm_book3e_206_tlb_entry *stlbe)
{ {
pfn_t pfn = ref->pfn; kvm_pfn_t pfn = ref->pfn;
u32 pr = vcpu->arch.shared->msr & MSR_PR; u32 pr = vcpu->arch.shared->msr & MSR_PR;
BUG_ON(!(ref->flags & E500_TLB_VALID)); BUG_ON(!(ref->flags & E500_TLB_VALID));
......
...@@ -30,7 +30,7 @@ TRACE_EVENT(kvm_book3s_reenter, ...@@ -30,7 +30,7 @@ TRACE_EVENT(kvm_book3s_reenter,
#ifdef CONFIG_PPC_BOOK3S_64 #ifdef CONFIG_PPC_BOOK3S_64
TRACE_EVENT(kvm_book3s_64_mmu_map, TRACE_EVENT(kvm_book3s_64_mmu_map,
TP_PROTO(int rflags, ulong hpteg, ulong va, pfn_t hpaddr, TP_PROTO(int rflags, ulong hpteg, ulong va, kvm_pfn_t hpaddr,
struct kvmppc_pte *orig_pte), struct kvmppc_pte *orig_pte),
TP_ARGS(rflags, hpteg, va, hpaddr, orig_pte), TP_ARGS(rflags, hpteg, va, hpaddr, orig_pte),
......
...@@ -43,11 +43,11 @@ static int kvm_iommu_unmap_memslots(struct kvm *kvm); ...@@ -43,11 +43,11 @@ static int kvm_iommu_unmap_memslots(struct kvm *kvm);
static void kvm_iommu_put_pages(struct kvm *kvm, static void kvm_iommu_put_pages(struct kvm *kvm,
gfn_t base_gfn, unsigned long npages); gfn_t base_gfn, unsigned long npages);
static pfn_t kvm_pin_pages(struct kvm_memory_slot *slot, gfn_t gfn, static kvm_pfn_t kvm_pin_pages(struct kvm_memory_slot *slot, gfn_t gfn,
unsigned long npages) unsigned long npages)
{ {
gfn_t end_gfn; gfn_t end_gfn;
pfn_t pfn; kvm_pfn_t pfn;
pfn = gfn_to_pfn_memslot(slot, gfn); pfn = gfn_to_pfn_memslot(slot, gfn);
end_gfn = gfn + npages; end_gfn = gfn + npages;
...@@ -62,7 +62,8 @@ static pfn_t kvm_pin_pages(struct kvm_memory_slot *slot, gfn_t gfn, ...@@ -62,7 +62,8 @@ static pfn_t kvm_pin_pages(struct kvm_memory_slot *slot, gfn_t gfn,
return pfn; return pfn;
} }
static void kvm_unpin_pages(struct kvm *kvm, pfn_t pfn, unsigned long npages) static void kvm_unpin_pages(struct kvm *kvm, kvm_pfn_t pfn,
unsigned long npages)
{ {
unsigned long i; unsigned long i;
...@@ -73,7 +74,7 @@ static void kvm_unpin_pages(struct kvm *kvm, pfn_t pfn, unsigned long npages) ...@@ -73,7 +74,7 @@ static void kvm_unpin_pages(struct kvm *kvm, pfn_t pfn, unsigned long npages)
int kvm_iommu_map_pages(struct kvm *kvm, struct kvm_memory_slot *slot) int kvm_iommu_map_pages(struct kvm *kvm, struct kvm_memory_slot *slot)
{ {
gfn_t gfn, end_gfn; gfn_t gfn, end_gfn;
pfn_t pfn; kvm_pfn_t pfn;
int r = 0; int r = 0;
struct iommu_domain *domain = kvm->arch.iommu_domain; struct iommu_domain *domain = kvm->arch.iommu_domain;
int flags; int flags;
...@@ -275,7 +276,7 @@ static void kvm_iommu_put_pages(struct kvm *kvm, ...@@ -275,7 +276,7 @@ static void kvm_iommu_put_pages(struct kvm *kvm,
{ {
struct iommu_domain *domain; struct iommu_domain *domain;
gfn_t end_gfn, gfn; gfn_t end_gfn, gfn;
pfn_t pfn; kvm_pfn_t pfn;
u64 phys; u64 phys;
domain = kvm->arch.iommu_domain; domain = kvm->arch.iommu_domain;
......
...@@ -259,7 +259,7 @@ static unsigned get_mmio_spte_access(u64 spte) ...@@ -259,7 +259,7 @@ static unsigned get_mmio_spte_access(u64 spte)
} }
static bool set_mmio_spte(struct kvm_vcpu *vcpu, u64 *sptep, gfn_t gfn, static bool set_mmio_spte(struct kvm_vcpu *vcpu, u64 *sptep, gfn_t gfn,
pfn_t pfn, unsigned access) kvm_pfn_t pfn, unsigned access)
{ {
if (unlikely(is_noslot_pfn(pfn))) { if (unlikely(is_noslot_pfn(pfn))) {
mark_mmio_spte(vcpu, sptep, gfn, access); mark_mmio_spte(vcpu, sptep, gfn, access);
...@@ -320,7 +320,7 @@ static int is_last_spte(u64 pte, int level) ...@@ -320,7 +320,7 @@ static int is_last_spte(u64 pte, int level)
return 0; return 0;
} }
static pfn_t spte_to_pfn(u64 pte) static kvm_pfn_t spte_to_pfn(u64 pte)
{ {
return (pte & PT64_BASE_ADDR_MASK) >> PAGE_SHIFT; return (pte & PT64_BASE_ADDR_MASK) >> PAGE_SHIFT;
} }
...@@ -582,7 +582,7 @@ static bool mmu_spte_update(u64 *sptep, u64 new_spte) ...@@ -582,7 +582,7 @@ static bool mmu_spte_update(u64 *sptep, u64 new_spte)
*/ */
static int mmu_spte_clear_track_bits(u64 *sptep) static int mmu_spte_clear_track_bits(u64 *sptep)
{ {
pfn_t pfn; kvm_pfn_t pfn;
u64 old_spte = *sptep; u64 old_spte = *sptep;
if (!spte_has_volatile_bits(old_spte)) if (!spte_has_volatile_bits(old_spte))
...@@ -1372,7 +1372,7 @@ static int kvm_set_pte_rmapp(struct kvm *kvm, struct kvm_rmap_head *rmap_head, ...@@ -1372,7 +1372,7 @@ static int kvm_set_pte_rmapp(struct kvm *kvm, struct kvm_rmap_head *rmap_head,
int need_flush = 0; int need_flush = 0;
u64 new_spte; u64 new_spte;
pte_t *ptep = (pte_t *)data; pte_t *ptep = (pte_t *)data;
pfn_t new_pfn; kvm_pfn_t new_pfn;
WARN_ON(pte_huge(*ptep)); WARN_ON(pte_huge(*ptep));
new_pfn = pte_pfn(*ptep); new_pfn = pte_pfn(*ptep);
...@@ -2450,7 +2450,7 @@ static int mmu_need_write_protect(struct kvm_vcpu *vcpu, gfn_t gfn, ...@@ -2450,7 +2450,7 @@ static int mmu_need_write_protect(struct kvm_vcpu *vcpu, gfn_t gfn,
return 0; return 0;
} }
static bool kvm_is_mmio_pfn(pfn_t pfn) static bool kvm_is_mmio_pfn(kvm_pfn_t pfn)
{ {
if (pfn_valid(pfn)) if (pfn_valid(pfn))
return !is_zero_pfn(pfn) && PageReserved(pfn_to_page(pfn)); return !is_zero_pfn(pfn) && PageReserved(pfn_to_page(pfn));
...@@ -2460,7 +2460,7 @@ static bool kvm_is_mmio_pfn(pfn_t pfn) ...@@ -2460,7 +2460,7 @@ static bool kvm_is_mmio_pfn(pfn_t pfn)
static int set_spte(struct kvm_vcpu *vcpu, u64 *sptep, static int set_spte(struct kvm_vcpu *vcpu, u64 *sptep,
unsigned pte_access, int level, unsigned pte_access, int level,
gfn_t gfn, pfn_t pfn, bool speculative, gfn_t gfn, kvm_pfn_t pfn, bool speculative,
bool can_unsync, bool host_writable) bool can_unsync, bool host_writable)
{ {
u64 spte; u64 spte;
...@@ -2539,7 +2539,7 @@ static int set_spte(struct kvm_vcpu *vcpu, u64 *sptep, ...@@ -2539,7 +2539,7 @@ static int set_spte(struct kvm_vcpu *vcpu, u64 *sptep,
} }
static bool mmu_set_spte(struct kvm_vcpu *vcpu, u64 *sptep, unsigned pte_access, static bool mmu_set_spte(struct kvm_vcpu *vcpu, u64 *sptep, unsigned pte_access,
int write_fault, int level, gfn_t gfn, pfn_t pfn, int write_fault, int level, gfn_t gfn, kvm_pfn_t pfn,
bool speculative, bool host_writable) bool speculative, bool host_writable)
{ {
int was_rmapped = 0; int was_rmapped = 0;
...@@ -2602,7 +2602,7 @@ static bool mmu_set_spte(struct kvm_vcpu *vcpu, u64 *sptep, unsigned pte_access, ...@@ -2602,7 +2602,7 @@ static bool mmu_set_spte(struct kvm_vcpu *vcpu, u64 *sptep, unsigned pte_access,
return emulate; return emulate;
} }
static pfn_t pte_prefetch_gfn_to_pfn(struct kvm_vcpu *vcpu, gfn_t gfn, static kvm_pfn_t pte_prefetch_gfn_to_pfn(struct kvm_vcpu *vcpu, gfn_t gfn,
bool no_dirty_log) bool no_dirty_log)
{ {
struct kvm_memory_slot *slot; struct kvm_memory_slot *slot;
...@@ -2684,7 +2684,7 @@ static void direct_pte_prefetch(struct kvm_vcpu *vcpu, u64 *sptep) ...@@ -2684,7 +2684,7 @@ static void direct_pte_prefetch(struct kvm_vcpu *vcpu, u64 *sptep)
} }
static int __direct_map(struct kvm_vcpu *vcpu, int write, int map_writable, static int __direct_map(struct kvm_vcpu *vcpu, int write, int map_writable,
int level, gfn_t gfn, pfn_t pfn, bool prefault) int level, gfn_t gfn, kvm_pfn_t pfn, bool prefault)
{ {
struct kvm_shadow_walk_iterator iterator; struct kvm_shadow_walk_iterator iterator;
struct kvm_mmu_page *sp; struct kvm_mmu_page *sp;
...@@ -2732,7 +2732,7 @@ static void kvm_send_hwpoison_signal(unsigned long address, struct task_struct * ...@@ -2732,7 +2732,7 @@ static void kvm_send_hwpoison_signal(unsigned long address, struct task_struct *
send_sig_info(SIGBUS, &info, tsk); send_sig_info(SIGBUS, &info, tsk);
} }
static int kvm_handle_bad_page(struct kvm_vcpu *vcpu, gfn_t gfn, pfn_t pfn) static int kvm_handle_bad_page(struct kvm_vcpu *vcpu, gfn_t gfn, kvm_pfn_t pfn)
{ {
/* /*
* Do not cache the mmio info caused by writing the readonly gfn * Do not cache the mmio info caused by writing the readonly gfn
...@@ -2752,9 +2752,10 @@ static int kvm_handle_bad_page(struct kvm_vcpu *vcpu, gfn_t gfn, pfn_t pfn) ...@@ -2752,9 +2752,10 @@ static int kvm_handle_bad_page(struct kvm_vcpu *vcpu, gfn_t gfn, pfn_t pfn)
} }
static void transparent_hugepage_adjust(struct kvm_vcpu *vcpu, static void transparent_hugepage_adjust(struct kvm_vcpu *vcpu,
gfn_t *gfnp, pfn_t *pfnp, int *levelp) gfn_t *gfnp, kvm_pfn_t *pfnp,
int *levelp)
{ {
pfn_t pfn = *pfnp; kvm_pfn_t pfn = *pfnp;
gfn_t gfn = *gfnp; gfn_t gfn = *gfnp;
int level = *levelp; int level = *levelp;
...@@ -2793,7 +2794,7 @@ static void transparent_hugepage_adjust(struct kvm_vcpu *vcpu, ...@@ -2793,7 +2794,7 @@ static void transparent_hugepage_adjust(struct kvm_vcpu *vcpu,
} }
static bool handle_abnormal_pfn(struct kvm_vcpu *vcpu, gva_t gva, gfn_t gfn, static bool handle_abnormal_pfn(struct kvm_vcpu *vcpu, gva_t gva, gfn_t gfn,
pfn_t pfn, unsigned access, int *ret_val) kvm_pfn_t pfn, unsigned access, int *ret_val)
{ {
bool ret = true; bool ret = true;
...@@ -2947,7 +2948,7 @@ static bool fast_page_fault(struct kvm_vcpu *vcpu, gva_t gva, int level, ...@@ -2947,7 +2948,7 @@ static bool fast_page_fault(struct kvm_vcpu *vcpu, gva_t gva, int level,
} }
static bool try_async_pf(struct kvm_vcpu *vcpu, bool prefault, gfn_t gfn, static bool try_async_pf(struct kvm_vcpu *vcpu, bool prefault, gfn_t gfn,
gva_t gva, pfn_t *pfn, bool write, bool *writable); gva_t gva, kvm_pfn_t *pfn, bool write, bool *writable);
static void make_mmu_pages_available(struct kvm_vcpu *vcpu); static void make_mmu_pages_available(struct kvm_vcpu *vcpu);
static int nonpaging_map(struct kvm_vcpu *vcpu, gva_t v, u32 error_code, static int nonpaging_map(struct kvm_vcpu *vcpu, gva_t v, u32 error_code,
...@@ -2956,7 +2957,7 @@ static int nonpaging_map(struct kvm_vcpu *vcpu, gva_t v, u32 error_code, ...@@ -2956,7 +2957,7 @@ static int nonpaging_map(struct kvm_vcpu *vcpu, gva_t v, u32 error_code,
int r; int r;
int level; int level;
bool force_pt_level = false; bool force_pt_level = false;
pfn_t pfn; kvm_pfn_t pfn;
unsigned long mmu_seq; unsigned long mmu_seq;
bool map_writable, write = error_code & PFERR_WRITE_MASK; bool map_writable, write = error_code & PFERR_WRITE_MASK;
...@@ -3410,7 +3411,7 @@ static bool can_do_async_pf(struct kvm_vcpu *vcpu) ...@@ -3410,7 +3411,7 @@ static bool can_do_async_pf(struct kvm_vcpu *vcpu)
} }
static bool try_async_pf(struct kvm_vcpu *vcpu, bool prefault, gfn_t gfn, static bool try_async_pf(struct kvm_vcpu *vcpu, bool prefault, gfn_t gfn,
gva_t gva, pfn_t *pfn, bool write, bool *writable) gva_t gva, kvm_pfn_t *pfn, bool write, bool *writable)
{ {
struct kvm_memory_slot *slot; struct kvm_memory_slot *slot;
bool async; bool async;
...@@ -3448,7 +3449,7 @@ check_hugepage_cache_consistency(struct kvm_vcpu *vcpu, gfn_t gfn, int level) ...@@ -3448,7 +3449,7 @@ check_hugepage_cache_consistency(struct kvm_vcpu *vcpu, gfn_t gfn, int level)
static int tdp_page_fault(struct kvm_vcpu *vcpu, gva_t gpa, u32 error_code, static int tdp_page_fault(struct kvm_vcpu *vcpu, gva_t gpa, u32 error_code,
bool prefault) bool prefault)
{ {
pfn_t pfn; kvm_pfn_t pfn;
int r; int r;
int level; int level;
bool force_pt_level; bool force_pt_level;
...@@ -4601,7 +4602,7 @@ static bool kvm_mmu_zap_collapsible_spte(struct kvm *kvm, ...@@ -4601,7 +4602,7 @@ static bool kvm_mmu_zap_collapsible_spte(struct kvm *kvm,
u64 *sptep; u64 *sptep;
struct rmap_iterator iter; struct rmap_iterator iter;
int need_tlb_flush = 0; int need_tlb_flush = 0;
pfn_t pfn; kvm_pfn_t pfn;
struct kvm_mmu_page *sp; struct kvm_mmu_page *sp;
restart: restart:
......
...@@ -97,7 +97,7 @@ static void audit_mappings(struct kvm_vcpu *vcpu, u64 *sptep, int level) ...@@ -97,7 +97,7 @@ static void audit_mappings(struct kvm_vcpu *vcpu, u64 *sptep, int level)
{ {
struct kvm_mmu_page *sp; struct kvm_mmu_page *sp;
gfn_t gfn; gfn_t gfn;
pfn_t pfn; kvm_pfn_t pfn;
hpa_t hpa; hpa_t hpa;
sp = page_header(__pa(sptep)); sp = page_header(__pa(sptep));
......
...@@ -456,7 +456,7 @@ FNAME(prefetch_gpte)(struct kvm_vcpu *vcpu, struct kvm_mmu_page *sp, ...@@ -456,7 +456,7 @@ FNAME(prefetch_gpte)(struct kvm_vcpu *vcpu, struct kvm_mmu_page *sp,
{ {
unsigned pte_access; unsigned pte_access;
gfn_t gfn; gfn_t gfn;
pfn_t pfn; kvm_pfn_t pfn;
if (FNAME(prefetch_invalid_gpte)(vcpu, sp, spte, gpte)) if (FNAME(prefetch_invalid_gpte)(vcpu, sp, spte, gpte))
return false; return false;
...@@ -551,7 +551,7 @@ static void FNAME(pte_prefetch)(struct kvm_vcpu *vcpu, struct guest_walker *gw, ...@@ -551,7 +551,7 @@ static void FNAME(pte_prefetch)(struct kvm_vcpu *vcpu, struct guest_walker *gw,
static int FNAME(fetch)(struct kvm_vcpu *vcpu, gva_t addr, static int FNAME(fetch)(struct kvm_vcpu *vcpu, gva_t addr,
struct guest_walker *gw, struct guest_walker *gw,
int write_fault, int hlevel, int write_fault, int hlevel,
pfn_t pfn, bool map_writable, bool prefault) kvm_pfn_t pfn, bool map_writable, bool prefault)
{ {
struct kvm_mmu_page *sp = NULL; struct kvm_mmu_page *sp = NULL;
struct kvm_shadow_walk_iterator it; struct kvm_shadow_walk_iterator it;
...@@ -694,7 +694,7 @@ static int FNAME(page_fault)(struct kvm_vcpu *vcpu, gva_t addr, u32 error_code, ...@@ -694,7 +694,7 @@ static int FNAME(page_fault)(struct kvm_vcpu *vcpu, gva_t addr, u32 error_code,
int user_fault = error_code & PFERR_USER_MASK; int user_fault = error_code & PFERR_USER_MASK;
struct guest_walker walker; struct guest_walker walker;
int r; int r;
pfn_t pfn; kvm_pfn_t pfn;
int level = PT_PAGE_TABLE_LEVEL; int level = PT_PAGE_TABLE_LEVEL;
bool force_pt_level = false; bool force_pt_level = false;
unsigned long mmu_seq; unsigned long mmu_seq;
......
...@@ -4251,7 +4251,7 @@ static int init_rmode_tss(struct kvm *kvm) ...@@ -4251,7 +4251,7 @@ static int init_rmode_tss(struct kvm *kvm)
static int init_rmode_identity_map(struct kvm *kvm) static int init_rmode_identity_map(struct kvm *kvm)
{ {
int i, idx, r = 0; int i, idx, r = 0;
pfn_t identity_map_pfn; kvm_pfn_t identity_map_pfn;
u32 tmp; u32 tmp;
if (!enable_ept) if (!enable_ept)
......
...@@ -5148,7 +5148,7 @@ static bool reexecute_instruction(struct kvm_vcpu *vcpu, gva_t cr2, ...@@ -5148,7 +5148,7 @@ static bool reexecute_instruction(struct kvm_vcpu *vcpu, gva_t cr2,
int emulation_type) int emulation_type)
{ {
gpa_t gpa = cr2; gpa_t gpa = cr2;
pfn_t pfn; kvm_pfn_t pfn;
if (emulation_type & EMULTYPE_NO_REEXECUTE) if (emulation_type & EMULTYPE_NO_REEXECUTE)
return false; return false;
......
...@@ -66,7 +66,7 @@ ...@@ -66,7 +66,7 @@
* error pfns indicate that the gfn is in slot but faild to * error pfns indicate that the gfn is in slot but faild to
* translate it to pfn on host. * translate it to pfn on host.
*/ */
static inline bool is_error_pfn(pfn_t pfn) static inline bool is_error_pfn(kvm_pfn_t pfn)
{ {
return !!(pfn & KVM_PFN_ERR_MASK); return !!(pfn & KVM_PFN_ERR_MASK);
} }
...@@ -76,13 +76,13 @@ static inline bool is_error_pfn(pfn_t pfn) ...@@ -76,13 +76,13 @@ static inline bool is_error_pfn(pfn_t pfn)
* translated to pfn - it is not in slot or failed to * translated to pfn - it is not in slot or failed to
* translate it to pfn. * translate it to pfn.
*/ */
static inline bool is_error_noslot_pfn(pfn_t pfn) static inline bool is_error_noslot_pfn(kvm_pfn_t pfn)
{ {
return !!(pfn & KVM_PFN_ERR_NOSLOT_MASK); return !!(pfn & KVM_PFN_ERR_NOSLOT_MASK);
} }
/* noslot pfn indicates that the gfn is not in slot. */ /* noslot pfn indicates that the gfn is not in slot. */
static inline bool is_noslot_pfn(pfn_t pfn) static inline bool is_noslot_pfn(kvm_pfn_t pfn)
{ {
return pfn == KVM_PFN_NOSLOT; return pfn == KVM_PFN_NOSLOT;
} }
...@@ -591,19 +591,20 @@ void kvm_release_page_clean(struct page *page); ...@@ -591,19 +591,20 @@ void kvm_release_page_clean(struct page *page);
void kvm_release_page_dirty(struct page *page); void kvm_release_page_dirty(struct page *page);
void kvm_set_page_accessed(struct page *page); void kvm_set_page_accessed(struct page *page);
pfn_t gfn_to_pfn_atomic(struct kvm *kvm, gfn_t gfn); kvm_pfn_t gfn_to_pfn_atomic(struct kvm *kvm, gfn_t gfn);
pfn_t gfn_to_pfn(struct kvm *kvm, gfn_t gfn); kvm_pfn_t gfn_to_pfn(struct kvm *kvm, gfn_t gfn);
pfn_t gfn_to_pfn_prot(struct kvm *kvm, gfn_t gfn, bool write_fault, kvm_pfn_t gfn_to_pfn_prot(struct kvm *kvm, gfn_t gfn, bool write_fault,
bool *writable);
kvm_pfn_t gfn_to_pfn_memslot(struct kvm_memory_slot *slot, gfn_t gfn);
kvm_pfn_t gfn_to_pfn_memslot_atomic(struct kvm_memory_slot *slot, gfn_t gfn);
kvm_pfn_t __gfn_to_pfn_memslot(struct kvm_memory_slot *slot, gfn_t gfn,
bool atomic, bool *async, bool write_fault,
bool *writable); bool *writable);
pfn_t gfn_to_pfn_memslot(struct kvm_memory_slot *slot, gfn_t gfn);
pfn_t gfn_to_pfn_memslot_atomic(struct kvm_memory_slot *slot, gfn_t gfn);
pfn_t __gfn_to_pfn_memslot(struct kvm_memory_slot *slot, gfn_t gfn, bool atomic,
bool *async, bool write_fault, bool *writable);
void kvm_release_pfn_clean(pfn_t pfn); void kvm_release_pfn_clean(kvm_pfn_t pfn);
void kvm_set_pfn_dirty(pfn_t pfn); void kvm_set_pfn_dirty(kvm_pfn_t pfn);
void kvm_set_pfn_accessed(pfn_t pfn); void kvm_set_pfn_accessed(kvm_pfn_t pfn);
void kvm_get_pfn(pfn_t pfn); void kvm_get_pfn(kvm_pfn_t pfn);
int kvm_read_guest_page(struct kvm *kvm, gfn_t gfn, void *data, int offset, int kvm_read_guest_page(struct kvm *kvm, gfn_t gfn, void *data, int offset,
int len); int len);
...@@ -629,8 +630,8 @@ void mark_page_dirty(struct kvm *kvm, gfn_t gfn); ...@@ -629,8 +630,8 @@ void mark_page_dirty(struct kvm *kvm, gfn_t gfn);
struct kvm_memslots *kvm_vcpu_memslots(struct kvm_vcpu *vcpu); struct kvm_memslots *kvm_vcpu_memslots(struct kvm_vcpu *vcpu);
struct kvm_memory_slot *kvm_vcpu_gfn_to_memslot(struct kvm_vcpu *vcpu, gfn_t gfn); struct kvm_memory_slot *kvm_vcpu_gfn_to_memslot(struct kvm_vcpu *vcpu, gfn_t gfn);
pfn_t kvm_vcpu_gfn_to_pfn_atomic(struct kvm_vcpu *vcpu, gfn_t gfn); kvm_pfn_t kvm_vcpu_gfn_to_pfn_atomic(struct kvm_vcpu *vcpu, gfn_t gfn);
pfn_t kvm_vcpu_gfn_to_pfn(struct kvm_vcpu *vcpu, gfn_t gfn); kvm_pfn_t kvm_vcpu_gfn_to_pfn(struct kvm_vcpu *vcpu, gfn_t gfn);
struct page *kvm_vcpu_gfn_to_page(struct kvm_vcpu *vcpu, gfn_t gfn); struct page *kvm_vcpu_gfn_to_page(struct kvm_vcpu *vcpu, gfn_t gfn);
unsigned long kvm_vcpu_gfn_to_hva(struct kvm_vcpu *vcpu, gfn_t gfn); unsigned long kvm_vcpu_gfn_to_hva(struct kvm_vcpu *vcpu, gfn_t gfn);
unsigned long kvm_vcpu_gfn_to_hva_prot(struct kvm_vcpu *vcpu, gfn_t gfn, bool *writable); unsigned long kvm_vcpu_gfn_to_hva_prot(struct kvm_vcpu *vcpu, gfn_t gfn, bool *writable);
...@@ -811,7 +812,7 @@ void kvm_arch_sync_events(struct kvm *kvm); ...@@ -811,7 +812,7 @@ void kvm_arch_sync_events(struct kvm *kvm);
int kvm_cpu_has_pending_timer(struct kvm_vcpu *vcpu); int kvm_cpu_has_pending_timer(struct kvm_vcpu *vcpu);
void kvm_vcpu_kick(struct kvm_vcpu *vcpu); void kvm_vcpu_kick(struct kvm_vcpu *vcpu);
bool kvm_is_reserved_pfn(pfn_t pfn); bool kvm_is_reserved_pfn(kvm_pfn_t pfn);
struct kvm_irq_ack_notifier { struct kvm_irq_ack_notifier {
struct hlist_node link; struct hlist_node link;
...@@ -965,7 +966,7 @@ static inline gfn_t gpa_to_gfn(gpa_t gpa) ...@@ -965,7 +966,7 @@ static inline gfn_t gpa_to_gfn(gpa_t gpa)
return (gfn_t)(gpa >> PAGE_SHIFT); return (gfn_t)(gpa >> PAGE_SHIFT);
} }
static inline hpa_t pfn_to_hpa(pfn_t pfn) static inline hpa_t pfn_to_hpa(kvm_pfn_t pfn)
{ {
return (hpa_t)pfn << PAGE_SHIFT; return (hpa_t)pfn << PAGE_SHIFT;
} }
......
...@@ -53,7 +53,7 @@ typedef unsigned long hva_t; ...@@ -53,7 +53,7 @@ typedef unsigned long hva_t;
typedef u64 hpa_t; typedef u64 hpa_t;
typedef u64 hfn_t; typedef u64 hfn_t;
typedef hfn_t pfn_t; typedef hfn_t kvm_pfn_t;
struct gfn_to_hva_cache { struct gfn_to_hva_cache {
u64 generation; u64 generation;
......
...@@ -111,7 +111,7 @@ static void hardware_disable_all(void); ...@@ -111,7 +111,7 @@ static void hardware_disable_all(void);
static void kvm_io_bus_destroy(struct kvm_io_bus *bus); static void kvm_io_bus_destroy(struct kvm_io_bus *bus);
static void kvm_release_pfn_dirty(pfn_t pfn); static void kvm_release_pfn_dirty(kvm_pfn_t pfn);
static void mark_page_dirty_in_slot(struct kvm_memory_slot *memslot, gfn_t gfn); static void mark_page_dirty_in_slot(struct kvm_memory_slot *memslot, gfn_t gfn);
__visible bool kvm_rebooting; __visible bool kvm_rebooting;
...@@ -119,7 +119,7 @@ EXPORT_SYMBOL_GPL(kvm_rebooting); ...@@ -119,7 +119,7 @@ EXPORT_SYMBOL_GPL(kvm_rebooting);
static bool largepages_enabled = true; static bool largepages_enabled = true;
bool kvm_is_reserved_pfn(pfn_t pfn) bool kvm_is_reserved_pfn(kvm_pfn_t pfn)
{ {
if (pfn_valid(pfn)) if (pfn_valid(pfn))
return PageReserved(pfn_to_page(pfn)); return PageReserved(pfn_to_page(pfn));
...@@ -1289,7 +1289,7 @@ static inline int check_user_page_hwpoison(unsigned long addr) ...@@ -1289,7 +1289,7 @@ static inline int check_user_page_hwpoison(unsigned long addr)
* true indicates success, otherwise false is returned. * true indicates success, otherwise false is returned.
*/ */
static bool hva_to_pfn_fast(unsigned long addr, bool atomic, bool *async, static bool hva_to_pfn_fast(unsigned long addr, bool atomic, bool *async,
bool write_fault, bool *writable, pfn_t *pfn) bool write_fault, bool *writable, kvm_pfn_t *pfn)
{ {
struct page *page[1]; struct page *page[1];
int npages; int npages;
...@@ -1322,7 +1322,7 @@ static bool hva_to_pfn_fast(unsigned long addr, bool atomic, bool *async, ...@@ -1322,7 +1322,7 @@ static bool hva_to_pfn_fast(unsigned long addr, bool atomic, bool *async,
* 1 indicates success, -errno is returned if error is detected. * 1 indicates success, -errno is returned if error is detected.
*/ */
static int hva_to_pfn_slow(unsigned long addr, bool *async, bool write_fault, static int hva_to_pfn_slow(unsigned long addr, bool *async, bool write_fault,
bool *writable, pfn_t *pfn) bool *writable, kvm_pfn_t *pfn)
{ {
struct page *page[1]; struct page *page[1];
int npages = 0; int npages = 0;
...@@ -1386,11 +1386,11 @@ static bool vma_is_valid(struct vm_area_struct *vma, bool write_fault) ...@@ -1386,11 +1386,11 @@ static bool vma_is_valid(struct vm_area_struct *vma, bool write_fault)
* 2): @write_fault = false && @writable, @writable will tell the caller * 2): @write_fault = false && @writable, @writable will tell the caller
* whether the mapping is writable. * whether the mapping is writable.
*/ */
static pfn_t hva_to_pfn(unsigned long addr, bool atomic, bool *async, static kvm_pfn_t hva_to_pfn(unsigned long addr, bool atomic, bool *async,
bool write_fault, bool *writable) bool write_fault, bool *writable)
{ {
struct vm_area_struct *vma; struct vm_area_struct *vma;
pfn_t pfn = 0; kvm_pfn_t pfn = 0;
int npages; int npages;
/* we can do it either atomically or asynchronously, not both */ /* we can do it either atomically or asynchronously, not both */
...@@ -1431,8 +1431,9 @@ static pfn_t hva_to_pfn(unsigned long addr, bool atomic, bool *async, ...@@ -1431,8 +1431,9 @@ static pfn_t hva_to_pfn(unsigned long addr, bool atomic, bool *async,
return pfn; return pfn;
} }
pfn_t __gfn_to_pfn_memslot(struct kvm_memory_slot *slot, gfn_t gfn, bool atomic, kvm_pfn_t __gfn_to_pfn_memslot(struct kvm_memory_slot *slot, gfn_t gfn,
bool *async, bool write_fault, bool *writable) bool atomic, bool *async, bool write_fault,
bool *writable)
{ {
unsigned long addr = __gfn_to_hva_many(slot, gfn, NULL, write_fault); unsigned long addr = __gfn_to_hva_many(slot, gfn, NULL, write_fault);
...@@ -1453,7 +1454,7 @@ pfn_t __gfn_to_pfn_memslot(struct kvm_memory_slot *slot, gfn_t gfn, bool atomic, ...@@ -1453,7 +1454,7 @@ pfn_t __gfn_to_pfn_memslot(struct kvm_memory_slot *slot, gfn_t gfn, bool atomic,
} }
EXPORT_SYMBOL_GPL(__gfn_to_pfn_memslot); EXPORT_SYMBOL_GPL(__gfn_to_pfn_memslot);
pfn_t gfn_to_pfn_prot(struct kvm *kvm, gfn_t gfn, bool write_fault, kvm_pfn_t gfn_to_pfn_prot(struct kvm *kvm, gfn_t gfn, bool write_fault,
bool *writable) bool *writable)
{ {
return __gfn_to_pfn_memslot(gfn_to_memslot(kvm, gfn), gfn, false, NULL, return __gfn_to_pfn_memslot(gfn_to_memslot(kvm, gfn), gfn, false, NULL,
...@@ -1461,37 +1462,37 @@ pfn_t gfn_to_pfn_prot(struct kvm *kvm, gfn_t gfn, bool write_fault, ...@@ -1461,37 +1462,37 @@ pfn_t gfn_to_pfn_prot(struct kvm *kvm, gfn_t gfn, bool write_fault,
} }
EXPORT_SYMBOL_GPL(gfn_to_pfn_prot); EXPORT_SYMBOL_GPL(gfn_to_pfn_prot);
pfn_t gfn_to_pfn_memslot(struct kvm_memory_slot *slot, gfn_t gfn) kvm_pfn_t gfn_to_pfn_memslot(struct kvm_memory_slot *slot, gfn_t gfn)
{ {
return __gfn_to_pfn_memslot(slot, gfn, false, NULL, true, NULL); return __gfn_to_pfn_memslot(slot, gfn, false, NULL, true, NULL);
} }
EXPORT_SYMBOL_GPL(gfn_to_pfn_memslot); EXPORT_SYMBOL_GPL(gfn_to_pfn_memslot);
pfn_t gfn_to_pfn_memslot_atomic(struct kvm_memory_slot *slot, gfn_t gfn) kvm_pfn_t gfn_to_pfn_memslot_atomic(struct kvm_memory_slot *slot, gfn_t gfn)
{ {
return __gfn_to_pfn_memslot(slot, gfn, true, NULL, true, NULL); return __gfn_to_pfn_memslot(slot, gfn, true, NULL, true, NULL);
} }
EXPORT_SYMBOL_GPL(gfn_to_pfn_memslot_atomic); EXPORT_SYMBOL_GPL(gfn_to_pfn_memslot_atomic);
pfn_t gfn_to_pfn_atomic(struct kvm *kvm, gfn_t gfn) kvm_pfn_t gfn_to_pfn_atomic(struct kvm *kvm, gfn_t gfn)
{ {
return gfn_to_pfn_memslot_atomic(gfn_to_memslot(kvm, gfn), gfn); return gfn_to_pfn_memslot_atomic(gfn_to_memslot(kvm, gfn), gfn);
} }
EXPORT_SYMBOL_GPL(gfn_to_pfn_atomic); EXPORT_SYMBOL_GPL(gfn_to_pfn_atomic);
pfn_t kvm_vcpu_gfn_to_pfn_atomic(struct kvm_vcpu *vcpu, gfn_t gfn) kvm_pfn_t kvm_vcpu_gfn_to_pfn_atomic(struct kvm_vcpu *vcpu, gfn_t gfn)
{ {
return gfn_to_pfn_memslot_atomic(kvm_vcpu_gfn_to_memslot(vcpu, gfn), gfn); return gfn_to_pfn_memslot_atomic(kvm_vcpu_gfn_to_memslot(vcpu, gfn), gfn);
} }
EXPORT_SYMBOL_GPL(kvm_vcpu_gfn_to_pfn_atomic); EXPORT_SYMBOL_GPL(kvm_vcpu_gfn_to_pfn_atomic);
pfn_t gfn_to_pfn(struct kvm *kvm, gfn_t gfn) kvm_pfn_t gfn_to_pfn(struct kvm *kvm, gfn_t gfn)
{ {
return gfn_to_pfn_memslot(gfn_to_memslot(kvm, gfn), gfn); return gfn_to_pfn_memslot(gfn_to_memslot(kvm, gfn), gfn);
} }
EXPORT_SYMBOL_GPL(gfn_to_pfn); EXPORT_SYMBOL_GPL(gfn_to_pfn);
pfn_t kvm_vcpu_gfn_to_pfn(struct kvm_vcpu *vcpu, gfn_t gfn) kvm_pfn_t kvm_vcpu_gfn_to_pfn(struct kvm_vcpu *vcpu, gfn_t gfn)
{ {
return gfn_to_pfn_memslot(kvm_vcpu_gfn_to_memslot(vcpu, gfn), gfn); return gfn_to_pfn_memslot(kvm_vcpu_gfn_to_memslot(vcpu, gfn), gfn);
} }
...@@ -1514,7 +1515,7 @@ int gfn_to_page_many_atomic(struct kvm_memory_slot *slot, gfn_t gfn, ...@@ -1514,7 +1515,7 @@ int gfn_to_page_many_atomic(struct kvm_memory_slot *slot, gfn_t gfn,
} }
EXPORT_SYMBOL_GPL(gfn_to_page_many_atomic); EXPORT_SYMBOL_GPL(gfn_to_page_many_atomic);
static struct page *kvm_pfn_to_page(pfn_t pfn) static struct page *kvm_pfn_to_page(kvm_pfn_t pfn)
{ {
if (is_error_noslot_pfn(pfn)) if (is_error_noslot_pfn(pfn))
return KVM_ERR_PTR_BAD_PAGE; return KVM_ERR_PTR_BAD_PAGE;
...@@ -1529,7 +1530,7 @@ static struct page *kvm_pfn_to_page(pfn_t pfn) ...@@ -1529,7 +1530,7 @@ static struct page *kvm_pfn_to_page(pfn_t pfn)
struct page *gfn_to_page(struct kvm *kvm, gfn_t gfn) struct page *gfn_to_page(struct kvm *kvm, gfn_t gfn)
{ {
pfn_t pfn; kvm_pfn_t pfn;
pfn = gfn_to_pfn(kvm, gfn); pfn = gfn_to_pfn(kvm, gfn);
...@@ -1539,7 +1540,7 @@ EXPORT_SYMBOL_GPL(gfn_to_page); ...@@ -1539,7 +1540,7 @@ EXPORT_SYMBOL_GPL(gfn_to_page);
struct page *kvm_vcpu_gfn_to_page(struct kvm_vcpu *vcpu, gfn_t gfn) struct page *kvm_vcpu_gfn_to_page(struct kvm_vcpu *vcpu, gfn_t gfn)
{ {
pfn_t pfn; kvm_pfn_t pfn;
pfn = kvm_vcpu_gfn_to_pfn(vcpu, gfn); pfn = kvm_vcpu_gfn_to_pfn(vcpu, gfn);
...@@ -1555,7 +1556,7 @@ void kvm_release_page_clean(struct page *page) ...@@ -1555,7 +1556,7 @@ void kvm_release_page_clean(struct page *page)
} }
EXPORT_SYMBOL_GPL(kvm_release_page_clean); EXPORT_SYMBOL_GPL(kvm_release_page_clean);
void kvm_release_pfn_clean(pfn_t pfn) void kvm_release_pfn_clean(kvm_pfn_t pfn)
{ {
if (!is_error_noslot_pfn(pfn) && !kvm_is_reserved_pfn(pfn)) if (!is_error_noslot_pfn(pfn) && !kvm_is_reserved_pfn(pfn))
put_page(pfn_to_page(pfn)); put_page(pfn_to_page(pfn));
...@@ -1570,13 +1571,13 @@ void kvm_release_page_dirty(struct page *page) ...@@ -1570,13 +1571,13 @@ void kvm_release_page_dirty(struct page *page)
} }
EXPORT_SYMBOL_GPL(kvm_release_page_dirty); EXPORT_SYMBOL_GPL(kvm_release_page_dirty);
static void kvm_release_pfn_dirty(pfn_t pfn) static void kvm_release_pfn_dirty(kvm_pfn_t pfn)
{ {
kvm_set_pfn_dirty(pfn); kvm_set_pfn_dirty(pfn);
kvm_release_pfn_clean(pfn); kvm_release_pfn_clean(pfn);
} }
void kvm_set_pfn_dirty(pfn_t pfn) void kvm_set_pfn_dirty(kvm_pfn_t pfn)
{ {
if (!kvm_is_reserved_pfn(pfn)) { if (!kvm_is_reserved_pfn(pfn)) {
struct page *page = pfn_to_page(pfn); struct page *page = pfn_to_page(pfn);
...@@ -1587,14 +1588,14 @@ void kvm_set_pfn_dirty(pfn_t pfn) ...@@ -1587,14 +1588,14 @@ void kvm_set_pfn_dirty(pfn_t pfn)
} }
EXPORT_SYMBOL_GPL(kvm_set_pfn_dirty); EXPORT_SYMBOL_GPL(kvm_set_pfn_dirty);
void kvm_set_pfn_accessed(pfn_t pfn) void kvm_set_pfn_accessed(kvm_pfn_t pfn)
{ {
if (!kvm_is_reserved_pfn(pfn)) if (!kvm_is_reserved_pfn(pfn))
mark_page_accessed(pfn_to_page(pfn)); mark_page_accessed(pfn_to_page(pfn));
} }
EXPORT_SYMBOL_GPL(kvm_set_pfn_accessed); EXPORT_SYMBOL_GPL(kvm_set_pfn_accessed);
void kvm_get_pfn(pfn_t pfn) void kvm_get_pfn(kvm_pfn_t pfn)
{ {
if (!kvm_is_reserved_pfn(pfn)) if (!kvm_is_reserved_pfn(pfn))
get_page(pfn_to_page(pfn)); get_page(pfn_to_page(pfn));
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment