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@xxxxxxxxx> > --- > 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