* [PATCH 0/1 v2] KVM: MMU: Optimize guest page table walk
@ 2011-04-21 15:32 Takuya Yoshikawa
2011-04-21 15:34 ` [PATCH 1/1 " Takuya Yoshikawa
0 siblings, 1 reply; 18+ messages in thread
From: Takuya Yoshikawa @ 2011-04-21 15:32 UTC (permalink / raw)
To: avi, mtosatti; +Cc: kvm, yoshikawa.takuya, xiaoguangrong, Joerg.Roedel
Changelog v1->v2: dropped slot_hint and wrapper.
As Avi said, get_user() alone achieved most of the improvement.
Before
2.994 us | paging64_walk_addr_generic();
1.480 us | paging64_walk_addr_generic();
0.996 us | paging64_walk_addr_generic();
1.108 us | paging64_walk_addr_generic();
0.962 us | paging64_walk_addr_generic();
2.063 us | paging64_walk_addr_generic();
1.379 us | paging64_walk_addr_generic();
0.962 us | paging64_walk_addr_generic();
1.085 us | paging64_walk_addr_generic();
2.965 us | paging64_walk_addr_generic();
After
2.264 us | paging64_walk_addr_generic();
1.079 us | paging64_walk_addr_generic();
0.648 us | paging64_walk_addr_generic();
0.703 us | paging64_walk_addr_generic();
0.635 us | paging64_walk_addr_generic();
0.869 us | paging64_walk_addr_generic();
0.529 us | paging64_walk_addr_generic();
0.702 us | paging64_walk_addr_generic();
0.529 us | paging64_walk_addr_generic();
0.691 us | paging64_walk_addr_generic();
A little surprise was that the original version itself was
a bit fater than before.
But I tested this with today's latest kvm.git and some parts
had been changed, so it could be.
Anyway, this patch improves by some degree!
Takuya
^ permalink raw reply [flat|nested] 18+ messages in thread
* [PATCH 1/1 v2] KVM: MMU: Optimize guest page table walk
2011-04-21 15:32 [PATCH 0/1 v2] KVM: MMU: Optimize guest page table walk Takuya Yoshikawa
@ 2011-04-21 15:34 ` Takuya Yoshikawa
2011-04-24 7:27 ` Avi Kivity
2011-04-25 8:04 ` Jan Kiszka
0 siblings, 2 replies; 18+ messages in thread
From: Takuya Yoshikawa @ 2011-04-21 15:34 UTC (permalink / raw)
To: avi, mtosatti; +Cc: kvm, yoshikawa.takuya, xiaoguangrong, Joerg.Roedel
From: Takuya Yoshikawa <yoshikawa.takuya@oss.ntt.co.jp>
This patch optimizes the guest page table walk by using get_user()
instead of copy_from_user().
With this patch applied, paging64_walk_addr_generic() has become
about 0.5us to 1.0us faster on my Phenom II machine with NPT on.
Signed-off-by: Takuya Yoshikawa <yoshikawa.takuya@oss.ntt.co.jp>
---
arch/x86/kvm/paging_tmpl.h | 23 ++++++++++++++++++++---
1 files changed, 20 insertions(+), 3 deletions(-)
diff --git a/arch/x86/kvm/paging_tmpl.h b/arch/x86/kvm/paging_tmpl.h
index 74f8567..825d953 100644
--- a/arch/x86/kvm/paging_tmpl.h
+++ b/arch/x86/kvm/paging_tmpl.h
@@ -117,6 +117,7 @@ static int FNAME(walk_addr_generic)(struct guest_walker *walker,
gva_t addr, u32 access)
{
pt_element_t pte;
+ pt_element_t __user *ptep_user;
gfn_t table_gfn;
unsigned index, pt_access, uninitialized_var(pte_access);
gpa_t pte_gpa;
@@ -152,6 +153,9 @@ walk:
pt_access = ACC_ALL;
for (;;) {
+ gfn_t real_gfn;
+ unsigned long host_addr;
+
index = PT_INDEX(addr, walker->level);
table_gfn = gpte_to_gfn(pte);
@@ -160,9 +164,22 @@ walk:
walker->table_gfn[walker->level - 1] = table_gfn;
walker->pte_gpa[walker->level - 1] = pte_gpa;
- if (kvm_read_guest_page_mmu(vcpu, mmu, table_gfn, &pte,
- offset, sizeof(pte),
- PFERR_USER_MASK|PFERR_WRITE_MASK)) {
+ real_gfn = mmu->translate_gpa(vcpu, gfn_to_gpa(table_gfn),
+ PFERR_USER_MASK|PFERR_WRITE_MASK);
+ if (real_gfn == UNMAPPED_GVA) {
+ present = false;
+ break;
+ }
+ real_gfn = gpa_to_gfn(real_gfn);
+
+ host_addr = gfn_to_hva(vcpu->kvm, real_gfn);
+ if (kvm_is_error_hva(host_addr)) {
+ present = false;
+ break;
+ }
+
+ ptep_user = (pt_element_t __user *)((void *)host_addr + offset);
+ if (get_user(pte, ptep_user)) {
present = false;
break;
}
--
1.7.1
^ permalink raw reply related [flat|nested] 18+ messages in thread
* Re: [PATCH 1/1 v2] KVM: MMU: Optimize guest page table walk
2011-04-21 15:34 ` [PATCH 1/1 " Takuya Yoshikawa
@ 2011-04-24 7:27 ` Avi Kivity
2011-04-24 13:15 ` Takuya Yoshikawa
2011-04-25 8:04 ` Jan Kiszka
1 sibling, 1 reply; 18+ messages in thread
From: Avi Kivity @ 2011-04-24 7:27 UTC (permalink / raw)
To: Takuya Yoshikawa
Cc: mtosatti, kvm, yoshikawa.takuya, xiaoguangrong, Joerg.Roedel
On 04/21/2011 06:34 PM, Takuya Yoshikawa wrote:
> From: Takuya Yoshikawa<yoshikawa.takuya@oss.ntt.co.jp>
>
> This patch optimizes the guest page table walk by using get_user()
> instead of copy_from_user().
>
> With this patch applied, paging64_walk_addr_generic() has become
> about 0.5us to 1.0us faster on my Phenom II machine with NPT on.
Applied, thanks. Care to send a follow-on patch that makes
cmpxchg_gpte() use ptep_user instead of calculating it by itself?
--
I have a truly marvellous patch that fixes the bug which this
signature is too narrow to contain.
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 1/1 v2] KVM: MMU: Optimize guest page table walk
2011-04-24 7:27 ` Avi Kivity
@ 2011-04-24 13:15 ` Takuya Yoshikawa
0 siblings, 0 replies; 18+ messages in thread
From: Takuya Yoshikawa @ 2011-04-24 13:15 UTC (permalink / raw)
To: Avi Kivity; +Cc: mtosatti, kvm, yoshikawa.takuya, xiaoguangrong, Joerg.Roedel
On Sun, 24 Apr 2011 10:27:06 +0300
Avi Kivity <avi@redhat.com> wrote:
> On 04/21/2011 06:34 PM, Takuya Yoshikawa wrote:
> > From: Takuya Yoshikawa<yoshikawa.takuya@oss.ntt.co.jp>
> >
> > This patch optimizes the guest page table walk by using get_user()
> > instead of copy_from_user().
> >
> > With this patch applied, paging64_walk_addr_generic() has become
> > about 0.5us to 1.0us faster on my Phenom II machine with NPT on.
>
> Applied, thanks. Care to send a follow-on patch that makes
> cmpxchg_gpte() use ptep_user instead of calculating it by itself?
I'll send the patch soon!
I was not sure if others might be preparing it.
Takuya
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 1/1 v2] KVM: MMU: Optimize guest page table walk
2011-04-21 15:34 ` [PATCH 1/1 " Takuya Yoshikawa
2011-04-24 7:27 ` Avi Kivity
@ 2011-04-25 8:04 ` Jan Kiszka
2011-04-25 8:32 ` Takuya Yoshikawa
2011-04-26 7:42 ` Avi Kivity
1 sibling, 2 replies; 18+ messages in thread
From: Jan Kiszka @ 2011-04-25 8:04 UTC (permalink / raw)
To: Takuya Yoshikawa
Cc: avi, mtosatti, kvm, yoshikawa.takuya, xiaoguangrong, Joerg.Roedel
[-- Attachment #1: Type: text/plain, Size: 2222 bytes --]
On 2011-04-21 17:34, Takuya Yoshikawa wrote:
> From: Takuya Yoshikawa <yoshikawa.takuya@oss.ntt.co.jp>
>
> This patch optimizes the guest page table walk by using get_user()
> instead of copy_from_user().
>
> With this patch applied, paging64_walk_addr_generic() has become
> about 0.5us to 1.0us faster on my Phenom II machine with NPT on.
>
> Signed-off-by: Takuya Yoshikawa <yoshikawa.takuya@oss.ntt.co.jp>
> ---
> arch/x86/kvm/paging_tmpl.h | 23 ++++++++++++++++++++---
> 1 files changed, 20 insertions(+), 3 deletions(-)
>
> diff --git a/arch/x86/kvm/paging_tmpl.h b/arch/x86/kvm/paging_tmpl.h
> index 74f8567..825d953 100644
> --- a/arch/x86/kvm/paging_tmpl.h
> +++ b/arch/x86/kvm/paging_tmpl.h
> @@ -117,6 +117,7 @@ static int FNAME(walk_addr_generic)(struct guest_walker *walker,
> gva_t addr, u32 access)
> {
> pt_element_t pte;
> + pt_element_t __user *ptep_user;
> gfn_t table_gfn;
> unsigned index, pt_access, uninitialized_var(pte_access);
> gpa_t pte_gpa;
> @@ -152,6 +153,9 @@ walk:
> pt_access = ACC_ALL;
>
> for (;;) {
> + gfn_t real_gfn;
> + unsigned long host_addr;
> +
> index = PT_INDEX(addr, walker->level);
>
> table_gfn = gpte_to_gfn(pte);
> @@ -160,9 +164,22 @@ walk:
> walker->table_gfn[walker->level - 1] = table_gfn;
> walker->pte_gpa[walker->level - 1] = pte_gpa;
>
> - if (kvm_read_guest_page_mmu(vcpu, mmu, table_gfn, &pte,
> - offset, sizeof(pte),
> - PFERR_USER_MASK|PFERR_WRITE_MASK)) {
> + real_gfn = mmu->translate_gpa(vcpu, gfn_to_gpa(table_gfn),
> + PFERR_USER_MASK|PFERR_WRITE_MASK);
> + if (real_gfn == UNMAPPED_GVA) {
> + present = false;
> + break;
> + }
> + real_gfn = gpa_to_gfn(real_gfn);
> +
> + host_addr = gfn_to_hva(vcpu->kvm, real_gfn);
> + if (kvm_is_error_hva(host_addr)) {
> + present = false;
> + break;
> + }
> +
> + ptep_user = (pt_element_t __user *)((void *)host_addr + offset);
> + if (get_user(pte, ptep_user)) {
^^^^^^^^^^^^
This doesn't work for x86-32: pte is 64 bit, but get_user is only
defined up to 32 bit on that platform.
Avi, what's your 32-bit buildbot doing? :)
Jan
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 259 bytes --]
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 1/1 v2] KVM: MMU: Optimize guest page table walk
2011-04-25 8:04 ` Jan Kiszka
@ 2011-04-25 8:32 ` Takuya Yoshikawa
2011-04-25 9:15 ` Jan Kiszka
2011-04-26 7:42 ` Avi Kivity
1 sibling, 1 reply; 18+ messages in thread
From: Takuya Yoshikawa @ 2011-04-25 8:32 UTC (permalink / raw)
To: Jan Kiszka
Cc: Takuya Yoshikawa, avi, mtosatti, kvm, xiaoguangrong, Joerg.Roedel
On Mon, 25 Apr 2011 10:04:43 +0200
Jan Kiszka <jan.kiszka@web.de> wrote:
> > +
> > + ptep_user = (pt_element_t __user *)((void *)host_addr + offset);
> > + if (get_user(pte, ptep_user)) {
> ^^^^^^^^^^^^
> This doesn't work for x86-32: pte is 64 bit, but get_user is only
> defined up to 32 bit on that platform.
>
> Avi, what's your 32-bit buildbot doing? :)
>
> Jan
>
Sorry, I did not test on x86_32.
Introducing a wrapper function with ifdef would be the best way?
Takuya
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 1/1 v2] KVM: MMU: Optimize guest page table walk
2011-04-25 8:32 ` Takuya Yoshikawa
@ 2011-04-25 9:15 ` Jan Kiszka
2011-04-26 4:50 ` Takuya Yoshikawa
0 siblings, 1 reply; 18+ messages in thread
From: Jan Kiszka @ 2011-04-25 9:15 UTC (permalink / raw)
To: Takuya Yoshikawa
Cc: Takuya Yoshikawa, avi, mtosatti, kvm, xiaoguangrong, Joerg.Roedel
[-- Attachment #1: Type: text/plain, Size: 746 bytes --]
On 2011-04-25 10:32, Takuya Yoshikawa wrote:
> On Mon, 25 Apr 2011 10:04:43 +0200
> Jan Kiszka <jan.kiszka@web.de> wrote:
>
>>> +
>>> + ptep_user = (pt_element_t __user *)((void *)host_addr + offset);
>>> + if (get_user(pte, ptep_user)) {
>> ^^^^^^^^^^^^
>> This doesn't work for x86-32: pte is 64 bit, but get_user is only
>> defined up to 32 bit on that platform.
>>
>> Avi, what's your 32-bit buildbot doing? :)
>>
>> Jan
>>
>
> Sorry, I did not test on x86_32.
>
> Introducing a wrapper function with ifdef would be the best way?
>
Maybe you could also add the missing 64-bit get_user for x86-32. Given
that we have a corresponding put_user, I wonder why the get_user was
left out.
Jan
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 259 bytes --]
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 1/1 v2] KVM: MMU: Optimize guest page table walk
2011-04-25 9:15 ` Jan Kiszka
@ 2011-04-26 4:50 ` Takuya Yoshikawa
2011-04-26 6:34 ` Jan Kiszka
0 siblings, 1 reply; 18+ messages in thread
From: Takuya Yoshikawa @ 2011-04-26 4:50 UTC (permalink / raw)
To: Jan Kiszka
Cc: Takuya Yoshikawa, avi, mtosatti, kvm, xiaoguangrong, Joerg.Roedel
On Mon, 25 Apr 2011 11:15:20 +0200
Jan Kiszka <jan.kiszka@web.de> wrote:
> > Sorry, I did not test on x86_32.
> >
> > Introducing a wrapper function with ifdef would be the best way?
> >
>
> Maybe you could also add the missing 64-bit get_user for x86-32. Given
> that we have a corresponding put_user, I wonder why the get_user was
> left out.
>
> Jan
>
Google said that there was a similar talk on LKML in 2004.
On that threads, Linus explained how to tackle on the 64-bit get_user
implementation. But I could not see what happened after that.
Takuya
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 1/1 v2] KVM: MMU: Optimize guest page table walk
2011-04-26 4:50 ` Takuya Yoshikawa
@ 2011-04-26 6:34 ` Jan Kiszka
2011-04-26 14:40 ` Takuya Yoshikawa
0 siblings, 1 reply; 18+ messages in thread
From: Jan Kiszka @ 2011-04-26 6:34 UTC (permalink / raw)
To: Takuya Yoshikawa
Cc: Takuya Yoshikawa, avi, mtosatti, kvm, xiaoguangrong, Joerg.Roedel
[-- Attachment #1: Type: text/plain, Size: 843 bytes --]
On 2011-04-26 06:50, Takuya Yoshikawa wrote:
> On Mon, 25 Apr 2011 11:15:20 +0200
> Jan Kiszka <jan.kiszka@web.de> wrote:
>
>>> Sorry, I did not test on x86_32.
>>>
>>> Introducing a wrapper function with ifdef would be the best way?
>>>
>>
>> Maybe you could also add the missing 64-bit get_user for x86-32. Given
>> that we have a corresponding put_user, I wonder why the get_user was
>> left out.
>>
>> Jan
>>
>
> Google said that there was a similar talk on LKML in 2004.
>
> On that threads, Linus explained how to tackle on the 64-bit get_user
> implementation. But I could not see what happened after that.
Mmh, maybe the kernel was lacking a real use case, so no one seriously
cared.
I don't see a fundamental blocker for an x86-32 __get_user_8 version
based on two mov. I would give it a try.
Jan
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 259 bytes --]
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 1/1 v2] KVM: MMU: Optimize guest page table walk
2011-04-25 8:04 ` Jan Kiszka
2011-04-25 8:32 ` Takuya Yoshikawa
@ 2011-04-26 7:42 ` Avi Kivity
2011-04-26 7:45 ` Jan Kiszka
1 sibling, 1 reply; 18+ messages in thread
From: Avi Kivity @ 2011-04-26 7:42 UTC (permalink / raw)
To: Jan Kiszka
Cc: Takuya Yoshikawa, mtosatti, kvm, yoshikawa.takuya, xiaoguangrong,
Joerg.Roedel
On 04/25/2011 11:04 AM, Jan Kiszka wrote:
> > +
> > + ptep_user = (pt_element_t __user *)((void *)host_addr + offset);
> > + if (get_user(pte, ptep_user)) {
> ^^^^^^^^^^^^
> This doesn't work for x86-32: pte is 64 bit, but get_user is only
> defined up to 32 bit on that platform.
>
I actually considered this, and saw:
#ifdef CONFIG_X86_32
#define __get_user_8(__ret_gu, __val_gu, ptr) \
__get_user_x(X, __ret_gu, __val_gu, ptr)
#else
#define __get_user_8(__ret_gu, __val_gu, ptr) \
__get_user_x(8, __ret_gu, __val_gu, ptr)
#endif
#define get_user(x, ptr) \
({ \
int __ret_gu; \
unsigned long __val_gu; \
__chk_user_ptr(ptr); \
might_fault(); \
switch (sizeof(*(ptr))) { \
...
case 8: \
__get_user_8(__ret_gu, __val_gu, ptr); \
break; \
...
} \
(x) = (__typeof__(*(ptr)))__val_gu; \
__ret_gu; \
})
so it should work. How does it fail?
> Avi, what's your 32-bit buildbot doing? :)
I regularly autotest on x86_64, not on i386, sorry.
--
error compiling committee.c: too many arguments to function
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 1/1 v2] KVM: MMU: Optimize guest page table walk
2011-04-26 7:42 ` Avi Kivity
@ 2011-04-26 7:45 ` Jan Kiszka
2011-04-26 8:21 ` Avi Kivity
0 siblings, 1 reply; 18+ messages in thread
From: Jan Kiszka @ 2011-04-26 7:45 UTC (permalink / raw)
To: Avi Kivity
Cc: Takuya Yoshikawa, mtosatti, kvm, yoshikawa.takuya, xiaoguangrong,
Joerg.Roedel
[-- Attachment #1: Type: text/plain, Size: 1710 bytes --]
On 2011-04-26 09:42, Avi Kivity wrote:
> On 04/25/2011 11:04 AM, Jan Kiszka wrote:
>> > +
>> > + ptep_user = (pt_element_t __user *)((void *)host_addr +
>> offset);
>> > + if (get_user(pte, ptep_user)) {
>> ^^^^^^^^^^^^
>> This doesn't work for x86-32: pte is 64 bit, but get_user is only
>> defined up to 32 bit on that platform.
>>
>
> I actually considered this, and saw:
>
> #ifdef CONFIG_X86_32
> #define __get_user_8(__ret_gu, __val_gu, ptr) \
> __get_user_x(X, __ret_gu, __val_gu, ptr)
> #else
> #define __get_user_8(__ret_gu, __val_gu, ptr) \
> __get_user_x(8, __ret_gu, __val_gu, ptr)
> #endif
>
> #define get_user(x, ptr) \
> ({ \
> int __ret_gu; \
> unsigned long __val_gu; \
> __chk_user_ptr(ptr); \
> might_fault(); \
> switch (sizeof(*(ptr))) { \
>
> ...
>
> case 8: \
> __get_user_8(__ret_gu, __val_gu, ptr); \
> break; \
>
> ...
>
> } \
> (x) = (__typeof__(*(ptr)))__val_gu; \
> __ret_gu; \
> })
>
> so it should work. How does it fail?
On x86-32, the above macro resolves to __get_user_X, an undefined symbol.
>
>> Avi, what's your 32-bit buildbot doing? :)
>
> I regularly autotest on x86_64, not on i386, sorry.
Good that it's included in my kvm-kmod buildbot.
Jan
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 259 bytes --]
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 1/1 v2] KVM: MMU: Optimize guest page table walk
2011-04-26 7:45 ` Jan Kiszka
@ 2011-04-26 8:21 ` Avi Kivity
0 siblings, 0 replies; 18+ messages in thread
From: Avi Kivity @ 2011-04-26 8:21 UTC (permalink / raw)
To: Jan Kiszka
Cc: Takuya Yoshikawa, mtosatti, kvm, yoshikawa.takuya, xiaoguangrong,
Joerg.Roedel
On 04/26/2011 10:45 AM, Jan Kiszka wrote:
> On 2011-04-26 09:42, Avi Kivity wrote:
> > On 04/25/2011 11:04 AM, Jan Kiszka wrote:
> >> > +
> >> > + ptep_user = (pt_element_t __user *)((void *)host_addr +
> >> offset);
> >> > + if (get_user(pte, ptep_user)) {
> >> ^^^^^^^^^^^^
> >> This doesn't work for x86-32: pte is 64 bit, but get_user is only
> >> defined up to 32 bit on that platform.
> >>
> >
> > I actually considered this, and saw:
> >
> > #ifdef CONFIG_X86_32
> > #define __get_user_8(__ret_gu, __val_gu, ptr) \
> > __get_user_x(X, __ret_gu, __val_gu, ptr)
> > #else
> > #define __get_user_8(__ret_gu, __val_gu, ptr) \
> > __get_user_x(8, __ret_gu, __val_gu, ptr)
> > #endif
> >
> > #define get_user(x, ptr) \
> > ({ \
> > int __ret_gu; \
> > unsigned long __val_gu; \
> > __chk_user_ptr(ptr); \
> > might_fault(); \
> > switch (sizeof(*(ptr))) { \
> >
> > ...
> >
> > case 8: \
> > __get_user_8(__ret_gu, __val_gu, ptr); \
> > break; \
> >
> > ...
> >
> > } \
> > (x) = (__typeof__(*(ptr)))__val_gu; \
> > __ret_gu; \
> > })
> >
> > so it should work. How does it fail?
>
> On x86-32, the above macro resolves to __get_user_X, an undefined symbol.
>
Tricky stuff.
--
error compiling committee.c: too many arguments to function
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 1/1 v2] KVM: MMU: Optimize guest page table walk
2011-04-26 6:34 ` Jan Kiszka
@ 2011-04-26 14:40 ` Takuya Yoshikawa
2011-04-26 14:54 ` Avi Kivity
0 siblings, 1 reply; 18+ messages in thread
From: Takuya Yoshikawa @ 2011-04-26 14:40 UTC (permalink / raw)
To: Jan Kiszka
Cc: Takuya Yoshikawa, avi, mtosatti, kvm, xiaoguangrong, Joerg.Roedel
On Tue, 26 Apr 2011 08:34:57 +0200
Jan Kiszka <jan.kiszka@web.de> wrote:
> > Google said that there was a similar talk on LKML in 2004.
> >
> > On that threads, Linus explained how to tackle on the 64-bit get_user
> > implementation. But I could not see what happened after that.
>
> Mmh, maybe the kernel was lacking a real use case, so no one seriously
> cared.
>
> I don't see a fundamental blocker for an x86-32 __get_user_8 version
> based on two mov. I would give it a try.
>
> Jan
>
Thank you!
Avi, do we revert the patch now, or ...?
Takuya
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 1/1 v2] KVM: MMU: Optimize guest page table walk
2011-04-26 14:40 ` Takuya Yoshikawa
@ 2011-04-26 14:54 ` Avi Kivity
2011-04-26 15:13 ` Takuya Yoshikawa
2011-04-26 16:26 ` Takuya Yoshikawa
0 siblings, 2 replies; 18+ messages in thread
From: Avi Kivity @ 2011-04-26 14:54 UTC (permalink / raw)
To: Takuya Yoshikawa
Cc: Jan Kiszka, Takuya Yoshikawa, mtosatti, kvm, xiaoguangrong,
Joerg.Roedel
On 04/26/2011 05:40 PM, Takuya Yoshikawa wrote:
> On Tue, 26 Apr 2011 08:34:57 +0200
> Jan Kiszka<jan.kiszka@web.de> wrote:
>
> > > Google said that there was a similar talk on LKML in 2004.
> > >
> > > On that threads, Linus explained how to tackle on the 64-bit get_user
> > > implementation. But I could not see what happened after that.
> >
> > Mmh, maybe the kernel was lacking a real use case, so no one seriously
> > cared.
> >
> > I don't see a fundamental blocker for an x86-32 __get_user_8 version
> > based on two mov. I would give it a try.
> >
> > Jan
> >
>
> Thank you!
>
> Avi, do we revert the patch now, or ...?
Please post a simple patch that uses two get_user()s for that case
(64-bit pte on 32-bit host). Then work with the x86 tree to see if
they'll accept 64-bit get_user(), and once they do, we can go back to a
simple get_user() again.
btw, I think we can use __get_user() here since the address must have
been already validated.
--
error compiling committee.c: too many arguments to function
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 1/1 v2] KVM: MMU: Optimize guest page table walk
2011-04-26 14:54 ` Avi Kivity
@ 2011-04-26 15:13 ` Takuya Yoshikawa
2011-04-26 17:15 ` Avi Kivity
2011-04-26 16:26 ` Takuya Yoshikawa
1 sibling, 1 reply; 18+ messages in thread
From: Takuya Yoshikawa @ 2011-04-26 15:13 UTC (permalink / raw)
To: Avi Kivity
Cc: Jan Kiszka, Takuya Yoshikawa, mtosatti, kvm, xiaoguangrong,
Joerg.Roedel
> Please post a simple patch that uses two get_user()s for that case
> (64-bit pte on 32-bit host). Then work with the x86 tree to see if
> they'll accept 64-bit get_user(), and once they do, we can go back to a
> simple get_user() again.
>
> btw, I think we can use __get_user() here since the address must have
> been already validated.
Yes, I thought that at first.
But don't we need to care KVM's address translation bugs?
Takuya
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 1/1 v2] KVM: MMU: Optimize guest page table walk
2011-04-26 14:54 ` Avi Kivity
2011-04-26 15:13 ` Takuya Yoshikawa
@ 2011-04-26 16:26 ` Takuya Yoshikawa
2011-04-26 17:16 ` Avi Kivity
1 sibling, 1 reply; 18+ messages in thread
From: Takuya Yoshikawa @ 2011-04-26 16:26 UTC (permalink / raw)
To: Avi Kivity
Cc: Jan Kiszka, Takuya Yoshikawa, mtosatti, kvm, xiaoguangrong,
Joerg.Roedel
On Tue, 26 Apr 2011 17:54:24 +0300
Avi Kivity <avi@redhat.com> wrote:
> Please post a simple patch that uses two get_user()s for that case
> (64-bit pte on 32-bit host). Then work with the x86 tree to see if
> they'll accept 64-bit get_user(), and once they do, we can go back to a
> simple get_user() again.
>
I made a patch which seems to reflect what you said!
If this kind of fix is OK with you, I'll test on both x86_32 and x86_64,
and send the patch with some changelog tomorrow.
Thanks,
Takuya
---
arch/x86/kvm/paging_tmpl.h | 16 +++++++++++++++-
1 files changed, 15 insertions(+), 1 deletions(-)
diff --git a/arch/x86/kvm/paging_tmpl.h b/arch/x86/kvm/paging_tmpl.h
index a32a1c8..1e44969 100644
--- a/arch/x86/kvm/paging_tmpl.h
+++ b/arch/x86/kvm/paging_tmpl.h
@@ -115,6 +115,20 @@ static unsigned FNAME(gpte_access)(struct kvm_vcpu *vcpu, pt_element_t gpte)
return access;
}
+static int FNAME(read_gpte)(pt_element_t *pte, pt_element_t __user *ptep_user)
+{
+#if defined(CONFIG_X86_32) && (PTTYPE == 64)
+ u32 *p = (u32 *)pte;
+ u32 __user *p_user = (u32 __user *)ptep_user;
+
+ if (get_user(*p, p_user))
+ return -EFAULT;
+ return get_user(*(p + 1), p_user + 1);
+#else
+ return get_user(*pte, ptep_user);
+#endif
+}
+
/*
* Fetch a guest pte for a guest virtual address
*/
@@ -185,7 +199,7 @@ walk:
}
ptep_user = (pt_element_t __user *)((void *)host_addr + offset);
- if (get_user(pte, ptep_user)) {
+ if (FNAME(read_gpte)(&pte, ptep_user)) {
present = false;
break;
}
--
1.7.1
^ permalink raw reply related [flat|nested] 18+ messages in thread
* Re: [PATCH 1/1 v2] KVM: MMU: Optimize guest page table walk
2011-04-26 15:13 ` Takuya Yoshikawa
@ 2011-04-26 17:15 ` Avi Kivity
0 siblings, 0 replies; 18+ messages in thread
From: Avi Kivity @ 2011-04-26 17:15 UTC (permalink / raw)
To: Takuya Yoshikawa
Cc: Jan Kiszka, Takuya Yoshikawa, mtosatti, kvm, xiaoguangrong,
Joerg.Roedel
On 04/26/2011 06:13 PM, Takuya Yoshikawa wrote:
> > Please post a simple patch that uses two get_user()s for that case
> > (64-bit pte on 32-bit host). Then work with the x86 tree to see if
> > they'll accept 64-bit get_user(), and once they do, we can go back to a
> > simple get_user() again.
> >
> > btw, I think we can use __get_user() here since the address must have
> > been already validated.
>
> Yes, I thought that at first.
>
> But don't we need to care KVM's address translation bugs?
It's a pity to do a runtime check when we can do a setup time check
instead. So let's review the setup code and then use __get_user().
--
error compiling committee.c: too many arguments to function
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 1/1 v2] KVM: MMU: Optimize guest page table walk
2011-04-26 16:26 ` Takuya Yoshikawa
@ 2011-04-26 17:16 ` Avi Kivity
0 siblings, 0 replies; 18+ messages in thread
From: Avi Kivity @ 2011-04-26 17:16 UTC (permalink / raw)
To: Takuya Yoshikawa
Cc: Jan Kiszka, Takuya Yoshikawa, mtosatti, kvm, xiaoguangrong,
Joerg.Roedel
On 04/26/2011 07:26 PM, Takuya Yoshikawa wrote:
> On Tue, 26 Apr 2011 17:54:24 +0300
> Avi Kivity<avi@redhat.com> wrote:
>
> > Please post a simple patch that uses two get_user()s for that case
> > (64-bit pte on 32-bit host). Then work with the x86 tree to see if
> > they'll accept 64-bit get_user(), and once they do, we can go back to a
> > simple get_user() again.
> >
>
> I made a patch which seems to reflect what you said!
> If this kind of fix is OK with you, I'll test on both x86_32 and x86_64,
> and send the patch with some changelog tomorrow.
>
Yes, that looks right.
--
error compiling committee.c: too many arguments to function
^ permalink raw reply [flat|nested] 18+ messages in thread
end of thread, other threads:[~2011-04-26 17:16 UTC | newest]
Thread overview: 18+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-04-21 15:32 [PATCH 0/1 v2] KVM: MMU: Optimize guest page table walk Takuya Yoshikawa
2011-04-21 15:34 ` [PATCH 1/1 " Takuya Yoshikawa
2011-04-24 7:27 ` Avi Kivity
2011-04-24 13:15 ` Takuya Yoshikawa
2011-04-25 8:04 ` Jan Kiszka
2011-04-25 8:32 ` Takuya Yoshikawa
2011-04-25 9:15 ` Jan Kiszka
2011-04-26 4:50 ` Takuya Yoshikawa
2011-04-26 6:34 ` Jan Kiszka
2011-04-26 14:40 ` Takuya Yoshikawa
2011-04-26 14:54 ` Avi Kivity
2011-04-26 15:13 ` Takuya Yoshikawa
2011-04-26 17:15 ` Avi Kivity
2011-04-26 16:26 ` Takuya Yoshikawa
2011-04-26 17:16 ` Avi Kivity
2011-04-26 7:42 ` Avi Kivity
2011-04-26 7:45 ` Jan Kiszka
2011-04-26 8:21 ` Avi Kivity
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).