diff options
author | Tim Deegan <tim@xen.org> | 2012-03-09 16:54:24 +0000 |
---|---|---|
committer | Tim Deegan <tim@xen.org> | 2012-03-09 16:54:24 +0000 |
commit | 77b8dfec88acdc71138e3af7e2603ad8d72eb926 (patch) | |
tree | cf2ae8ca8d87601b4f8704da4aa4842fd00d3e48 | |
parent | 69b701b237fcc0f1da918b1832891ba4d80c880a (diff) | |
download | xen-77b8dfec88acdc71138e3af7e2603ad8d72eb926.tar.gz xen-77b8dfec88acdc71138e3af7e2603ad8d72eb926.tar.bz2 xen-77b8dfec88acdc71138e3af7e2603ad8d72eb926.zip |
x86/mm: drop gfn ref before calling handle_mmio()
Otherwise we get a deadlock between the p2m lock and the event lock,
which handle_mmio() acquires.
Signed-off-by: Tim Deegan <tim@xen.org>
Acked-by: Andres Lagar-Cavilla <andres@lagarcavilla.org>
-rw-r--r-- | xen/arch/x86/hvm/hvm.c | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c index df4326cce6..85b18a604e 100644 --- a/xen/arch/x86/hvm/hvm.c +++ b/xen/arch/x86/hvm/hvm.c @@ -1324,10 +1324,11 @@ int hvm_hap_nested_page_fault(unsigned long gpa, if ( (p2mt == p2m_mmio_dm) || (access_w && (p2mt == p2m_ram_ro)) ) { + put_gfn(p2m->domain, gfn); if ( !handle_mmio() ) hvm_inject_exception(TRAP_gp_fault, 0, 0); rc = 1; - goto out_put_gfn; + goto out; } #ifdef __x86_64__ @@ -1379,6 +1380,7 @@ int hvm_hap_nested_page_fault(unsigned long gpa, out_put_gfn: put_gfn(p2m->domain, gfn); +out: if ( paged ) p2m_mem_paging_populate(v->domain, gfn); if ( req_ptr ) |