[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 at 14:12, <andrew.cooper3@xxxxxxxxxx> wrote: > 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 >>> + * 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. I don't understand - what does this have to do with possibly getting #PF from fetching the insn? > 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. At the point of the check we don't know yet whether we're dealing with a page table, so we need to give other handlers a chance. >>> + * 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. Certainly not - it can just fall out of the switch statement, reaching the pre-existing "bail" label. I could see your point if rc was of an enum type ... Jan _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |