lkml.org 
[lkml]   [2017]   [Nov]   [2]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    SubjectRe: [PATCH v2 2/2] KVM: MMU: consider host cache mode in MMIO page check
    From
    Date


    On 10/31/2017 07:48 PM, Haozhong Zhang wrote:
    > Some reserved pages, such as those from NVDIMM DAX devices, are
    > not for MMIO, and can be mapped with cached memory type for better
    > performance. However, the above check misconceives those pages as
    > MMIO. Because KVM maps MMIO pages with UC memory type, the
    > performance of guest accesses to those pages would be harmed.
    > Therefore, we check the host memory type by lookup_memtype() in
    > addition and only treat UC/UC- pages as MMIO.
    >
    > Signed-off-by: Haozhong Zhang <haozhong.zhang@intel.com>
    > Reported-by: Cuevas Escareno, Ivan D <ivan.d.cuevas.escareno@intel.com>
    > Reported-by: Kumar, Karthik <karthik.kumar@intel.com>
    > ---
    > arch/x86/kvm/mmu.c | 30 +++++++++++++++++++++++++++---
    > 1 file changed, 27 insertions(+), 3 deletions(-)
    >
    > diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c
    > index 0b481cc9c725..206828d18857 100644
    > --- a/arch/x86/kvm/mmu.c
    > +++ b/arch/x86/kvm/mmu.c
    > @@ -2707,10 +2707,34 @@ static bool mmu_need_write_protect(struct kvm_vcpu *vcpu, gfn_t gfn,
    >
    > static bool kvm_is_mmio_pfn(kvm_pfn_t pfn)
    > {
    > - if (pfn_valid(pfn))
    > - return !is_zero_pfn(pfn) && PageReserved(pfn_to_page(pfn));
    > + bool is_mmio = true;
    >
    > - return true;
    > + if (pfn_valid(pfn)) {
    > + is_mmio = !is_zero_pfn(pfn) && PageReserved(pfn_to_page(pfn));
    > +
    > + /*
    > + * Some reserved pages, such as those from NVDIMM DAX
    > + * devices, are not for MMIO, and can be mapped with
    > + * cached memory type for better performance. However,
    > + * the above check misconceives those pages as MMIO.
    > + * Because KVM maps MMIO pages with UC memory type,
    > + * the performance of guest accesses to those pages
    > + * would be harmed. Therefore, we check the host
    > + * memory type by lookup_memtype() in addition and
    > + * only treat UC/UC- pages as MMIO.
    > + *
    > + * lookup_memtype() works only when PAT is enabled, so
    > + * add pat_enabled() check here.
    > + */
    > + if (is_mmio && pat_enabled()) {
    > + enum page_cache_mode cm = lookup_memtype(PFN_PHYS(pfn));
    > +
    > + is_mmio = (cm == _PAGE_CACHE_MODE_UC ||
    > + cm == _PAGE_CACHE_MODE_UC_MINUS);
    > + }
    > + }

    You can move all of these detailed stuffs to pat.c and abstract them by introducing
    a function, maybe named pat_pfn_is_uc(). I think this is what Ingo wants.

    \
     
     \ /
      Last update: 2017-11-02 08:56    [W:3.581 / U:0.024 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site