diff options
author | Jan Beulich <jbeulich@suse.com> | 2020-09-11 14:16:14 +0200 |
---|---|---|
committer | Jan Beulich <jbeulich@suse.com> | 2020-09-11 14:16:14 +0200 |
commit | 0fcfe9d95f8bb1d53cf68038f13bc3563020e8cd (patch) | |
tree | 734c8ea77f64e26fa7ca2e3d228fe5e4e047d226 | |
parent | e5a1b6f0d2070c7a03f0f2cff5126a5fea94cc4d (diff) |
x86/PV: fold exit paths of ptwr_do_page_fault()
One less aspect to keep an eye on for things to stay in sync.
Signed-off-by: Jan Beulich <jbeulich@suse.com>
Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
-rw-r--r-- | xen/arch/x86/pv/ro-page-fault.c | 20 |
1 files changed, 7 insertions, 13 deletions
diff --git a/xen/arch/x86/pv/ro-page-fault.c b/xen/arch/x86/pv/ro-page-fault.c index 0eedb70002..556ee7ca11 100644 --- a/xen/arch/x86/pv/ro-page-fault.c +++ b/xen/arch/x86/pv/ro-page-fault.c @@ -262,29 +262,23 @@ static int ptwr_do_page_fault(struct x86_emulate_ctxt *ctxt, .pte = pte, }; struct page_info *page; - int rc; + int rc = X86EMUL_UNHANDLEABLE; page = get_page_from_mfn(l1e_get_mfn(pte), current->domain); if ( !page ) return X86EMUL_UNHANDLEABLE; - if ( !page_lock(page) ) + if ( page_lock(page) ) { - put_page(page); - return X86EMUL_UNHANDLEABLE; - } + if ( (page->u.inuse.type_info & PGT_type_mask) == PGT_l1_page_table ) + { + ctxt->data = &ptwr_ctxt; + rc = x86_emulate(ctxt, &ptwr_emulate_ops); + } - if ( (page->u.inuse.type_info & PGT_type_mask) != PGT_l1_page_table ) - { page_unlock(page); - put_page(page); - return X86EMUL_UNHANDLEABLE; } - ctxt->data = &ptwr_ctxt; - rc = x86_emulate(ctxt, &ptwr_emulate_ops); - - page_unlock(page); put_page(page); return rc; |