All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2 1/4] Add EPT A/D bits definitions
@ 2012-05-21  3:54 Xudong Hao
  2012-05-21  3:54 ` [PATCH v2 2/4] Add parameter to control A/D bits support Xudong Hao
                   ` (2 more replies)
  0 siblings, 3 replies; 6+ messages in thread
From: Xudong Hao @ 2012-05-21  3:54 UTC (permalink / raw)
  To: avi
  Cc: kvm, linux-kernel, takuya.yoshikawa, xiantao.zhang, Xudong Hao,
	Haitao Shan

Add EPT A/D bits definitions.

Signed-off-by: Haitao Shan <haitao.shan@intel.com>
Signed-off-by: Xudong Hao <xudong.hao@intel.com>
---
 arch/x86/include/asm/vmx.h |    4 ++++
 1 files changed, 4 insertions(+), 0 deletions(-)

diff --git a/arch/x86/include/asm/vmx.h b/arch/x86/include/asm/vmx.h
index 31f180c..de007c2 100644
--- a/arch/x86/include/asm/vmx.h
+++ b/arch/x86/include/asm/vmx.h
@@ -404,6 +404,7 @@ enum vmcs_field {
 #define VMX_EPTP_WB_BIT				(1ull << 14)
 #define VMX_EPT_2MB_PAGE_BIT			(1ull << 16)
 #define VMX_EPT_1GB_PAGE_BIT			(1ull << 17)
+#define VMX_EPT_AD_BIT					(1ull << 21)
 #define VMX_EPT_EXTENT_INDIVIDUAL_BIT		(1ull << 24)
 #define VMX_EPT_EXTENT_CONTEXT_BIT		(1ull << 25)
 #define VMX_EPT_EXTENT_GLOBAL_BIT		(1ull << 26)
@@ -415,11 +416,14 @@ enum vmcs_field {
 #define VMX_EPT_MAX_GAW				0x4
 #define VMX_EPT_MT_EPTE_SHIFT			3
 #define VMX_EPT_GAW_EPTP_SHIFT			3
+#define VMX_EPT_AD_ENABLE_BIT			(1ull << 6)
 #define VMX_EPT_DEFAULT_MT			0x6ull
 #define VMX_EPT_READABLE_MASK			0x1ull
 #define VMX_EPT_WRITABLE_MASK			0x2ull
 #define VMX_EPT_EXECUTABLE_MASK			0x4ull
 #define VMX_EPT_IPAT_BIT    			(1ull << 6)
+#define VMX_EPT_ACCESS_BIT				(1ull << 8)
+#define VMX_EPT_DIRTY_BIT				(1ull << 9)
 
 #define VMX_EPT_IDENTITY_PAGETABLE_ADDR		0xfffbc000ul
 
-- 
1.5.6


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH v2 2/4] Add parameter to control A/D bits support
  2012-05-21  3:54 [PATCH v2 1/4] Add EPT A/D bits definitions Xudong Hao
@ 2012-05-21  3:54 ` Xudong Hao
  2012-05-21  3:54 ` [PATCH v2 3/4] Enable EPT A/D bits if supported by turning on relevant bit in EPTP Xudong Hao
  2012-05-21  3:54 ` [PATCH v2 4/4] Enabling Access bit when doing memory swapping Xudong Hao
  2 siblings, 0 replies; 6+ messages in thread
From: Xudong Hao @ 2012-05-21  3:54 UTC (permalink / raw)
  To: avi
  Cc: kvm, linux-kernel, takuya.yoshikawa, xiantao.zhang, Xudong Hao,
	Haitao Shan

Add kernel parameter to control A/D bits support, it's on by default.

Signed-off-by: Haitao Shan <haitao.shan@intel.com>
Signed-off-by: Xudong Hao <xudong.hao@intel.com>
---
 arch/x86/kvm/vmx.c |   12 ++++++++++++
 1 files changed, 12 insertions(+), 0 deletions(-)

diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
index 3062ea9..f3858bf 100644
--- a/arch/x86/kvm/vmx.c
+++ b/arch/x86/kvm/vmx.c
@@ -71,6 +71,9 @@ static bool __read_mostly enable_unrestricted_guest = 1;
 module_param_named(unrestricted_guest,
 			enable_unrestricted_guest, bool, S_IRUGO);
 
+static bool __read_mostly enable_ept_ad_bits = 1;
+module_param_named(eptad, enable_ept_ad_bits, bool, S_IRUGO);
+
 static bool __read_mostly emulate_invalid_guest_state = 0;
 module_param(emulate_invalid_guest_state, bool, S_IRUGO);
 
@@ -786,6 +789,11 @@ static inline bool cpu_has_vmx_ept_4levels(void)
 	return vmx_capability.ept & VMX_EPT_PAGE_WALK_4_BIT;
 }
 
+static inline bool cpu_has_vmx_ept_ad_bits(void)
+{
+	return vmx_capability.ept & VMX_EPT_AD_BIT;
+}
+
 static inline bool cpu_has_vmx_invept_individual_addr(void)
 {
 	return vmx_capability.ept & VMX_EPT_EXTENT_INDIVIDUAL_BIT;
@@ -2624,8 +2632,12 @@ static __init int hardware_setup(void)
 	    !cpu_has_vmx_ept_4levels()) {
 		enable_ept = 0;
 		enable_unrestricted_guest = 0;
+		enable_ept_ad_bits = 0;
 	}
 
+	if (!cpu_has_vmx_ept_ad_bits())
+		enable_ept_ad_bits = 0;
+
 	if (!cpu_has_vmx_unrestricted_guest())
 		enable_unrestricted_guest = 0;
 
-- 
1.5.6


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH v2 3/4] Enable EPT A/D bits if supported by turning on relevant bit in EPTP
  2012-05-21  3:54 [PATCH v2 1/4] Add EPT A/D bits definitions Xudong Hao
  2012-05-21  3:54 ` [PATCH v2 2/4] Add parameter to control A/D bits support Xudong Hao
@ 2012-05-21  3:54 ` Xudong Hao
  2012-05-21  3:54 ` [PATCH v2 4/4] Enabling Access bit when doing memory swapping Xudong Hao
  2 siblings, 0 replies; 6+ messages in thread
From: Xudong Hao @ 2012-05-21  3:54 UTC (permalink / raw)
  To: avi
  Cc: kvm, linux-kernel, takuya.yoshikawa, xiantao.zhang, Xudong Hao,
	Haitao Shan

In EPT page structure entry, Enable EPT A/D bits if processor supported.

Signed-off-by: Haitao Shan <haitao.shan@intel.com>
Signed-off-by: Xudong Hao <xudong.hao@intel.com>
---
 arch/x86/kvm/vmx.c |    2 ++
 1 files changed, 2 insertions(+), 0 deletions(-)

diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
index f3858bf..e8003b6 100644
--- a/arch/x86/kvm/vmx.c
+++ b/arch/x86/kvm/vmx.c
@@ -3018,6 +3018,8 @@ static u64 construct_eptp(unsigned long root_hpa)
 	/* TODO write the value reading from MSR */
 	eptp = VMX_EPT_DEFAULT_MT |
 		VMX_EPT_DEFAULT_GAW << VMX_EPT_GAW_EPTP_SHIFT;
+	if (enable_ept_ad_bits)
+		eptp |= VMX_EPT_AD_ENABLE_BIT;
 	eptp |= (root_hpa & PAGE_MASK);
 
 	return eptp;
-- 
1.5.6


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH v2 4/4] Enabling Access bit when doing memory swapping
  2012-05-21  3:54 [PATCH v2 1/4] Add EPT A/D bits definitions Xudong Hao
  2012-05-21  3:54 ` [PATCH v2 2/4] Add parameter to control A/D bits support Xudong Hao
  2012-05-21  3:54 ` [PATCH v2 3/4] Enable EPT A/D bits if supported by turning on relevant bit in EPTP Xudong Hao
@ 2012-05-21  3:54 ` Xudong Hao
  2012-05-21  8:21   ` Avi Kivity
  2 siblings, 1 reply; 6+ messages in thread
From: Xudong Hao @ 2012-05-21  3:54 UTC (permalink / raw)
  To: avi
  Cc: kvm, linux-kernel, takuya.yoshikawa, xiantao.zhang, Xudong Hao,
	Haitao Shan

Enabling Access bit when doing memory swapping.

Signed-off-by: Haitao Shan <haitao.shan@intel.com>
Signed-off-by: Xudong Hao <xudong.hao@intel.com>
---
 arch/x86/kvm/mmu.c |   13 +++++++------
 arch/x86/kvm/vmx.c |    6 ++++--
 2 files changed, 11 insertions(+), 8 deletions(-)

diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c
index 07424cf..392bdf3 100644
--- a/arch/x86/kvm/mmu.c
+++ b/arch/x86/kvm/mmu.c
@@ -1232,7 +1232,8 @@ static int kvm_age_rmapp(struct kvm *kvm, unsigned long *rmapp,
 	int young = 0;
 
 	/*
-	 * Emulate the accessed bit for EPT, by checking if this page has
+	 * In case of absence of EPT Access and Dirty Bits supports,
+	 * emulate the accessed bit for EPT, by checking if this page has
 	 * an EPT mapping, and clearing it if it does. On the next access,
 	 * a new EPT mapping will be established.
 	 * This has some overhead, but not as much as the cost of swapping
@@ -1243,11 +1244,11 @@ static int kvm_age_rmapp(struct kvm *kvm, unsigned long *rmapp,
 
 	for (sptep = rmap_get_first(*rmapp, &iter); sptep;
 	     sptep = rmap_get_next(&iter)) {
-		BUG_ON(!(*sptep & PT_PRESENT_MASK));
+		BUG_ON(!is_shadow_present_pte(*sptep));
 
-		if (*sptep & PT_ACCESSED_MASK) {
+		if (*sptep & shadow_accessed_mask) {
 			young = 1;
-			clear_bit(PT_ACCESSED_SHIFT, (unsigned long *)sptep);
+			*sptep &= ~shadow_accessed_mask;
 		}
 	}
 
@@ -1271,9 +1272,9 @@ static int kvm_test_age_rmapp(struct kvm *kvm, unsigned long *rmapp,
 
 	for (sptep = rmap_get_first(*rmapp, &iter); sptep;
 	     sptep = rmap_get_next(&iter)) {
-		BUG_ON(!(*sptep & PT_PRESENT_MASK));
+		BUG_ON(!is_shadow_present_pte(*sptep));
 
-		if (*sptep & PT_ACCESSED_MASK) {
+		if (*sptep & shadow_accessed_mask) {
 			young = 1;
 			break;
 		}
diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
index e8003b6..342ea2e 100644
--- a/arch/x86/kvm/vmx.c
+++ b/arch/x86/kvm/vmx.c
@@ -7259,8 +7259,10 @@ static int __init vmx_init(void)
 	vmx_disable_intercept_for_msr(MSR_IA32_SYSENTER_EIP, false);
 
 	if (enable_ept) {
-		kvm_mmu_set_mask_ptes(0ull, 0ull, 0ull, 0ull,
-				VMX_EPT_EXECUTABLE_MASK);
+		kvm_mmu_set_mask_ptes(0ull,
+			(enable_ept_ad_bits) ? VMX_EPT_ACCESS_BIT : 0ull,
+			(enable_ept_ad_bits) ? VMX_EPT_DIRTY_BIT : 0ull,
+			0ull, VMX_EPT_EXECUTABLE_MASK);
 		ept_set_mmio_spte_mask();
 		kvm_enable_tdp();
 	} else
-- 
1.5.6


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH v2 4/4] Enabling Access bit when doing memory swapping
  2012-05-21  3:54 ` [PATCH v2 4/4] Enabling Access bit when doing memory swapping Xudong Hao
@ 2012-05-21  8:21   ` Avi Kivity
  0 siblings, 0 replies; 6+ messages in thread
From: Avi Kivity @ 2012-05-21  8:21 UTC (permalink / raw)
  To: Xudong Hao
  Cc: kvm, linux-kernel, takuya.yoshikawa, xiantao.zhang, Haitao Shan

On 05/21/2012 06:54 AM, Xudong Hao wrote:
> Enabling Access bit when doing memory swapping.
>
> @@ -1243,11 +1244,11 @@ static int kvm_age_rmapp(struct kvm *kvm, unsigned long *rmapp,
>  
>  	for (sptep = rmap_get_first(*rmapp, &iter); sptep;
>  	     sptep = rmap_get_next(&iter)) {
> -		BUG_ON(!(*sptep & PT_PRESENT_MASK));
> +		BUG_ON(!is_shadow_present_pte(*sptep));
>  
> -		if (*sptep & PT_ACCESSED_MASK) {
> +		if (*sptep & shadow_accessed_mask) {
>  			young = 1;
> -			clear_bit(PT_ACCESSED_SHIFT, (unsigned long *)sptep);
> +			*sptep &= ~shadow_accessed_mask;
>  		}
>  	}

As Marcelo already noted, this converts an atomic operation into a
non-atomic one.


-- 
error compiling committee.c: too many arguments to function


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH v2 2/4] Add parameter to control A/D bits support
@ 2012-05-16 10:51 Xudong Hao
  0 siblings, 0 replies; 6+ messages in thread
From: Xudong Hao @ 2012-05-16 10:51 UTC (permalink / raw)
  To: Avi Kivity; +Cc: kvm, linux-kernel, Haitao Shan, Xiantao Zhang, Xudong Hao

Add kernel parameter to control A/D bits support, it's on by default.

Changes from v1:
-Use bool type for enable_ept_ad_bit.
-Use "eptad" to replace "ept_ad_bits".

Signed-off-by: Haitao Shan <haitao.shan@intel.com>
Signed-off-by: Xudong Hao <xudong.hao@intel.com>
---
 arch/x86/kvm/vmx.c |   12 ++++++++++++
 1 files changed, 12 insertions(+), 0 deletions(-)

diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
index d2bd719..811a61e 100644
--- a/arch/x86/kvm/vmx.c
+++ b/arch/x86/kvm/vmx.c
@@ -64,6 +64,9 @@ static bool __read_mostly enable_unrestricted_guest = 1;
 module_param_named(unrestricted_guest,
            enable_unrestricted_guest, bool, S_IRUGO);

+static bool __read_mostly enable_ept_ad_bits = 1;
+module_param_named(eptad, enable_ept_ad_bits, bool, S_IRUGO);
+
 static bool __read_mostly emulate_invalid_guest_state = 0;
 module_param(emulate_invalid_guest_state, bool, S_IRUGO);

@@ -779,6 +782,11 @@ static inline bool cpu_has_vmx_ept_4levels(void)
    return vmx_capability.ept & VMX_EPT_PAGE_WALK_4_BIT;
 }

+static inline bool cpu_has_vmx_ept_ad_bits(void)
+{
+   return vmx_capability.ept & VMX_EPT_AD_BIT;
+}
+
 static inline bool cpu_has_vmx_invept_individual_addr(void)
 {
    return vmx_capability.ept & VMX_EPT_EXTENT_INDIVIDUAL_BIT;
@@ -2611,8 +2619,12 @@ static __init int hardware_setup(void)
        !cpu_has_vmx_ept_4levels()) {
        enable_ept = 0;
        enable_unrestricted_guest = 0;
+       enable_ept_ad_bits = 0;
    }

+   if (!cpu_has_vmx_ept_ad_bits())
+       enable_ept_ad_bits = 0;
+
    if (!cpu_has_vmx_unrestricted_guest())
        enable_unrestricted_guest = 0;

--
1.7.1


^ permalink raw reply related	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2012-05-21  8:21 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-05-21  3:54 [PATCH v2 1/4] Add EPT A/D bits definitions Xudong Hao
2012-05-21  3:54 ` [PATCH v2 2/4] Add parameter to control A/D bits support Xudong Hao
2012-05-21  3:54 ` [PATCH v2 3/4] Enable EPT A/D bits if supported by turning on relevant bit in EPTP Xudong Hao
2012-05-21  3:54 ` [PATCH v2 4/4] Enabling Access bit when doing memory swapping Xudong Hao
2012-05-21  8:21   ` Avi Kivity
  -- strict thread matches above, loose matches on Subject: below --
2012-05-16 10:51 [PATCH v2 2/4] Add parameter to control A/D bits support Xudong Hao

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.