From: Jan Beulich Date: Fri, 4 Mar 2016 13:15:53 +0000 (+0100) Subject: x86/HVM: limit flushing on cache attribute pinning adjustments X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~1586 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=efd5c610a2c33bd7ad36264a0fc5add9269a26dd;p=xen.git x86/HVM: limit flushing on cache attribute pinning adjustments Avoid cache flush on EPT when removing a UC- range, since when used this type gets converted to UC anyway (there's no UC- among the types valid in MTRRs and hence EPT's emt field). We might further wwant to consider only forcing write buffer flushes when removing WC ranges. Signed-off-by: Jan Beulich Reviewed-by: Andrew Cooper --- diff --git a/xen/arch/x86/hvm/mtrr.c b/xen/arch/x86/hvm/mtrr.c index 80f868ae61..2761f9b76f 100644 --- a/xen/arch/x86/hvm/mtrr.c +++ b/xen/arch/x86/hvm/mtrr.c @@ -611,8 +611,21 @@ int32_t hvm_set_mem_pinned_cacheattr( type = range->type; call_rcu(&range->rcu, free_pinned_cacheattr_entry); p2m_memory_type_changed(d); - if ( type != PAT_TYPE_UNCACHABLE ) + switch ( type ) + { + case PAT_TYPE_UC_MINUS: + /* + * For EPT we can also avoid the flush in this case; + * see epte_get_entry_emt(). + */ + if ( hap_enabled(d) && cpu_has_vmx ) + case PAT_TYPE_UNCACHABLE: + break; + /* fall through */ + default: flush_all(FLUSH_CACHE); + break; + } return 0; } rcu_read_unlock(&pinned_cacheattr_rcu_lock);