On 03/25/2015 07:38 PM, Ingo Molnar wrote: > > * Denys Vlasenko <[email protected]> wrote: > >> SYSRET code path has a small irq-off block. >> On this code path, TRACE_IRQS_ON can't be called right before interrupts >> are enabled for real, we can't clobber registers there. >> So current code does it earlier, in a safe place. >> >> But with this, TRACE_IRQS_OFF/ON frames just two fast instructions, >> which is ridiculous: now most of irq-off block is _outside_ of the framing. >> >> Do the same thing that we do on SYSCALL entry: do not track this irq-off >> block, >> it is very small to ever cause noticeable irq latency. >> >> Be careful: make sure that "jnz int_ret_from_sys_call_irqs_off" now does >> invoke TRACE_IRQS_OFF - move int_ret_from_sys_call_irqs_off label before >> TRACE_IRQS_OFF. >> >> Signed-off-by: Denys Vlasenko <[email protected]> >> CC: Linus Torvalds <[email protected]> >> CC: Steven Rostedt <[email protected]> >> CC: Ingo Molnar <[email protected]> >> CC: Borislav Petkov <[email protected]> >> CC: "H. Peter Anvin" <[email protected]> >> CC: Andy Lutomirski <[email protected]> >> CC: Oleg Nesterov <[email protected]> >> CC: Frederic Weisbecker <[email protected]> >> CC: Alexei Starovoitov <[email protected]> >> CC: Will Drewry <[email protected]> >> CC: Kees Cook <[email protected]> >> CC: [email protected] >> CC: [email protected] >> --- >> >> Changes in v2: added comment >> >> arch/x86/kernel/entry_64.S | 13 +++++++------ >> 1 file changed, 7 insertions(+), 6 deletions(-) >> >> diff --git a/arch/x86/kernel/entry_64.S b/arch/x86/kernel/entry_64.S >> index 9c8661c..658cf2e 100644 >> --- a/arch/x86/kernel/entry_64.S >> +++ b/arch/x86/kernel/entry_64.S >> @@ -269,8 +269,11 @@ system_call_fastpath: >> * Has incompletely filled pt_regs. >> */ >> LOCKDEP_SYS_EXIT >> + /* >> + * We do not frame this tiny irq-off block with TRACE_IRQS_OFF/ON, >> + * it is too small to ever cause noticeable irq latency. > > * ... but if we enter the slowpath from here, we'll execute a > * proper TRACE_IRQS_OFF call. > >> @@ -298,6 +298,7 @@ system_call_fastpath: >> * 64bit SYSRET restores rip from rcx, >> * rflags from r11 (but RF and VM bits are forced to 0), >> * cs and ss are loaded from MSRs. >> + * Restoration of rflags re-enables interrupts. >> */ >> USERGS_SYSRET64 > > Is that true even if user-space disabled irqs (via CLI) and executed a > syscall while having irqs off?
sysret restore "interrupt enable" state as it was before syscall. Userspace normally can't disable interrupts. Therefore usually sysret will enable interrupts because they were enabled before syscall. Userspace (root) can disable interrupts after it executed sys_iopl(3). Then CLI starts working. In this case, sysret won't enable interrupts. This is a very untypical use case. -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/

