[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH 03/10] VMX: Add PML definition and feature detection.





On 03/28/2015 04:46 AM, Andrew Cooper wrote:
On 27/03/15 02:35, Kai Huang wrote:
The patch adds PML definition and feature detection. Note PML won't be detected
if PML is disabled from boot parameter. PML is also disabled in construct_vmcs,
as it will only be enabled when domain is switched to log dirty mode.

Signed-off-by: Kai Huang <kai.huang@xxxxxxxxxxxxxxx>
---
  xen/arch/x86/hvm/vmx/vmcs.c        | 18 ++++++++++++++++++
  xen/include/asm-x86/hvm/vmx/vmcs.h |  5 +++++
  xen/include/asm-x86/hvm/vmx/vmx.h  |  1 +
  3 files changed, 24 insertions(+)

diff --git a/xen/arch/x86/hvm/vmx/vmcs.c b/xen/arch/x86/hvm/vmx/vmcs.c
index 9b20a4b..2798b0b 100644
--- a/xen/arch/x86/hvm/vmx/vmcs.c
+++ b/xen/arch/x86/hvm/vmx/vmcs.c
@@ -143,6 +143,7 @@ static void __init vmx_display_features(void)
      P(cpu_has_vmx_virtual_intr_delivery, "Virtual Interrupt Delivery");
      P(cpu_has_vmx_posted_intr_processing, "Posted Interrupt Processing");
      P(cpu_has_vmx_vmcs_shadowing, "VMCS shadowing");
+    P(cpu_has_vmx_pml, "Page Modification Logging");
  #undef P
if ( !printed )
@@ -240,6 +241,8 @@ static int vmx_init_vmcs_config(void)
              opt |= SECONDARY_EXEC_ENABLE_VPID;
          if ( opt_unrestricted_guest_enabled )
              opt |= SECONDARY_EXEC_UNRESTRICTED_GUEST;
+        if ( pml_enable )
This should be named opt_pml_enable in patch 1 or 2 to identify that it
is a command line option.
Sure.


+            opt |= SECONDARY_EXEC_ENABLE_PML;
/*
           * "APIC Register Virtualization" and "Virtual Interrupt Delivery"
@@ -286,6 +289,14 @@ static int vmx_init_vmcs_config(void)
           */
          if ( !(_vmx_ept_vpid_cap & VMX_VPID_INVVPID_ALL_CONTEXT) )
              _vmx_secondary_exec_control &= ~SECONDARY_EXEC_ENABLE_VPID;
+
+       /*
+        * PML cannot be supported if EPT A/D bits is not supported. Actually,
+        * PML should not be detected if EPT A/D bits is not supported, but for
+        * sure we do it anyway.
+        */
+       if ( !(_vmx_ept_vpid_cap & VMX_EPT_AD_BIT_SUPPORT) )
+               _vmx_secondary_exec_control &= ~SECONDARY_EXEC_ENABLE_PML;
      }
if ( _vmx_secondary_exec_control & SECONDARY_EXEC_ENABLE_EPT )
@@ -306,6 +317,10 @@ static int vmx_init_vmcs_config(void)
                    SECONDARY_EXEC_UNRESTRICTED_GUEST);
      }
+ /* PML cannot be supported if we don't use EPT */
+    if ( !(_vmx_secondary_exec_control & SECONDARY_EXEC_ENABLE_EPT) )
+        _vmx_secondary_exec_control &= ~SECONDARY_EXEC_ENABLE_PML;
+
Somewhere in here you should clear pml_enable if hardware doesn't
support it.
Will do. Thanks for catching.

Thanks,
-Kai

~Andrew

      if ( (_vmx_secondary_exec_control & SECONDARY_EXEC_PAUSE_LOOP_EXITING) &&
            ple_gap == 0 )
      {
@@ -1041,6 +1056,9 @@ static int construct_vmcs(struct vcpu *v)
          __vmwrite(POSTED_INTR_NOTIFICATION_VECTOR, posted_intr_vector);
      }
+ /* Disable PML anyway here as it will only be enabled in log dirty mode */
+    v->arch.hvm_vmx.secondary_exec_control &= ~SECONDARY_EXEC_ENABLE_PML;
+
      /* Host data selectors. */
      __vmwrite(HOST_SS_SELECTOR, __HYPERVISOR_DS);
      __vmwrite(HOST_DS_SELECTOR, __HYPERVISOR_DS);
diff --git a/xen/include/asm-x86/hvm/vmx/vmcs.h 
b/xen/include/asm-x86/hvm/vmx/vmcs.h
index 4528346..47b4df2 100644
--- a/xen/include/asm-x86/hvm/vmx/vmcs.h
+++ b/xen/include/asm-x86/hvm/vmx/vmcs.h
@@ -216,6 +216,7 @@ extern u32 vmx_vmentry_control;
  #define SECONDARY_EXEC_ENABLE_INVPCID           0x00001000
  #define SECONDARY_EXEC_ENABLE_VMFUNC            0x00002000
  #define SECONDARY_EXEC_ENABLE_VMCS_SHADOWING    0x00004000
+#define SECONDARY_EXEC_ENABLE_PML               0x00020000
  extern u32 vmx_secondary_exec_control;
#define VMX_EPT_EXEC_ONLY_SUPPORTED 0x00000001
@@ -276,6 +277,8 @@ extern u32 vmx_secondary_exec_control;
      (vmx_pin_based_exec_control & PIN_BASED_POSTED_INTERRUPT)
  #define cpu_has_vmx_vmcs_shadowing \
      (vmx_secondary_exec_control & SECONDARY_EXEC_ENABLE_VMCS_SHADOWING)
+#define cpu_has_vmx_pml \
+    (vmx_secondary_exec_control & SECONDARY_EXEC_ENABLE_PML)
#define VMCS_RID_TYPE_MASK 0x80000000 @@ -320,6 +323,7 @@ enum vmcs_field {
      GUEST_LDTR_SELECTOR             = 0x0000080c,
      GUEST_TR_SELECTOR               = 0x0000080e,
      GUEST_INTR_STATUS               = 0x00000810,
+    GUEST_PML_INDEX                 = 0x00000812,
      HOST_ES_SELECTOR                = 0x00000c00,
      HOST_CS_SELECTOR                = 0x00000c02,
      HOST_SS_SELECTOR                = 0x00000c04,
@@ -333,6 +337,7 @@ enum vmcs_field {
      VM_EXIT_MSR_STORE_ADDR          = 0x00002006,
      VM_EXIT_MSR_LOAD_ADDR           = 0x00002008,
      VM_ENTRY_MSR_LOAD_ADDR          = 0x0000200a,
+    PML_ADDRESS                     = 0x0000200e,
      TSC_OFFSET                      = 0x00002010,
      VIRTUAL_APIC_PAGE_ADDR          = 0x00002012,
      APIC_ACCESS_ADDR                = 0x00002014,
diff --git a/xen/include/asm-x86/hvm/vmx/vmx.h 
b/xen/include/asm-x86/hvm/vmx/vmx.h
index 9afd351..c0e352d 100644
--- a/xen/include/asm-x86/hvm/vmx/vmx.h
+++ b/xen/include/asm-x86/hvm/vmx/vmx.h
@@ -186,6 +186,7 @@ static inline unsigned long pi_get_pir(struct pi_desc 
*pi_desc, int group)
  #define EXIT_REASON_XSETBV              55
  #define EXIT_REASON_APIC_WRITE          56
  #define EXIT_REASON_INVPCID             58
+#define EXIT_REASON_PML_FULL            62
/*
   * Interruption-information format

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.