[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v3 17/24] x86/pv: Avoid raising faults behind the emulators back
On 01/12/16 12:57, Jan Beulich wrote: >>>> On 30.11.16 at 14:50, <andrew.cooper3@xxxxxxxxxx> wrote: >> @@ -5379,30 +5380,41 @@ int ptwr_do_page_fault(struct vcpu *v, unsigned long >> addr, >> page_unlock(page); >> put_page(page); >> >> - /* >> - * The previous lack of inject_{sw,hw}*() hooks caused exceptions raised >> - * by the emulator itself to become X86EMUL_UNHANDLEABLE. Such >> exceptions >> - * now set event_pending instead. Exceptions raised behind the back of >> - * the emulator don't yet set event_pending. >> - * >> - * For now, cause such cases to return to the X86EMUL_UNHANDLEABLE path, >> - * for no functional change from before. Future patches will fix this >> - * properly. >> - */ >> - if ( rc == X86EMUL_EXCEPTION && ptwr_ctxt.ctxt.event_pending ) >> - rc = X86EMUL_UNHANDLEABLE; >> + /* More strict than x86_emulate_wrapper(), as this is now true for PV. >> */ >> + ASSERT(ptwr_ctxt.ctxt.event_pending == (rc == X86EMUL_EXCEPTION)); >> >> - if ( rc == X86EMUL_UNHANDLEABLE ) >> - goto bail; >> + switch ( rc ) >> + { >> + case X86EMUL_EXCEPTION: >> + /* >> + * This emulation only covers writes to pagetables which marked > It looks to me as if either the "which" wants to be dropped, or "are" / > "have been" be inserted after it. I meant "which are". > >> + * read-only by Xen. We tolerate #PF (from hitting an adjacent >> page). > Why "adjacent"? Aiui the only legitimate #PF here can be from a > page having got paged out by the guest by the time here, and that > could be either the page table page itself, or the page(s) holding > the instruction (which normally aren't adjacent at all). This is less clear-cut than the subsequent case, as non-aligned accesses are disallowed, so simply misaligning a write across the page boundary won't result in the emulator raising #PF. One issue I have decided to defer is the behaviour of UNHANDLEABLE in this case. If the #PF we are servicing is caused by a misaligned write to a l1e, instead of explicitly re-injecting #PF, we let the logic continue searching for all other cases which may have caused a #PF. It would be better to explicitly disallow the access by re-raising #PF than returning UNHANDLEABLE, as it skips the rest of the pagefault handler. > >> + * Anything else is an emulation bug, or a guest playing with the >> + * instruction stream under Xen's feet. >> + */ >> + if ( ptwr_ctxt.ctxt.event.type == X86_EVENTTYPE_HW_EXCEPTION && >> + ptwr_ctxt.ctxt.event.vector == TRAP_page_fault ) >> + pv_inject_event(&ptwr_ctxt.ctxt.event); >> + else >> + gdprintk(XENLOG_WARNING, >> + "Unexpected event (type %u, vector %#x) from >> emulation\n", >> + ptwr_ctxt.ctxt.event.type, >> ptwr_ctxt.ctxt.event.vector); >> + >> + /* Fallthrough */ >> + case X86EMUL_OKAY: >> >> - if ( ptwr_ctxt.ctxt.retire.singlestep ) >> - pv_inject_hw_exception(TRAP_debug, X86_EVENT_NO_EC); >> + if ( ptwr_ctxt.ctxt.retire.singlestep ) >> + pv_inject_hw_exception(TRAP_debug, X86_EVENT_NO_EC); >> >> - perfc_incr(ptwr_emulations); >> - return EXCRET_fault_fixed; >> + /* Fallthrough */ >> + case X86EMUL_RETRY: >> + perfc_incr(ptwr_emulations); >> + return EXCRET_fault_fixed; >> >> bail: >> - return 0; >> + default: >> + return 0; >> + } >> } > I think omitting the default label would not only make the patch > slightly smaller, but also result in the bail label look less misplaced. The default label is needed to cover the UNHANDLEABLE case. ~Andrew > > With at least the comment aspect above taken care of, > Reviewed-by: Jan Beulich <jbeulich@xxxxxxxx> > > Jan > _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |