• Andy Lutomirski's avatar
    x86/entry/64: Fix irqflag tracing wrt context tracking · f1075053
    Andy Lutomirski authored
    Paolo pointed out that enter_from_user_mode could be called
    while irqflags were traced as though IRQs were on.
    
    In principle, this could confuse lockdep.  It doesn't cause any
    problems that I've seen in any configuration, but if I build
    with CONFIG_DEBUG_LOCKDEP=y, enable a nohz_full CPU, and add
    code like:
    
    	if (irqs_disabled()) {
    		spin_lock(&something);
    		spin_unlock(&something);
    	}
    
    to the top of enter_from_user_mode, then lockdep will complain
    without this fix.  It seems that lockdep's irqflags sanity
    checks are too weak to detect this bug without forcing the
    issue.
    
    This patch adds one byte to normal kernels, and it's IMO a bit
    ugly. I haven't spotted a better way to do this yet, though.
    The issue is that we can't do TRACE_IRQS_OFF until after SWAPGS
    (if needed), but we're also supposed to do it before calling C
    code.
    
    An alternative approach would be to call trace_hardirqs_off in
    enter_from_user_mode.  That would be less code and would not
    bloat normal kernels at all, but it would be harder to see how
    the code worked.
    Signed-off-by: default avatarAndy Lutomirski <luto@kernel.org>
    Reviewed-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Cc: Andy Lutomirski <luto@amacapital.net>
    Cc: Borislav Petkov <bp@alien8.de>
    Cc: Brian Gerst <brgerst@gmail.com>
    Cc: Denys Vlasenko <dvlasenk@redhat.com>
    Cc: Frederic Weisbecker <fweisbec@gmail.com>
    Cc: H. Peter Anvin <hpa@zytor.com>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Link: http://lkml.kernel.org/r/86237e362390dfa6fec12de4d75a238acb0ae787.1447361906.git.luto@kernel.orgSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
    f1075053
entry_64.S 41.5 KB