Messages in this thread | | | Date | Sat, 7 Mar 2015 12:11:51 -0800 | Subject | Re: [PATCH 1/1] x86/fpu: math_state_restore() should not blindly disable irqs | From | Linus Torvalds <> |
| |
On Sat, Mar 7, 2015 at 2:36 AM, Ingo Molnar <mingo@kernel.org> wrote: > > We could save the same 10 cycles from page fault overhead as well, > AFAICS.
Are trap gates actually noticeably faster? Or is it just he "conditional_sti()" you're worried about?
Anyway, for page faulting, we traditionally actually wanted an interrupt gate, because of how we wanted to avoid interrupts coming in and possibly messing up %cr2 due to vmalloc faults, but more importantly for preemption. vmalloc faults are "harmless" because we'll notice that it's already done, return, and then re-take the real fault. But a preemption event before we read %cr2 can cause bad things to happen:
- page fault pushes error code on stack, address in %cr2
- we don't have interrupts disabled, and some interrupt comes in and causes preemption
- some other process runs, take another page fault. %cr2 now is the wrong address
- we go back to the original thread (perhaps on another cpu), which now reads %cr2 for the wrong address
- we send the process a SIGSEGV because we think it's accessing memory that it has no place touching
So the page fault code actually *needs* interrupts disabled until we read %cr2. Stupid x86 trap semantics where the error code is on the thread-safe stack, but %cr2 is not.
Maybe there is some trick I'm missing, but on the whole I think "interrupt gate + conditional_sti()" does have things going for it. Yes, it still leaves NMI as being special, but NMI really *is* special.
Linus
| |