]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/commitdiff
x86/mm: add a function to check if a pfn is UC/UC-/WC
authorHaozhong Zhang <haozhong.zhang@intel.com>
Wed, 20 Dec 2017 07:29:28 +0000 (15:29 +0800)
committerThadeu Lima de Souza Cascardo <cascardo@canonical.com>
Mon, 19 Mar 2018 13:20:28 +0000 (10:20 -0300)
BugLink: http://bugs.launchpad.net/bugs/1745899
Check whether the PAT memory type of a pfn cannot be overridden by
MTRR UC memory type, i.e. the PAT memory type is UC, UC- or WC. This
function will be used by KVM to distinguish MMIO pfns and give them
UC memory type in the EPT page tables (on Intel processors, EPT
memory types work like MTRRs).

Signed-off-by: Haozhong Zhang <haozhong.zhang@intel.com>
Reviewed-by: Xiao Guangrong <xiaoguangrong@tencent.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Radim Krčmář <rkrcmar@redhat.com>
(cherry picked from commit b8d7044bcff7a955257b242515bcf1e5045edd9b)
Signed-off-by: Thadeu Lima de Souza Cascardo <cascardo@canonical.com>
arch/x86/include/asm/pat.h
arch/x86/mm/pat.c

index 8a3ee355b4222e59415cbea01b51beea161733db..92015c65fa2ac95a040a745c5632870530010596 100644 (file)
@@ -22,4 +22,6 @@ int io_reserve_memtype(resource_size_t start, resource_size_t end,
 
 void io_free_memtype(resource_size_t start, resource_size_t end);
 
+bool pat_pfn_immune_to_uc_mtrr(unsigned long pfn);
+
 #endif /* _ASM_X86_PAT_H */
index fe7d57a8fb6003a15e609bfd7481060005e429e4..1555bd7d34493f972464e2df7e11a29f445ac600 100644 (file)
@@ -677,6 +677,25 @@ static enum page_cache_mode lookup_memtype(u64 paddr)
        return rettype;
 }
 
+/**
+ * pat_pfn_immune_to_uc_mtrr - Check whether the PAT memory type
+ * of @pfn cannot be overridden by UC MTRR memory type.
+ *
+ * Only to be called when PAT is enabled.
+ *
+ * Returns true, if the PAT memory type of @pfn is UC, UC-, or WC.
+ * Returns false in other cases.
+ */
+bool pat_pfn_immune_to_uc_mtrr(unsigned long pfn)
+{
+       enum page_cache_mode cm = lookup_memtype(PFN_PHYS(pfn));
+
+       return cm == _PAGE_CACHE_MODE_UC ||
+              cm == _PAGE_CACHE_MODE_UC_MINUS ||
+              cm == _PAGE_CACHE_MODE_WC;
+}
+EXPORT_SYMBOL_GPL(pat_pfn_immune_to_uc_mtrr);
+
 /**
  * io_reserve_memtype - Request a memory type mapping for a region of memory
  * @start: start (physical address) of the region