public inbox for kvm@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/2 rebased] KVM: MMU: Avoid dropping accessed bit while removing write access
@ 2010-12-05 16:11 Takuya Yoshikawa
  2010-12-05 16:13 ` [PATCH 2/2 rebased] KVM: MMU: Introduce a helper to access lpage_info Takuya Yoshikawa
  0 siblings, 1 reply; 8+ messages in thread
From: Takuya Yoshikawa @ 2010-12-05 16:11 UTC (permalink / raw)
  To: avi, mtosatti; +Cc: kvm, yoshikawa.takuya

From: Takuya Yoshikawa <yoshikawa.takuya@oss.ntt.co.jp>

One more "KVM: MMU: Don't drop accessed bit while updating an spte."

Sptes are accessed by both kvm and hardware.
This patch uses update_spte() to fix the way of removing write access.

Signed-off-by: Takuya Yoshikawa <yoshikawa.takuya@oss.ntt.co.jp>
---
 arch/x86/kvm/mmu.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c
index 04c49b9..d75ba1e 100644
--- a/arch/x86/kvm/mmu.c
+++ b/arch/x86/kvm/mmu.c
@@ -3446,7 +3446,7 @@ void kvm_mmu_slot_remove_write_access(struct kvm *kvm, int slot)
 		for (i = 0; i < PT64_ENT_PER_PAGE; ++i)
 			/* avoid RMW */
 			if (is_writable_pte(pt[i]))
-				pt[i] &= ~PT_WRITABLE_MASK;
+				update_spte(&pt[i], pt[i] & ~PT_WRITABLE_MASK);
 	}
 	kvm_flush_remote_tlbs(kvm);
 }
-- 
1.7.1


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

* [PATCH 2/2 rebased] KVM: MMU: Introduce a helper to access lpage_info
  2010-12-05 16:11 [PATCH 1/2 rebased] KVM: MMU: Avoid dropping accessed bit while removing write access Takuya Yoshikawa
@ 2010-12-05 16:13 ` Takuya Yoshikawa
  2010-12-06  6:37   ` Xiao Guangrong
  0 siblings, 1 reply; 8+ messages in thread
From: Takuya Yoshikawa @ 2010-12-05 16:13 UTC (permalink / raw)
  To: avi, mtosatti; +Cc: kvm, yoshikawa.takuya

From: Takuya Yoshikawa <yoshikawa.takuya@oss.ntt.co.jp>

Index calculation to access lpage_info appears three times.
A helper is worthwhile.

Signed-off-by: Takuya Yoshikawa <yoshikawa.takuya@oss.ntt.co.jp>
---
 arch/x86/kvm/mmu.c |   20 +++++++++++---------
 1 files changed, 11 insertions(+), 9 deletions(-)

diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c
index d75ba1e..e434503 100644
--- a/arch/x86/kvm/mmu.c
+++ b/arch/x86/kvm/mmu.c
@@ -476,6 +476,12 @@ static void kvm_mmu_page_set_gfn(struct kvm_mmu_page *sp, int index, gfn_t gfn)
 		sp->gfns[index] = gfn;
 }
 
+static unsigned long lpage_idx(gfn_t gfn, gfn_t base_gfn, int level)
+{
+	return (gfn >> KVM_HPAGE_GFN_SHIFT(level)) -
+	       (base_gfn >> KVM_HPAGE_GFN_SHIFT(level));
+}
+
 /*
  * Return the pointer to the largepage write count for a given
  * gfn, handling slots that are not large page aligned.
@@ -484,10 +490,8 @@ static int *slot_largepage_idx(gfn_t gfn,
 			       struct kvm_memory_slot *slot,
 			       int level)
 {
-	unsigned long idx;
+	unsigned long idx = lpage_idx(gfn, slot->base_gfn, level);
 
-	idx = (gfn >> KVM_HPAGE_GFN_SHIFT(level)) -
-	      (slot->base_gfn >> KVM_HPAGE_GFN_SHIFT(level));
 	return &slot->lpage_info[level - 2][idx].write_count;
 }
 
@@ -591,8 +595,7 @@ static unsigned long *gfn_to_rmap(struct kvm *kvm, gfn_t gfn, int level)
 	if (likely(level == PT_PAGE_TABLE_LEVEL))
 		return &slot->rmap[gfn - slot->base_gfn];
 
-	idx = (gfn >> KVM_HPAGE_GFN_SHIFT(level)) -
-		(slot->base_gfn >> KVM_HPAGE_GFN_SHIFT(level));
+	idx = lpage_idx(gfn, slot->base_gfn, level);
 
 	return &slot->lpage_info[level - 2][idx].rmap_pde;
 }
@@ -887,11 +890,10 @@ static int kvm_handle_hva(struct kvm *kvm, unsigned long hva,
 
 			for (j = 0; j < KVM_NR_PAGE_SIZES - 1; ++j) {
 				unsigned long idx;
-				int sh;
 
-				sh = KVM_HPAGE_GFN_SHIFT(PT_DIRECTORY_LEVEL+j);
-				idx = ((memslot->base_gfn+gfn_offset) >> sh) -
-					(memslot->base_gfn >> sh);
+				idx = lpage_idx(memslot->base_gfn + gfn_offset,
+						memslot->base_gfn,
+						PT_DIRECTORY_LEVEL + j);
 				ret |= handler(kvm,
 					&memslot->lpage_info[j][idx].rmap_pde,
 					data);
-- 
1.7.1


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

* Re: [PATCH 2/2 rebased] KVM: MMU: Introduce a helper to access lpage_info
  2010-12-05 16:13 ` [PATCH 2/2 rebased] KVM: MMU: Introduce a helper to access lpage_info Takuya Yoshikawa
@ 2010-12-06  6:37   ` Xiao Guangrong
  2010-12-06  7:55     ` Takuya Yoshikawa
  0 siblings, 1 reply; 8+ messages in thread
From: Xiao Guangrong @ 2010-12-06  6:37 UTC (permalink / raw)
  To: Takuya Yoshikawa; +Cc: avi, mtosatti, kvm, yoshikawa.takuya

On 12/06/2010 12:13 AM, Takuya Yoshikawa wrote:
> From: Takuya Yoshikawa <yoshikawa.takuya@oss.ntt.co.jp>
> 
> Index calculation to access lpage_info appears three times.
> A helper is worthwhile.
> 

Why not get lpage_info instead of index in the helper?

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

* Re: [PATCH 2/2 rebased] KVM: MMU: Introduce a helper to access lpage_info
  2010-12-06  6:37   ` Xiao Guangrong
@ 2010-12-06  7:55     ` Takuya Yoshikawa
  2010-12-06  8:57       ` Takuya Yoshikawa
  0 siblings, 1 reply; 8+ messages in thread
From: Takuya Yoshikawa @ 2010-12-06  7:55 UTC (permalink / raw)
  To: Xiao Guangrong; +Cc: Takuya Yoshikawa, avi, mtosatti, kvm

(2010/12/06 15:37), Xiao Guangrong wrote:
> On 12/06/2010 12:13 AM, Takuya Yoshikawa wrote:
>> From: Takuya Yoshikawa<yoshikawa.takuya@oss.ntt.co.jp>
>>
>> Index calculation to access lpage_info appears three times.
>> A helper is worthwhile.
>>
>
> Why not get lpage_info instead of index in the helper?

Seems a better way! I didn't think about it.

I'll check and resend [2/2] if it's OK.

Thanks,
   Takuya

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

* Re: [PATCH 2/2 rebased] KVM: MMU: Introduce a helper to access lpage_info
  2010-12-06  7:55     ` Takuya Yoshikawa
@ 2010-12-06  8:57       ` Takuya Yoshikawa
  2010-12-06 13:07         ` Avi Kivity
  0 siblings, 1 reply; 8+ messages in thread
From: Takuya Yoshikawa @ 2010-12-06  8:57 UTC (permalink / raw)
  To: Xiao Guangrong; +Cc: Takuya Yoshikawa, avi, mtosatti, kvm

(2010/12/06 16:55), Takuya Yoshikawa wrote:
> (2010/12/06 15:37), Xiao Guangrong wrote:
>> On 12/06/2010 12:13 AM, Takuya Yoshikawa wrote:
>>> From: Takuya Yoshikawa<yoshikawa.takuya@oss.ntt.co.jp>
>>>
>>> Index calculation to access lpage_info appears three times.
>>> A helper is worthwhile.
>>>
>>
>> Why not get lpage_info instead of index in the helper?
>
> Seems a better way! I didn't think about it.
>
> I'll check and resend [2/2] if it's OK.
>

Sadly, the structure of lpage_info has no name.

Returning rmap_pde may be another possible cleanup.

But I don't know it's worthwhile.


Thanks,
   Takuya

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

* Re: [PATCH 2/2 rebased] KVM: MMU: Introduce a helper to access lpage_info
  2010-12-06  8:57       ` Takuya Yoshikawa
@ 2010-12-06 13:07         ` Avi Kivity
  2010-12-07  3:59           ` [PATCH 2/2 v2] KVM: MMU: Make the way of accessing lpage_info more generic Takuya Yoshikawa
  0 siblings, 1 reply; 8+ messages in thread
From: Avi Kivity @ 2010-12-06 13:07 UTC (permalink / raw)
  To: Takuya Yoshikawa; +Cc: Xiao Guangrong, Takuya Yoshikawa, mtosatti, kvm

On 12/06/2010 10:57 AM, Takuya Yoshikawa wrote:
> (2010/12/06 16:55), Takuya Yoshikawa wrote:
>> (2010/12/06 15:37), Xiao Guangrong wrote:
>>> On 12/06/2010 12:13 AM, Takuya Yoshikawa wrote:
>>>> From: Takuya Yoshikawa<yoshikawa.takuya@oss.ntt.co.jp>
>>>>
>>>> Index calculation to access lpage_info appears three times.
>>>> A helper is worthwhile.
>>>>
>>>
>>> Why not get lpage_info instead of index in the helper?
>>
>> Seems a better way! I didn't think about it.
>>
>> I'll check and resend [2/2] if it's OK.
>>
>
> Sadly, the structure of lpage_info has no name.
>

Well, you can give it a name.  Meanwhile I've applied patch 1, thanks.

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


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

* [PATCH 2/2 v2] KVM: MMU: Make the way of accessing lpage_info more generic
  2010-12-06 13:07         ` Avi Kivity
@ 2010-12-07  3:59           ` Takuya Yoshikawa
  2010-12-07 13:55             ` Avi Kivity
  0 siblings, 1 reply; 8+ messages in thread
From: Takuya Yoshikawa @ 2010-12-07  3:59 UTC (permalink / raw)
  To: Avi Kivity; +Cc: Xiao Guangrong, Takuya Yoshikawa, mtosatti, kvm

> 
> Well, you can give it a name.  Meanwhile I've applied patch 1, thanks.
> 

How about this?

===
Subject: [PATCH] KVM: MMU: Make the way of accessing lpage_info more generic

Large page information has two elements but one of them, write_count, alone
is accessed by a helper function.

This patch replaces this helper function with more generic one which returns
newly named kvm_lpage_info structure and use it to access the other element
rmap_pde.

Signed-off-by: Takuya Yoshikawa <yoshikawa.takuya@oss.ntt.co.jp>
---
 Change log
   v1->v2: adapted Xiao and Avi's advice to return lpage_info but idx.

 arch/x86/kvm/mmu.c       |   54 +++++++++++++++++++++------------------------
 include/linux/kvm_host.h |   10 +++++---
 2 files changed, 31 insertions(+), 33 deletions(-)

diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c
index d75ba1e..102d2a7 100644
--- a/arch/x86/kvm/mmu.c
+++ b/arch/x86/kvm/mmu.c
@@ -477,46 +477,46 @@ static void kvm_mmu_page_set_gfn(struct kvm_mmu_page *sp, int index, gfn_t gfn)
 }
 
 /*
- * Return the pointer to the largepage write count for a given
- * gfn, handling slots that are not large page aligned.
+ * Return the pointer to the large page information for a given gfn,
+ * handling slots that are not large page aligned.
  */
-static int *slot_largepage_idx(gfn_t gfn,
-			       struct kvm_memory_slot *slot,
-			       int level)
+static struct kvm_lpage_info *lpage_info_slot(gfn_t gfn,
+					      struct kvm_memory_slot *slot,
+					      int level)
 {
 	unsigned long idx;
 
 	idx = (gfn >> KVM_HPAGE_GFN_SHIFT(level)) -
 	      (slot->base_gfn >> KVM_HPAGE_GFN_SHIFT(level));
-	return &slot->lpage_info[level - 2][idx].write_count;
+	return &slot->lpage_info[level - 2][idx];
 }
 
 static void account_shadowed(struct kvm *kvm, gfn_t gfn)
 {
 	struct kvm_memory_slot *slot;
-	int *write_count;
+	struct kvm_lpage_info *linfo;
 	int i;
 
 	slot = gfn_to_memslot(kvm, gfn);
 	for (i = PT_DIRECTORY_LEVEL;
 	     i < PT_PAGE_TABLE_LEVEL + KVM_NR_PAGE_SIZES; ++i) {
-		write_count   = slot_largepage_idx(gfn, slot, i);
-		*write_count += 1;
+		linfo = lpage_info_slot(gfn, slot, i);
+		linfo->write_count += 1;
 	}
 }
 
 static void unaccount_shadowed(struct kvm *kvm, gfn_t gfn)
 {
 	struct kvm_memory_slot *slot;
-	int *write_count;
+	struct kvm_lpage_info *linfo;
 	int i;
 
 	slot = gfn_to_memslot(kvm, gfn);
 	for (i = PT_DIRECTORY_LEVEL;
 	     i < PT_PAGE_TABLE_LEVEL + KVM_NR_PAGE_SIZES; ++i) {
-		write_count   = slot_largepage_idx(gfn, slot, i);
-		*write_count -= 1;
-		WARN_ON(*write_count < 0);
+		linfo = lpage_info_slot(gfn, slot, i);
+		linfo->write_count -= 1;
+		WARN_ON(linfo->write_count < 0);
 	}
 }
 
@@ -525,12 +525,12 @@ static int has_wrprotected_page(struct kvm *kvm,
 				int level)
 {
 	struct kvm_memory_slot *slot;
-	int *largepage_idx;
+	struct kvm_lpage_info *linfo;
 
 	slot = gfn_to_memslot(kvm, gfn);
 	if (slot) {
-		largepage_idx = slot_largepage_idx(gfn, slot, level);
-		return *largepage_idx;
+		linfo = lpage_info_slot(gfn, slot, level);
+		return linfo->write_count;
 	}
 
 	return 1;
@@ -585,16 +585,15 @@ static int mapping_level(struct kvm_vcpu *vcpu, gfn_t large_gfn)
 static unsigned long *gfn_to_rmap(struct kvm *kvm, gfn_t gfn, int level)
 {
 	struct kvm_memory_slot *slot;
-	unsigned long idx;
+	struct kvm_lpage_info *linfo;
 
 	slot = gfn_to_memslot(kvm, gfn);
 	if (likely(level == PT_PAGE_TABLE_LEVEL))
 		return &slot->rmap[gfn - slot->base_gfn];
 
-	idx = (gfn >> KVM_HPAGE_GFN_SHIFT(level)) -
-		(slot->base_gfn >> KVM_HPAGE_GFN_SHIFT(level));
+	linfo = lpage_info_slot(gfn, slot, level);
 
-	return &slot->lpage_info[level - 2][idx].rmap_pde;
+	return &linfo->rmap_pde;
 }
 
 /*
@@ -882,19 +881,16 @@ static int kvm_handle_hva(struct kvm *kvm, unsigned long hva,
 		end = start + (memslot->npages << PAGE_SHIFT);
 		if (hva >= start && hva < end) {
 			gfn_t gfn_offset = (hva - start) >> PAGE_SHIFT;
+			gfn_t gfn = memslot->base_gfn + gfn_offset;
 
 			ret = handler(kvm, &memslot->rmap[gfn_offset], data);
 
 			for (j = 0; j < KVM_NR_PAGE_SIZES - 1; ++j) {
-				unsigned long idx;
-				int sh;
-
-				sh = KVM_HPAGE_GFN_SHIFT(PT_DIRECTORY_LEVEL+j);
-				idx = ((memslot->base_gfn+gfn_offset) >> sh) -
-					(memslot->base_gfn >> sh);
-				ret |= handler(kvm,
-					&memslot->lpage_info[j][idx].rmap_pde,
-					data);
+				struct kvm_lpage_info *linfo;
+
+				linfo = lpage_info_slot(gfn, memslot,
+							PT_DIRECTORY_LEVEL + j);
+				ret |= handler(kvm, &linfo->rmap_pde, data);
 			}
 			trace_kvm_age_page(hva, memslot, ret);
 			retval |= ret;
diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h
index ac4e83a..bd0da8f 100644
--- a/include/linux/kvm_host.h
+++ b/include/linux/kvm_host.h
@@ -146,6 +146,11 @@ struct kvm_vcpu {
  */
 #define KVM_MEM_MAX_NR_PAGES ((1UL << 31) - 1)
 
+struct kvm_lpage_info {
+	unsigned long rmap_pde;
+	int write_count;
+};
+
 struct kvm_memory_slot {
 	gfn_t base_gfn;
 	unsigned long npages;
@@ -153,10 +158,7 @@ struct kvm_memory_slot {
 	unsigned long *rmap;
 	unsigned long *dirty_bitmap;
 	unsigned long *dirty_bitmap_head;
-	struct {
-		unsigned long rmap_pde;
-		int write_count;
-	} *lpage_info[KVM_NR_PAGE_SIZES - 1];
+	struct kvm_lpage_info *lpage_info[KVM_NR_PAGE_SIZES - 1];
 	unsigned long userspace_addr;
 	int user_alloc;
 	int id;
-- 
1.7.1


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

* Re: [PATCH 2/2 v2] KVM: MMU: Make the way of accessing lpage_info more generic
  2010-12-07  3:59           ` [PATCH 2/2 v2] KVM: MMU: Make the way of accessing lpage_info more generic Takuya Yoshikawa
@ 2010-12-07 13:55             ` Avi Kivity
  0 siblings, 0 replies; 8+ messages in thread
From: Avi Kivity @ 2010-12-07 13:55 UTC (permalink / raw)
  To: Takuya Yoshikawa; +Cc: Xiao Guangrong, Takuya Yoshikawa, mtosatti, kvm

On 12/07/2010 05:59 AM, Takuya Yoshikawa wrote:
> >
> >  Well, you can give it a name.  Meanwhile I've applied patch 1, thanks.
> >
>
> How about this?

Looks good, applied, thanks.

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


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

end of thread, other threads:[~2010-12-07 13:56 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-12-05 16:11 [PATCH 1/2 rebased] KVM: MMU: Avoid dropping accessed bit while removing write access Takuya Yoshikawa
2010-12-05 16:13 ` [PATCH 2/2 rebased] KVM: MMU: Introduce a helper to access lpage_info Takuya Yoshikawa
2010-12-06  6:37   ` Xiao Guangrong
2010-12-06  7:55     ` Takuya Yoshikawa
2010-12-06  8:57       ` Takuya Yoshikawa
2010-12-06 13:07         ` Avi Kivity
2010-12-07  3:59           ` [PATCH 2/2 v2] KVM: MMU: Make the way of accessing lpage_info more generic Takuya Yoshikawa
2010-12-07 13:55             ` Avi Kivity

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox