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

Re: [Xen-devel] [v2 04/11] vmx: add PML definition and feature detection.



> From: Kai Huang [mailto:kai.huang@xxxxxxxxxxxxxxx]
> Sent: Wednesday, April 15, 2015 3:04 PM
> 
> 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        | 22 ++++++++++++++++++++++
>  xen/include/asm-x86/hvm/vmx/vmcs.h |  6 ++++++
>  xen/include/asm-x86/hvm/vmx/vmx.h  |  1 +
>  3 files changed, 29 insertions(+)
> 
> diff --git a/xen/arch/x86/hvm/vmx/vmcs.c b/xen/arch/x86/hvm/vmx/vmcs.c
> index 4fff46d..d120370 100644
> --- a/xen/arch/x86/hvm/vmx/vmcs.c
> +++ b/xen/arch/x86/hvm/vmx/vmcs.c
> @@ -141,6 +141,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 )
> @@ -238,6 +239,8 @@ static int vmx_init_vmcs_config(void)
>              opt |= SECONDARY_EXEC_ENABLE_VPID;
>          if ( opt_unrestricted_guest_enabled )
>              opt |= SECONDARY_EXEC_UNRESTRICTED_GUEST;
> +        if ( opt_pml_enabled )
> +            opt |= SECONDARY_EXEC_ENABLE_PML;
> 
>          /*
>           * "APIC Register Virtualization" and "Virtual Interrupt Delivery"
> @@ -284,6 +287,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 the check anyway.
> +         */
> +        if ( !(_vmx_ept_vpid_cap & VMX_EPT_AD_BIT) )
> +            _vmx_secondary_exec_control &=
> ~SECONDARY_EXEC_ENABLE_PML;
>      }

the comment is not very clear. I think you just want to say "EPT A/D bit is
required for PML" or no comment at all.

> 
>      if ( _vmx_secondary_exec_control & SECONDARY_EXEC_ENABLE_EPT )
> @@ -304,6 +315,14 @@ static int vmx_init_vmcs_config(void)
>                    SECONDARY_EXEC_UNRESTRICTED_GUEST);
>      }
> 
> +    /* PML cannot be supported if EPT is not used */
> +    if ( !(_vmx_secondary_exec_control &
> SECONDARY_EXEC_ENABLE_EPT) )
> +        _vmx_secondary_exec_control &=
> ~SECONDARY_EXEC_ENABLE_PML;
> +
> +    /* Turn off opt_pml_enabled if PML feature is not present */
> +    if ( !(_vmx_secondary_exec_control &
> SECONDARY_EXEC_ENABLE_PML) )
> +        opt_pml_enabled = 0;
> +
>      if ( (_vmx_secondary_exec_control &
> SECONDARY_EXEC_PAUSE_LOOP_EXITING) &&
>            ple_gap == 0 )
>      {
> @@ -1039,6 +1058,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 6fce6aa..f831a78 100644
> --- a/xen/include/asm-x86/hvm/vmx/vmcs.h
> +++ b/xen/include/asm-x86/hvm/vmx/vmcs.h
> @@ -215,6 +215,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
> @@ -226,6 +227,7 @@ extern u32 vmx_secondary_exec_control;
>  #define VMX_EPT_INVEPT_INSTRUCTION              0x00100000
>  #define VMX_EPT_INVEPT_SINGLE_CONTEXT           0x02000000
>  #define VMX_EPT_INVEPT_ALL_CONTEXT              0x04000000
> +#define VMX_EPT_AD_BIT                          0x00200000
> 
>  #define VMX_MISC_VMWRITE_ALL                    0x20000000
> 
> @@ -274,6 +276,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
> 
> @@ -318,6 +322,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,
> @@ -331,6 +336,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 91c5e18..50f1bfc 100644
> --- a/xen/include/asm-x86/hvm/vmx/vmx.h
> +++ b/xen/include/asm-x86/hvm/vmx/vmx.h
> @@ -185,6 +185,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
> --
> 2.1.0


_______________________________________________
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®.