diff mbox

[08/10] KVM/X86: Use kvm_vcpu_map in emulator_cmpxchg_emulated

Message ID 1519235241-6500-9-git-send-email-karahmed@amazon.de (mailing list archive)
State New, archived
Headers show

Commit Message

KarimAllah Ahmed Feb. 21, 2018, 5:47 p.m. UTC
... since using kvm_vcpu_gpa_to_page() and kmap() will only work for guest
memory that has a "struct page".

Signed-off-by: KarimAllah Ahmed <karahmed@amazon.de>
---
 arch/x86/kvm/x86.c | 13 ++++++-------
 1 file changed, 6 insertions(+), 7 deletions(-)

Comments

KarimAllah Ahmed Feb. 22, 2018, 2:56 a.m. UTC | #1
On Wed, 2018-02-21 at 18:47 +0100, KarimAllah Ahmed wrote:
> ... since using kvm_vcpu_gpa_to_page() and kmap() will only work for guest

> memory that has a "struct page".

> 

> Signed-off-by: KarimAllah Ahmed <karahmed@amazon.de>

> ---

>  arch/x86/kvm/x86.c | 13 ++++++-------

>  1 file changed, 6 insertions(+), 7 deletions(-)

> 

> diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c

> index 37f5df9..197a395 100644

> --- a/arch/x86/kvm/x86.c

> +++ b/arch/x86/kvm/x86.c

> @@ -5013,9 +5013,9 @@ static int emulator_cmpxchg_emulated(struct x86_emulate_ctxt *ctxt,

>  				     unsigned int bytes,

>  				     struct x86_exception *exception)

>  {

> +	struct kvm_host_map map;


"map" here needs to be memset to '0'. Will fix in v2

>  	struct kvm_vcpu *vcpu = emul_to_vcpu(ctxt);

>  	gpa_t gpa;

> -	struct page *page;

>  	char *kaddr;

>  	bool exchanged;

>  

> @@ -5032,12 +5032,11 @@ static int emulator_cmpxchg_emulated(struct x86_emulate_ctxt *ctxt,

>  	if (((gpa + bytes - 1) & PAGE_MASK) != (gpa & PAGE_MASK))

>  		goto emul_write;

>  

> -	page = kvm_vcpu_gfn_to_page(vcpu, gpa >> PAGE_SHIFT);

> -	if (is_error_page(page))

> +	if (!kvm_vcpu_map(vcpu, gpa_to_gfn(gpa), &map))

>  		goto emul_write;

>  

> -	kaddr = kmap_atomic(page);

> -	kaddr += offset_in_page(gpa);

> +	kaddr = map.kaddr + offset_in_page(gpa);

> +

>  	switch (bytes) {

>  	case 1:

>  		exchanged = CMPXCHG_TYPE(u8, kaddr, old, new);

> @@ -5054,8 +5053,8 @@ static int emulator_cmpxchg_emulated(struct x86_emulate_ctxt *ctxt,

>  	default:

>  		BUG();

>  	}

> -	kunmap_atomic(kaddr);

> -	kvm_release_page_dirty(page);

> +

> +	kvm_vcpu_unmap(&map);

>  

>  	if (!exchanged)

>  		return X86EMUL_CMPXCHG_FAILED;
Amazon Development Center Germany GmbH
Berlin - Dresden - Aachen
main office: Krausenstr. 38, 10117 Berlin
Geschaeftsfuehrer: Dr. Ralf Herbrich, Christian Schlaeger
Ust-ID: DE289237879
Eingetragen am Amtsgericht Charlottenburg HRB 149173 B
diff mbox

Patch

diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index 37f5df9..197a395 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -5013,9 +5013,9 @@  static int emulator_cmpxchg_emulated(struct x86_emulate_ctxt *ctxt,
 				     unsigned int bytes,
 				     struct x86_exception *exception)
 {
+	struct kvm_host_map map;
 	struct kvm_vcpu *vcpu = emul_to_vcpu(ctxt);
 	gpa_t gpa;
-	struct page *page;
 	char *kaddr;
 	bool exchanged;
 
@@ -5032,12 +5032,11 @@  static int emulator_cmpxchg_emulated(struct x86_emulate_ctxt *ctxt,
 	if (((gpa + bytes - 1) & PAGE_MASK) != (gpa & PAGE_MASK))
 		goto emul_write;
 
-	page = kvm_vcpu_gfn_to_page(vcpu, gpa >> PAGE_SHIFT);
-	if (is_error_page(page))
+	if (!kvm_vcpu_map(vcpu, gpa_to_gfn(gpa), &map))
 		goto emul_write;
 
-	kaddr = kmap_atomic(page);
-	kaddr += offset_in_page(gpa);
+	kaddr = map.kaddr + offset_in_page(gpa);
+
 	switch (bytes) {
 	case 1:
 		exchanged = CMPXCHG_TYPE(u8, kaddr, old, new);
@@ -5054,8 +5053,8 @@  static int emulator_cmpxchg_emulated(struct x86_emulate_ctxt *ctxt,
 	default:
 		BUG();
 	}
-	kunmap_atomic(kaddr);
-	kvm_release_page_dirty(page);
+
+	kvm_vcpu_unmap(&map);
 
 	if (!exchanged)
 		return X86EMUL_CMPXCHG_FAILED;