Message ID | 1519235241-6500-9-git-send-email-karahmed@amazon.de (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
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 --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;
... 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(-)