Re: [PATCH 5/6] Nested SVM: Implement INVLPGA

2009-05-18 Thread Alexander Graf


On 15.05.2009, at 15:43, Joerg Roedel wrote:


On Fri, May 15, 2009 at 10:22:19AM +0200, Alexander Graf wrote:

SVM adds another way to do INVLPG by ASID which Hyper-V makes use of,
so let's implement it!

For now we just do the same thing invlpg does, as asid switching
means we flush the mmu anyways. That might change one day though.

Signed-off-by: Alexander Graf ag...@suse.de
---
arch/x86/kvm/svm.c |   14 +-
1 files changed, 13 insertions(+), 1 deletions(-)

diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c
index 30e6b43..b2c6cf3 100644
--- a/arch/x86/kvm/svm.c
+++ b/arch/x86/kvm/svm.c
@@ -1785,6 +1785,18 @@ static int clgi_interception(struct vcpu_svm  
*svm, struct kvm_run *kvm_run)

return 1;
}

+static int invlpga_interception(struct vcpu_svm *svm, struct  
kvm_run *kvm_run)

+{
+   struct kvm_vcpu *vcpu = svm-vcpu;
+   nsvm_printk(INVLPGA\n);
+   svm-next_rip = kvm_rip_read(svm-vcpu) + 3;
+   skip_emulated_instruction(svm-vcpu);
+
+   kvm_mmu_reset_context(vcpu);
+   kvm_mmu_load(vcpu);
+   return 1;
+}
+


Hmm, since we flush the TLB on every nested-guest entry I think we can
make this function a nop.


Well we flush the TLB on every VMRUN, but this is still 100% within  
the 2nd level guest, so I think we should do something, no?.


Alex

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


Re: [PATCH 5/6] Nested SVM: Implement INVLPGA

2009-05-18 Thread Marcelo Tosatti
On Sun, May 17, 2009 at 11:03:52PM +0300, Avi Kivity wrote:
 Avi Kivity wrote:

 Hmm, since we flush the TLB on every nested-guest entry I think we can
 make this function a nop.
   

 I think, unless it specified ASID 0?  In that case you need a local  
 tlb flush.

 (the kvm_mmu_reset_context() and kvm_mmu_load() are total overkills in  
 any case).


 Oh, but we do need to resync OOS pages, here for ASID 0 and on guest  
 entry.  Marcelo?

Right, call kvm_mmu_invlpg() with the linear address passed to INVLPGA.

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


Re: [PATCH 5/6] Nested SVM: Implement INVLPGA

2009-05-17 Thread Avi Kivity

Avi Kivity wrote:


Hmm, since we flush the TLB on every nested-guest entry I think we can
make this function a nop.
  


I think, unless it specified ASID 0?  In that case you need a local 
tlb flush.


(the kvm_mmu_reset_context() and kvm_mmu_load() are total overkills in 
any case).




Oh, but we do need to resync OOS pages, here for ASID 0 and on guest 
entry.  Marcelo?


--
Do not meddle in the internals of kernels, for they are subtle and quick to 
panic.

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


[PATCH 5/6] Nested SVM: Implement INVLPGA

2009-05-15 Thread Alexander Graf
SVM adds another way to do INVLPG by ASID which Hyper-V makes use of,
so let's implement it!

For now we just do the same thing invlpg does, as asid switching
means we flush the mmu anyways. That might change one day though.

Signed-off-by: Alexander Graf ag...@suse.de
---
 arch/x86/kvm/svm.c |   14 +-
 1 files changed, 13 insertions(+), 1 deletions(-)

diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c
index 30e6b43..b2c6cf3 100644
--- a/arch/x86/kvm/svm.c
+++ b/arch/x86/kvm/svm.c
@@ -1785,6 +1785,18 @@ static int clgi_interception(struct vcpu_svm *svm, 
struct kvm_run *kvm_run)
return 1;
 }
 
+static int invlpga_interception(struct vcpu_svm *svm, struct kvm_run *kvm_run)
+{
+   struct kvm_vcpu *vcpu = svm-vcpu;
+   nsvm_printk(INVLPGA\n);
+   svm-next_rip = kvm_rip_read(svm-vcpu) + 3;
+   skip_emulated_instruction(svm-vcpu);
+
+   kvm_mmu_reset_context(vcpu);
+   kvm_mmu_load(vcpu);
+   return 1;
+}
+
 static int invalid_op_interception(struct vcpu_svm *svm,
   struct kvm_run *kvm_run)
 {
@@ -2130,7 +2142,7 @@ static int (*svm_exit_handlers[])(struct vcpu_svm *svm,
[SVM_EXIT_INVD] = emulate_on_interception,
[SVM_EXIT_HLT]  = halt_interception,
[SVM_EXIT_INVLPG]   = invlpg_interception,
-   [SVM_EXIT_INVLPGA]  = invalid_op_interception,
+   [SVM_EXIT_INVLPGA]  = invlpga_interception,
[SVM_EXIT_IOIO] = io_interception,
[SVM_EXIT_MSR]  = msr_interception,
[SVM_EXIT_TASK_SWITCH]  = task_switch_interception,
-- 
1.6.0.2

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


Re: [PATCH 5/6] Nested SVM: Implement INVLPGA

2009-05-15 Thread Joerg Roedel
On Fri, May 15, 2009 at 10:22:19AM +0200, Alexander Graf wrote:
 SVM adds another way to do INVLPG by ASID which Hyper-V makes use of,
 so let's implement it!
 
 For now we just do the same thing invlpg does, as asid switching
 means we flush the mmu anyways. That might change one day though.
 
 Signed-off-by: Alexander Graf ag...@suse.de
 ---
  arch/x86/kvm/svm.c |   14 +-
  1 files changed, 13 insertions(+), 1 deletions(-)
 
 diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c
 index 30e6b43..b2c6cf3 100644
 --- a/arch/x86/kvm/svm.c
 +++ b/arch/x86/kvm/svm.c
 @@ -1785,6 +1785,18 @@ static int clgi_interception(struct vcpu_svm *svm, 
 struct kvm_run *kvm_run)
   return 1;
  }
  
 +static int invlpga_interception(struct vcpu_svm *svm, struct kvm_run 
 *kvm_run)
 +{
 + struct kvm_vcpu *vcpu = svm-vcpu;
 + nsvm_printk(INVLPGA\n);
 + svm-next_rip = kvm_rip_read(svm-vcpu) + 3;
 + skip_emulated_instruction(svm-vcpu);
 +
 + kvm_mmu_reset_context(vcpu);
 + kvm_mmu_load(vcpu);
 + return 1;
 +}
 +

Hmm, since we flush the TLB on every nested-guest entry I think we can
make this function a nop.

  static int invalid_op_interception(struct vcpu_svm *svm,
  struct kvm_run *kvm_run)
  {
 @@ -2130,7 +2142,7 @@ static int (*svm_exit_handlers[])(struct vcpu_svm *svm,
   [SVM_EXIT_INVD] = emulate_on_interception,
   [SVM_EXIT_HLT]  = halt_interception,
   [SVM_EXIT_INVLPG]   = invlpg_interception,
 - [SVM_EXIT_INVLPGA]  = invalid_op_interception,
 + [SVM_EXIT_INVLPGA]  = invlpga_interception,
   [SVM_EXIT_IOIO] = io_interception,
   [SVM_EXIT_MSR]  = msr_interception,
   [SVM_EXIT_TASK_SWITCH]  = task_switch_interception,
 -- 
 1.6.0.2
 
 

-- 
   | Advanced Micro Devices GmbH
 Operating | Karl-Hammerschmidt-Str. 34, 85609 Dornach bei München
 System| 
 Research  | Geschäftsführer: Thomas M. McCoy, Giuliano Meroni
 Center| Sitz: Dornach, Gemeinde Aschheim, Landkreis München
   | Registergericht München, HRB Nr. 43632

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