diff mbox

[v2,06/12] KVM: MMU: introduce a static table to map guest access to spte access

Message ID 50FFB658.6040205@linux.vnet.ibm.com (mailing list archive)
State New, archived
Headers show

Commit Message

Xiao Guangrong Jan. 23, 2013, 10:07 a.m. UTC
It makes set_spte more clean and reduces branch prediction

Signed-off-by: Xiao Guangrong <xiaoguangrong@linux.vnet.ibm.com>
---
 arch/x86/kvm/mmu.c |   37 ++++++++++++++++++++++++++-----------
 1 files changed, 26 insertions(+), 11 deletions(-)

Comments

Marcelo Tosatti Jan. 25, 2013, 12:15 a.m. UTC | #1
On Wed, Jan 23, 2013 at 06:07:20PM +0800, Xiao Guangrong wrote:
> It makes set_spte more clean and reduces branch prediction
> 
> Signed-off-by: Xiao Guangrong <xiaoguangrong@linux.vnet.ibm.com>
> ---
>  arch/x86/kvm/mmu.c |   37 ++++++++++++++++++++++++++-----------
>  1 files changed, 26 insertions(+), 11 deletions(-)

Don't see set_spte as being a performance problem?
IMO the current code is quite simple.



--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Xiao Guangrong Jan. 25, 2013, 2:46 a.m. UTC | #2
On 01/25/2013 08:15 AM, Marcelo Tosatti wrote:
> On Wed, Jan 23, 2013 at 06:07:20PM +0800, Xiao Guangrong wrote:
>> It makes set_spte more clean and reduces branch prediction
>>
>> Signed-off-by: Xiao Guangrong <xiaoguangrong@linux.vnet.ibm.com>
>> ---
>>  arch/x86/kvm/mmu.c |   37 ++++++++++++++++++++++++++-----------
>>  1 files changed, 26 insertions(+), 11 deletions(-)
> 
> Don't see set_spte as being a performance problem?
> IMO the current code is quite simple.

Yes, this is not a performance problem.

I just dislike this many continuous "if"-s in the function:

if (xxx)
	xxx
if (xxx)
	xxx
....

Totally, it has 7 "if"-s before this patch.

Okay, if you think this is unnecessary, i will drop this patch. :)

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Marcelo Tosatti Jan. 29, 2013, 12:07 a.m. UTC | #3
On Fri, Jan 25, 2013 at 10:46:31AM +0800, Xiao Guangrong wrote:
> On 01/25/2013 08:15 AM, Marcelo Tosatti wrote:
> > On Wed, Jan 23, 2013 at 06:07:20PM +0800, Xiao Guangrong wrote:
> >> It makes set_spte more clean and reduces branch prediction
> >>
> >> Signed-off-by: Xiao Guangrong <xiaoguangrong@linux.vnet.ibm.com>
> >> ---
> >>  arch/x86/kvm/mmu.c |   37 ++++++++++++++++++++++++++-----------
> >>  1 files changed, 26 insertions(+), 11 deletions(-)
> > 
> > Don't see set_spte as being a performance problem?
> > IMO the current code is quite simple.
> 
> Yes, this is not a performance problem.
> 
> I just dislike this many continuous "if"-s in the function:
> 
> if (xxx)
> 	xxx
> if (xxx)
> 	xxx
> ....
> 
> Totally, it has 7 "if"-s before this patch.
> 
> Okay, if you think this is unnecessary, i will drop this patch. :)

Yes, please (unless you can show set_spte is a performance problem).


--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Marcelo Tosatti Jan. 29, 2013, 1:07 a.m. UTC | #4
On Mon, Jan 28, 2013 at 10:07:15PM -0200, Marcelo Tosatti wrote:
> On Fri, Jan 25, 2013 at 10:46:31AM +0800, Xiao Guangrong wrote:
> > On 01/25/2013 08:15 AM, Marcelo Tosatti wrote:
> > > On Wed, Jan 23, 2013 at 06:07:20PM +0800, Xiao Guangrong wrote:
> > >> It makes set_spte more clean and reduces branch prediction
> > >>
> > >> Signed-off-by: Xiao Guangrong <xiaoguangrong@linux.vnet.ibm.com>
> > >> ---
> > >>  arch/x86/kvm/mmu.c |   37 ++++++++++++++++++++++++++-----------
> > >>  1 files changed, 26 insertions(+), 11 deletions(-)
> > > 
> > > Don't see set_spte as being a performance problem?
> > > IMO the current code is quite simple.
> > 
> > Yes, this is not a performance problem.
> > 
> > I just dislike this many continuous "if"-s in the function:
> > 
> > if (xxx)
> > 	xxx
> > if (xxx)
> > 	xxx
> > ....
> > 
> > Totally, it has 7 "if"-s before this patch.
> > 
> > Okay, if you think this is unnecessary, i will drop this patch. :)
> 
> Yes, please (unless you can show set_spte is a performance problem).

Same thing for spte fast drop: is it a performance problem? 

Please try to group changes into smaller, less controversial sets with 
a clear goal:

- Debated performance improvement.
- Cleanups (eg mmu_set_spte argument removal).
- Bug fixes.
- Performance improvements.

Thanks.

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Gleb Natapov Jan. 29, 2013, 1:16 p.m. UTC | #5
On Mon, Jan 28, 2013 at 11:07:58PM -0200, Marcelo Tosatti wrote:
> On Mon, Jan 28, 2013 at 10:07:15PM -0200, Marcelo Tosatti wrote:
> > On Fri, Jan 25, 2013 at 10:46:31AM +0800, Xiao Guangrong wrote:
> > > On 01/25/2013 08:15 AM, Marcelo Tosatti wrote:
> > > > On Wed, Jan 23, 2013 at 06:07:20PM +0800, Xiao Guangrong wrote:
> > > >> It makes set_spte more clean and reduces branch prediction
> > > >>
> > > >> Signed-off-by: Xiao Guangrong <xiaoguangrong@linux.vnet.ibm.com>
> > > >> ---
> > > >>  arch/x86/kvm/mmu.c |   37 ++++++++++++++++++++++++++-----------
> > > >>  1 files changed, 26 insertions(+), 11 deletions(-)
> > > > 
> > > > Don't see set_spte as being a performance problem?
> > > > IMO the current code is quite simple.
> > > 
> > > Yes, this is not a performance problem.
> > > 
> > > I just dislike this many continuous "if"-s in the function:
> > > 
> > > if (xxx)
> > > 	xxx
> > > if (xxx)
> > > 	xxx
> > > ....
> > > 
> > > Totally, it has 7 "if"-s before this patch.
> > > 
> > > Okay, if you think this is unnecessary, i will drop this patch. :)
> > 
> > Yes, please (unless you can show set_spte is a performance problem).
> 
> Same thing for spte fast drop: is it a performance problem? 
> 
I like spte fast drop because it gets rid of "goto restart" pattern.
for_each_spte_in_rmap_safe() can be the alternative.

> Please try to group changes into smaller, less controversial sets with 
> a clear goal:
> 
> - Debated performance improvement.
> - Cleanups (eg mmu_set_spte argument removal).
> - Bug fixes.
> - Performance improvements.
> 
> Thanks.

--
			Gleb.
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Xiao Guangrong Jan. 30, 2013, 3:53 a.m. UTC | #6
On 01/29/2013 09:07 AM, Marcelo Tosatti wrote:
> On Mon, Jan 28, 2013 at 10:07:15PM -0200, Marcelo Tosatti wrote:
>> On Fri, Jan 25, 2013 at 10:46:31AM +0800, Xiao Guangrong wrote:
>>> On 01/25/2013 08:15 AM, Marcelo Tosatti wrote:
>>>> On Wed, Jan 23, 2013 at 06:07:20PM +0800, Xiao Guangrong wrote:
>>>>> It makes set_spte more clean and reduces branch prediction
>>>>>
>>>>> Signed-off-by: Xiao Guangrong <xiaoguangrong@linux.vnet.ibm.com>
>>>>> ---
>>>>>  arch/x86/kvm/mmu.c |   37 ++++++++++++++++++++++++++-----------
>>>>>  1 files changed, 26 insertions(+), 11 deletions(-)
>>>>
>>>> Don't see set_spte as being a performance problem?
>>>> IMO the current code is quite simple.
>>>
>>> Yes, this is not a performance problem.
>>>
>>> I just dislike this many continuous "if"-s in the function:
>>>
>>> if (xxx)
>>> 	xxx
>>> if (xxx)
>>> 	xxx
>>> ....
>>>
>>> Totally, it has 7 "if"-s before this patch.
>>>
>>> Okay, if you think this is unnecessary, i will drop this patch. :)
>>
>> Yes, please (unless you can show set_spte is a performance problem).
> 
> Same thing for spte fast drop: is it a performance problem? 

It does not fix a performance problem. The patch does optimization on the
noncrucial path and cleanup for the previous patch.

> 
> Please try to group changes into smaller, less controversial sets with 
> a clear goal:

Ah. I thought they are simple and most of them have been reviewed, so i putted
them into one group, now i know i made a mistake. ;)

> 
> - Debated performance improvement.
> - Cleanups (eg mmu_set_spte argument removal).
> - Bug fixes.
> - Performance improvements.

Okay. I will split the long series into these set:

Set 1 for improvement:
[PATCH v2 01/12] KVM: MMU: lazily drop large spte

Set 2 for cleanups:
[PATCH v2 02/12] KVM: MMU: cleanup mapping-level
[PATCH v2 07/12] KVM: MMU: remove pt_access in mmu_set_spte
[PATCH v2 08/12] KVM: MMU: cleanup __direct_map

Set 3 for simplifying set spte path:
[PATCH v2 03/12] KVM: MMU: simplify mmu_set_spte
[PATCH v2 04/12] KVM: MMU: simplify set_spte
[PATCH v2 05/12] KVM: MMU: introduce vcpu_adjust_access

Set 4 for fixing and unifying rmap walking
[PATCH v2 11/12] KVM: MMU: fix spte assertion
[PATCH v2 09/12] KVM: MMU: introduce mmu_spte_establish
[PATCH v2 10/12] KVM: MMU: unify the code of walking pte list
[PATCH v2 12/12] KVM: MMU: fast drop all spte on the pte_list

Thanks!

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c
index 43b7e0c..a8a9c0e 100644
--- a/arch/x86/kvm/mmu.c
+++ b/arch/x86/kvm/mmu.c
@@ -235,6 +235,29 @@  static inline u64 rsvd_bits(int s, int e)
 	return ((1ULL << (e - s + 1)) - 1) << s;
 }

+static u64 gaccess_to_spte_access[ACC_ALL + 1];
+static void build_access_table(void)
+{
+	int access;
+
+	for (access = 0; access < ACC_ALL + 1; access++) {
+		u64 spte_access = 0;
+
+		if (access & ACC_EXEC_MASK)
+			spte_access |= shadow_x_mask;
+		else
+			spte_access |= shadow_nx_mask;
+
+		if (access & ACC_USER_MASK)
+			spte_access |= shadow_user_mask;
+
+		if (access & ACC_WRITE_MASK)
+			spte_access |= PT_WRITABLE_MASK | SPTE_MMU_WRITEABLE;
+
+		gaccess_to_spte_access[access] = spte_access;
+	}
+}
+
 void kvm_mmu_set_mask_ptes(u64 user_mask, u64 accessed_mask,
 		u64 dirty_mask, u64 nx_mask, u64 x_mask)
 {
@@ -243,6 +266,7 @@  void kvm_mmu_set_mask_ptes(u64 user_mask, u64 accessed_mask,
 	shadow_dirty_mask = dirty_mask;
 	shadow_nx_mask = nx_mask;
 	shadow_x_mask = x_mask;
+	build_access_table();
 }
 EXPORT_SYMBOL_GPL(kvm_mmu_set_mask_ptes);

@@ -2391,20 +2415,11 @@  static int set_spte(struct kvm_vcpu *vcpu, u64 *sptep,
 	if (!speculative)
 		spte |= shadow_accessed_mask;

-	if (pte_access & ACC_EXEC_MASK)
-		spte |= shadow_x_mask;
-	else
-		spte |= shadow_nx_mask;
-
-	if (pte_access & ACC_USER_MASK)
-		spte |= shadow_user_mask;
-
-	if (pte_access & ACC_WRITE_MASK)
-		spte |= PT_WRITABLE_MASK | SPTE_MMU_WRITEABLE;
-
 	if (level > PT_PAGE_TABLE_LEVEL)
 		spte |= PT_PAGE_SIZE_MASK;

+	spte |= gaccess_to_spte_access[pte_access];
+
 	if (tdp_enabled)
 		spte |= kvm_x86_ops->get_mt_mask(vcpu, gfn,
 			kvm_is_mmio_pfn(pfn));